Mercurial > hg > aim92
diff stitch/wrap.h @ 0:5242703e91d3 tip
Initial checkin for AIM92 aimR8.2 (last updated May 1997).
author | tomwalters |
---|---|
date | Fri, 20 May 2011 15:19:45 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/stitch/wrap.h Fri May 20 15:19:45 2011 +0100 @@ -0,0 +1,65 @@ +/* + wrap.h + ====== + + wrap alocations with debugging information for program verifiaction. + +*/ + +/* + The following routines "wrap" memory with a frame as it is allocated. + The information in the frame is sufficient to check if the bounds of + the alloacation have been exceeded. Part of the frame is used as a + pointer for a linked list which is also assembled containing all + allocated memory chunks. This enables a call at any time to the + routine "checkWrapping()" to examine all the frames of all memory + allocations for corruption while an application runs. + + + Memory map of a framed allocation after "wrapping" + + +--------------+ + head--> | struct _head | + +--------------+ + wrapped--> | user data | + | . | + | . | + | . | + | | + +--------------+ + tail--> | struct _tail | + +--------------+ + + + On allocation the pointer returned from tyhe system becomes the + pointer to in instance of the stucture "_head". A tail structure is + then constructed containing a repeat of the size feild of the header + for consistency checking and a pointer to the previous allocation's + frame. The user receives a pointer to the memory bytes availiable + after the head structure and is therefore unaware of the wrapping + process. On deallocation or reallocation the framed memory is simply + unwrapped by the reverse process checking for corruption before being + passed to the system memory allocation routines. + +*/ + +/* bits rounded up in alligning the tail structure */ + +#define BITS_ROUND 4 + +/* rounds up byte size specification to ensure tail structure's elements are aligned */ + +#define ROUNDUP( _size ) ( ( _size ) + ( 1 << BITS_ROUND ) - 1 >> BITS_ROUND << BITS_ROUND ) + +/* Calculates the size required for the wrapped allocation including frame. */ + +#define WRAPPED_SIZE( _size ) ( ROUNDUP( sizeof ( struct _head ) ) + ROUNDUP( _size ) + sizeof( struct _tail ) ) + + +struct _head { char *where ; struct _head **pointing, *previous ; unsigned size ; } ; +struct _tail { unsigned size ; } ; + +extern Pointer wrap( /* char *mem, unsigned size, char where[] */ ) ; +extern char *unwrap( /* Pointer mem, unsigned size */ ) ; + +