24 See \fB\\$1\fP for details.
27 See \fB\\$1\fP in \fB\\$2\fP for details.
31 pool_alloc, pool_free, pool_free_old, pool_talloc, pool_tfree, pool_create, pool_destroy, pool_boundary
32 \- Allocate and free memory in managed allocation pools.
34 .B #include "pool_alloc.h"
36 \fBstruct alloc_pool *pool_create(size_t \fIsize\fB, size_t \fIquantum\fB, void (*\fIbomb\fB)(char*,char*,int), int \fIflags\fB);
38 \fBvoid pool_destroy(struct alloc_pool *\fIpool\fB);
40 \fBvoid *pool_alloc(struct alloc_pool *\fIpool\fB, size_t \fIsize\fB, char *\fImsg\fB);
42 \fBvoid pool_free(struct alloc_pool *\fIpool\fB, size_t \fIsize\fB, void *\fIaddr\fB);
44 \fBvoid pool_free_old(struct alloc_pool *\fIpool\fB, void *\fIaddr\fB);
46 \fBvoid *pool_talloc(struct alloc_pool *\fIpool\fB, \fItype\fB), int \fIcount\fB, char *\fImsg\fB);
48 \fBvoid pool_tfree(struct alloc_pool *\fIpool\fB, \fItype\fB, int \fIcount\fB, void *\fIaddr\fB);
50 \fBvoid pool_boundary(struct alloc_pool *\fIpool\fB, sise_t \fIsize\fB);
53 The pool allocation routines use
55 for underlying memory management.
56 What allocation pools do is cause memory within a given pool
57 to be allocated in large contiguous blocks
58 (called extents) that will be reusable when freed. Unlike
60 the allocations are not managed individually.
61 Instead, each extent tracks the total free memory within the
62 extent. Each extent can either be used to allocate memory
63 or to manage the freeing of memory within that extent.
64 When an extent has less free memory than a given
65 allocation request, the current extent ceases to be used
66 for allocation. See also the
70 This form of memory management is suited to large numbers of small
71 related allocations that are held for a while
72 and then freed as a group.
74 underlying allocations are done in large contiguous extents,
75 when an extent is freed, it can release a large enough
76 contiguous block of memory to allow the memory to be returned
77 to the OS for use by whatever program needs it.
78 You can allocate from one or more memory pools and/or
80 all at the same time without interfering with how pools work.
83 Creates an allocation pool for subsequent calls to the pool
85 When an extent is created for allocations it will be
88 Allocations from the pool have their sizes rounded up to a
96 will produce a quantum that should meet maximal alignment
102 allocations will be aligned to addresses that are a
107 may be specified for the
109 function pointer if it is not needed. (See the
111 function for how it is used.)
116 all allocations from the pool will be initialized to zeros.
123 each extent's data structure will be allocated at the start of the
125 buffer (rather than as a separate, non-pool allocation), with the
128 to hold the structure, and the latter subtracting the structure's
129 length from the indicated
133 destroys an allocation
135 and frees all its associated memory.
140 bytes from the specified
147 bytes will be allocated.
148 If the pool has been created without
150 every chunk of memory that is returned will be suitably aligned.
151 You can use this with the default
153 size to ensure that all memory can store a variable of any type.
154 If the requested memory cannot be allocated, the
156 function will be called with
158 as its sole argument (if the function was defined at the time
159 the pool was created), and then a
161 address is returned (assuming that the bomb function didn't exit).
166 bytes pointed to by an
168 that was previously allocated in the specified
176 The memory freed within an extent will not be reusable until
177 all of the memory in that extent has been freed with one
178 exception: the most recent pool allocation may be freed back
179 into the pool prior to making any further allocations.
180 If enough free calls are made to indicate that an extent has no
181 remaining allocated objects (as computed by the total freed size for
182 an extent), its memory will be completely freed back to the system.
187 no memory will be freed, but subsequent allocations will come
193 value that was returned by
195 and frees up any extents in the
197 that have data allocated from that point backward in time.
198 NOTE: you must NOT mix calls to both
205 asks for a boundary value that can be sent to
207 at a later time to free up all memory allocated prior to a particular
209 If the extent that holds the boundary point has allocations from after the
210 boundary point, it will not be freed until a future
212 call encompasses the entirety of the extent's data.
215 is non-zero, the call will also check if the active extent has at least
216 that much free memory available in it, and if not, it will mark the
217 extent as inactive, forcing a new extent to be used for future allocations.
218 (You can specify -1 for
220 if you want to force a new extent to start.)
223 is a macro that takes a
229 It casts the return value to the correct pointer type.
232 is a macro that calls
234 on memory that was allocated by
239 .BR "struct alloc_pool" .
244 return pointers to the allocated memory,
245 or NULL if the request fails.
248 will normally require casting to the desired type but
250 will returns a pointer of the requested
254 returns a pointer that should only be used in a call to
255 .BR pool_free_old() .
258 .BR pool_free_old() ,
267 pool_alloc was created by J.W. Schultz of Pegasystems Technologies.