diff options
| author | rsc <devnull@localhost> | 2005-01-03 06:41:38 +0000 |
|---|---|---|
| committer | rsc <devnull@localhost> | 2005-01-03 06:41:38 +0000 |
| commit | a19c44b83b96fefad131ef324c3eb2916e8c604c (patch) | |
| tree | 9fee0b867751c0b9fe63a2763067c2e37403a866 /man/man3/pool.3 | |
| parent | 058b0118a52061ad57694c01fc8763b22b789c4d (diff) | |
| download | plan9port-a19c44b83b96fefad131ef324c3eb2916e8c604c.tar.gz plan9port-a19c44b83b96fefad131ef324c3eb2916e8c604c.zip | |
Add mkfile to keep indices up to date.
Remove man pages for things we don't provide.
Diffstat (limited to 'man/man3/pool.3')
| -rw-r--r-- | man/man3/pool.3 | 329 |
1 files changed, 0 insertions, 329 deletions
diff --git a/man/man3/pool.3 b/man/man3/pool.3 deleted file mode 100644 index 12be5792..00000000 --- a/man/man3/pool.3 +++ /dev/null @@ -1,329 +0,0 @@ -.TH POOL 3 -.SH NAME -poolalloc, poolfree, poolmsize, poolrealloc, poolcompact, poolcheck, poolblockcheck, -pooldump \- general memory management routines -.SH SYNOPSIS -.B #include <u.h> -.PP -.B #include <libc.h> -.PP -.B #include <pool.h> -.PP -.B -void* poolalloc(Pool* pool, ulong size) -.PP -.B -void poolfree(Pool* pool, void* ptr) -.PP -.B -ulong poolmsize(Pool* pool, void* ptr) -.PP -.B -void* poolrealloc(Pool* pool, void* ptr, ulong size) -.PP -.B -void poolcompact(Pool* pool) -.PP -.B -void poolcheck(Pool *pool) -.PP -.B -void poolblockcheck(Pool *pool, void *ptr) -.PP -.B -void pooldump(Pool *pool); -.SH DESCRIPTION -These routines provide a general memory management facility. -Memory is retrieved from a coarser allocator (e.g. -.I sbrk -or the kernel's -.IR xalloc ) -and then allocated to callers. -The routines are locked and thus may safely be used in -multiprocess programs. -.PP -.I Poolalloc -attempts to allocate a block of size -.BR size ; -it returns a pointer to the block when successful and nil otherwise. -The call -.B "poolalloc(0) -returns a non-nil pointer. -.I Poolfree -returns an allocated block to the pool. -It is an error to free a block more than once or to free a -pointer not returned by -.IR poolalloc . -The call -.B "poolfree(nil) -is legal and is a no-op. -.I Poolrealloc -attempts to resize to -.B nsize -bytes the block associated with -.BR ptr , -which must have been previously returned by -.I poolalloc -or -.IR poolrealloc . -If the block's size can be adjusted, a (possibly different) pointer to the new block is returned. -The contents up to the lesser of the old and new sizes are unchanged. -After a successful call to -.IR poolrealloc , -the return value should be used rather than -.B ptr -to access the block. -If the request cannot be satisfied, -.I poolrealloc -returns nil, and the old pointer remains valid. -.PP -When blocks are allocated, there is often some extra space left at the end -that would usually go unused. -.IR Poolmsize -grows the block to encompass this extra space and returns the new size. -.PP -The -.I poolblockcheck -and -.I poolcheck -routines validate a single allocated block or the entire pool, respectively. -They call -.B panic -(see below) -if corruption is detected. -.I Pooldump -prints a summary line for every block in the -pool, using the -.B print -function (see below). -.PP -The -.B Pool -structure itself provides much of the setup interface. -.IP -.EX -.ta \w'\fL 'u +\w'\fLulong 'u +\w'\fLlastcompact; 'u -typedef struct Pool Pool; -struct Pool { - char* name; - ulong maxsize; /* of entire Pool */ - ulong cursize; /* of Pool */ - ulong curfree; /* total free bytes in Pool */ - ulong curalloc; /* total allocated bytes in Pool */ - ulong minarena; /* smallest size of new arena */ - ulong quantum; /* allocated blocks should be multiple of */ - ulong minblock; /* smallest newly allocated block */ - int flags; - int nfree; /* number of calls to free */ - int lastcompact; /* nfree at time of last poolcompact */ - void* (*alloc)(ulong); - int (*merge)(void*, void*); - void (*move)(void* from, void* to); - void (*lock)(Pool*); - void (*unlock)(Pool*); - void (*print)(Pool*, char*, ...); - void (*panic)(Pool*, char*, ...); - void (*logstack)(Pool*); - void* private; -}; -.ta \w'\fL 'u +\w'POOL_ANTAGONISM 'u -enum { /* flags */ - POOL_ANTAGONISM = 1<<0, - POOL_PARANOIA = 1<<1, - POOL_VERBOSITY = 1<<2, - POOL_DEBUGGING = 1<<3, - POOL_LOGGING = 1<<4, - POOL_TOLERANCE = 1<<5, - POOL_NOREUSE = 1<<6, -}; -.EE -.PP -The pool obtains arenas of memory to manage by calling the the given -.B alloc -routine. -The total number of requested bytes will not exceed -.BR maxsize . -Each allocation request will be for at least -.B minarena -bytes. -.PP -When a new arena is allocated, the pool routines try to -merge it with the surrounding arenas, in an attempt to combat fragmentation. -If -.B merge -is non-nil, it is called with the addresses of two blocks from -.B alloc -that the pool routines suspect might be adjacent. -If they are not mergeable, -.B merge -must return zero. -If they are mergeable, -.B merge -should merge them into one block in its own bookkeeping -and return non-zero. -.PP -To ease fragmentation and make -block reuse easier, the sizes requested of the pool routines are rounded up to a multiple of -.B quantum -before -the carrying out requests. -If, after rounding, the block size is still less than -.B minblock -bytes, -.B minblock -will be used as the block size. -.PP -.I Poolcompact -defragments the pool, moving blocks in order to aggregate -the free space. -Each time it moves a block, it notifies the -.B move -routine that the contents have moved. -At the time that -.B move -is called, the contents have already moved, -so -.B from -should never be dereferenced. -If no -.B move -routine is supplied (i.e. it is nil), then calling -.I poolcompact -is a no-op. -.PP -When the pool routines need to allocate a new arena but cannot, -either because -.B alloc -has returned nil or because doing so would use more than -.B maxsize -bytes, -.I poolcompact -is called once to defragment the memory -and the request is retried. -.PP -.I Pools -are protected by the pool routines calling -.B lock -(when non-nil) -before modifying the pool, and -calling -.B unlock -when finished. -.PP -When internal corruption is detected, -.B panic -is called with a -.IR print (3) -style argument that specifies what happened. -It is assumed that -.B panic -never returns. -When the pool routines wish to convey a message -to the caller (usually because logging is turned on; see below), -.B print -is called, also with a -.IR print (3) -style argument. -.PP -.B Flags -is a bit vector that tweaks the behavior of the pool routines -in various ways. -Most are useful for debugging in one way or another. -When -.B POOL_ANTAGONISM -is set, -.I poolalloc -fills blocks with non-zero garbage before releasing them to the user, -and -.I poolfree -fills the blocks on receipt. -This tickles both user programs and the innards of the allocator. -Specifically, each 32-bit word of the memory is marked with a pointer value exclusive-or'ed -with a constant. -The pointer value is the pointer to the beginning of the allocated block -and the constant varies in order to distinguish different markings. -Freed blocks use the constant -.BR 0xF7000000 , -newly allocated blocks -.BR 0xF9000000 , -and newly created unallocated blocks -.BR 0xF1000000 . -For example, if -.B POOL_ANTAGONISM -is set and -.I poolalloc -returns a block starting at -.BR 0x00012345 , -each word of the block will contain the value -.BR 0xF90012345 . -Recognizing these numbers in memory-related crashes can -help diagnose things like double-frees or dangling pointers. -.PP -Setting -.B POOL_PARANOIA -causes the allocator to walk the entire pool whenever locking or unlocking itself, -looking for corruption. -This slows runtime by a few orders of magnitude -when many blocks are in use. -If -.B POOL_VERBOSITY -is set, -the entire pool structure is printed -(via -.BR print ) -each time the pool is locked or unlocked. -.B POOL_DEBUGGING -enables internal -debugging output, -whose format is unspecified and volatile. -It should not be used by most programs. -When -.B POOL_LOGGING -is set, a single line is printed via -.B print -at the beginning and end of each pool call. -If -.B logstack -is not nil, -it will be called as well. -This provides a mechanism for external programs to search for leaks. -(See -.IR leak (1) -for one such program.) -.PP -The pool routines are strict about the amount of space callers use. -If even a single byte is written past the end of the allotted space of a block, they -will notice when that block is next used in a call to -.I poolrealloc -or -.I free -(or at the next entry into the allocator, when -.B POOL_PARANOIA -is set), -and -.B panic -will be called. -Since forgetting to allocate space for the -terminating NUL on strings is such a common error, -if -.B POOL_TOLERANCE -is set and a single NUL is found written past the end of a block, -.B print -will be called with a notification, but -.B panic -will not be. -.PP -When -.B POOL_NOREUSE -is set, -.B poolfree -fills the passed block with garbage rather than -return it to the free pool. -.SH SOURCE -.B /usr/local/plan9/src/libc/port/pool.c -.SH SEE ALSO -.IR malloc (3), -.IR brk (3) -.PP -.B /usr/local/plan9/src/libc/port/malloc.c -is a complete example. |
