00001 /* 00002 Default header file for malloc-2.8.x, written by Doug Lea 00003 and released to the public domain, as explained at 00004 http://creativecommons.org/licenses/publicdomain. 00005 00006 last update: Mon Aug 15 08:55:52 2005 Doug Lea (dl at gee) 00007 00008 This header is for ANSI C/C++ only. You can set any of 00009 the following #defines before including: 00010 00011 * If USE_DL_PREFIX is defined, it is assumed that malloc.c 00012 was also compiled with this option, so all routines 00013 have names starting with "dl". 00014 00015 * If HAVE_USR_INCLUDE_MALLOC_H is defined, it is assumed that this 00016 file will be #included AFTER <malloc.h>. This is needed only if 00017 your system defines a struct mallinfo that is incompatible with the 00018 standard one declared here. Otherwise, you can include this file 00019 INSTEAD of your system system <malloc.h>. At least on ANSI, all 00020 declarations should be compatible with system versions 00021 00022 * If MSPACES is defined, declarations for mspace versions are included. 00023 */ 00024 00025 #ifndef MALLOC_280_H 00026 #define MALLOC_280_H 00027 00028 #ifdef __cplusplus 00029 extern "C" { 00030 #endif 00031 00032 #include <stddef.h> /* for size_t */ 00033 00034 #if !ONLY_MSPACES 00035 00036 #ifndef USE_DL_PREFIX 00037 #define dlcalloc calloc 00038 #define dlfree free 00039 #define dlmalloc malloc 00040 #define dlmemalign memalign 00041 #define dlrealloc realloc 00042 #define dlvalloc valloc 00043 #define dlpvalloc pvalloc 00044 #define dlmallinfo mallinfo 00045 #define dlmallopt mallopt 00046 #define dlmalloc_trim malloc_trim 00047 #define dlmalloc_stats malloc_stats 00048 #define dlmalloc_usable_size malloc_usable_size 00049 #define dlmalloc_footprint malloc_footprint 00050 #define dlmalloc_max_footprint malloc_max_footprint 00051 #define dlindependent_calloc independent_calloc 00052 #define dlindependent_comalloc independent_comalloc 00053 #endif /* USE_DL_PREFIX */ 00054 00055 00056 /* 00057 malloc(size_t n) 00058 Returns a pointer to a newly allocated chunk of at least n bytes, or 00059 null if no space is available, in which case errno is set to ENOMEM 00060 on ANSI C systems. 00061 00062 If n is zero, malloc returns a minimum-sized chunk. (The minimum 00063 size is 16 bytes on most 32bit systems, and 32 bytes on 64bit 00064 systems.) Note that size_t is an unsigned type, so calls with 00065 arguments that would be negative if signed are interpreted as 00066 requests for huge amounts of space, which will often fail. The 00067 maximum supported value of n differs across systems, but is in all 00068 cases less than the maximum representable value of a size_t. 00069 */ 00070 void* dlmalloc(size_t); 00071 00072 /* 00073 free(void* p) 00074 Releases the chunk of memory pointed to by p, that had been previously 00075 allocated using malloc or a related routine such as realloc. 00076 It has no effect if p is null. If p was not malloced or already 00077 freed, free(p) will by default cuase the current program to abort. 00078 */ 00079 void dlfree(void*); 00080 00081 /* 00082 calloc(size_t n_elements, size_t element_size); 00083 Returns a pointer to n_elements * element_size bytes, with all locations 00084 set to zero. 00085 */ 00086 void* dlcalloc(size_t, size_t); 00087 00088 /* 00089 realloc(void* p, size_t n) 00090 Returns a pointer to a chunk of size n that contains the same data 00091 as does chunk p up to the minimum of (n, p's size) bytes, or null 00092 if no space is available. 00093 00094 The returned pointer may or may not be the same as p. The algorithm 00095 prefers extending p in most cases when possible, otherwise it 00096 employs the equivalent of a malloc-copy-free sequence. 00097 00098 If p is null, realloc is equivalent to malloc. 00099 00100 If space is not available, realloc returns null, errno is set (if on 00101 ANSI) and p is NOT freed. 00102 00103 if n is for fewer bytes than already held by p, the newly unused 00104 space is lopped off and freed if possible. realloc with a size 00105 argument of zero (re)allocates a minimum-sized chunk. 00106 00107 The old unix realloc convention of allowing the last-free'd chunk 00108 to be used as an argument to realloc is not supported. 00109 */ 00110 00111 void* dlrealloc(void*, size_t); 00112 00113 /* 00114 memalign(size_t alignment, size_t n); 00115 Returns a pointer to a newly allocated chunk of n bytes, aligned 00116 in accord with the alignment argument. 00117 00118 The alignment argument should be a power of two. If the argument is 00119 not a power of two, the nearest greater power is used. 00120 8-byte alignment is guaranteed by normal malloc calls, so don't 00121 bother calling memalign with an argument of 8 or less. 00122 00123 Overreliance on memalign is a sure way to fragment space. 00124 */ 00125 void* dlmemalign(size_t, size_t); 00126 00127 /* 00128 valloc(size_t n); 00129 Equivalent to memalign(pagesize, n), where pagesize is the page 00130 size of the system. If the pagesize is unknown, 4096 is used. 00131 */ 00132 void* dlvalloc(size_t); 00133 00134 /* 00135 mallopt(int parameter_number, int parameter_value) 00136 Sets tunable parameters The format is to provide a 00137 (parameter-number, parameter-value) pair. mallopt then sets the 00138 corresponding parameter to the argument value if it can (i.e., so 00139 long as the value is meaningful), and returns 1 if successful else 00140 0. SVID/XPG/ANSI defines four standard param numbers for mallopt, 00141 normally defined in malloc.h. None of these are use in this malloc, 00142 so setting them has no effect. But this malloc also supports other 00143 options in mallopt: 00144 00145 Symbol param # default allowed param values 00146 M_TRIM_THRESHOLD -1 2*1024*1024 any (-1U disables trimming) 00147 M_GRANULARITY -2 page size any power of 2 >= page size 00148 M_MMAP_THRESHOLD -3 256*1024 any (or 0 if no MMAP support) 00149 */ 00150 int dlmallopt(int, int); 00151 00152 #define M_TRIM_THRESHOLD (-1) 00153 #define M_GRANULARITY (-2) 00154 #define M_MMAP_THRESHOLD (-3) 00155 00156 00157 /* 00158 malloc_footprint(); 00159 Returns the number of bytes obtained from the system. The total 00160 number of bytes allocated by malloc, realloc etc., is less than this 00161 value. Unlike mallinfo, this function returns only a precomputed 00162 result, so can be called frequently to monitor memory consumption. 00163 Even if locks are otherwise defined, this function does not use them, 00164 so results might not be up to date. 00165 */ 00166 size_t dlmalloc_footprint(void); 00167 size_t dlmalloc_max_footprint(void); 00168 00169 #if !NO_MALLINFO 00170 /* 00171 mallinfo() 00172 Returns (by copy) a struct containing various summary statistics: 00173 00174 arena: current total non-mmapped bytes allocated from system 00175 ordblks: the number of free chunks 00176 smblks: always zero. 00177 hblks: current number of mmapped regions 00178 hblkhd: total bytes held in mmapped regions 00179 usmblks: the maximum total allocated space. This will be greater 00180 than current total if trimming has occurred. 00181 fsmblks: always zero 00182 uordblks: current total allocated space (normal or mmapped) 00183 fordblks: total free space 00184 keepcost: the maximum number of bytes that could ideally be released 00185 back to system via malloc_trim. ("ideally" means that 00186 it ignores page restrictions etc.) 00187 00188 Because these fields are ints, but internal bookkeeping may 00189 be kept as longs, the reported values may wrap around zero and 00190 thus be inaccurate. 00191 */ 00192 #ifndef HAVE_USR_INCLUDE_MALLOC_H 00193 #ifndef _MALLOC_H 00194 #ifndef MALLINFO_FIELD_TYPE 00195 #define MALLINFO_FIELD_TYPE size_t 00196 #endif /* MALLINFO_FIELD_TYPE */ 00197 struct mallinfo { 00198 MALLINFO_FIELD_TYPE arena; /* non-mmapped space allocated from system */ 00199 MALLINFO_FIELD_TYPE ordblks; /* number of free chunks */ 00200 MALLINFO_FIELD_TYPE smblks; /* always 0 */ 00201 MALLINFO_FIELD_TYPE hblks; /* always 0 */ 00202 MALLINFO_FIELD_TYPE hblkhd; /* space in mmapped regions */ 00203 MALLINFO_FIELD_TYPE usmblks; /* maximum total allocated space */ 00204 MALLINFO_FIELD_TYPE fsmblks; /* always 0 */ 00205 MALLINFO_FIELD_TYPE uordblks; /* total allocated space */ 00206 MALLINFO_FIELD_TYPE fordblks; /* total free space */ 00207 MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */ 00208 }; 00209 #endif /* _MALLOC_H */ 00210 #endif /* HAVE_USR_INCLUDE_MALLOC_H */ 00211 00212 struct mallinfo dlmallinfo(void); 00213 #endif /* NO_MALLINFO */ 00214 00215 /* 00216 independent_calloc(size_t n_elements, size_t element_size, void* chunks[]); 00217 00218 independent_calloc is similar to calloc, but instead of returning a 00219 single cleared space, it returns an array of pointers to n_elements 00220 independent elements that can hold contents of size elem_size, each 00221 of which starts out cleared, and can be independently freed, 00222 realloc'ed etc. The elements are guaranteed to be adjacently 00223 allocated (this is not guaranteed to occur with multiple callocs or 00224 mallocs), which may also improve cache locality in some 00225 applications. 00226 00227 The "chunks" argument is optional (i.e., may be null, which is 00228 probably the most typical usage). If it is null, the returned array 00229 is itself dynamically allocated and should also be freed when it is 00230 no longer needed. Otherwise, the chunks array must be of at least 00231 n_elements in length. It is filled in with the pointers to the 00232 chunks. 00233 00234 In either case, independent_calloc returns this pointer array, or 00235 null if the allocation failed. If n_elements is zero and "chunks" 00236 is null, it returns a chunk representing an array with zero elements 00237 (which should be freed if not wanted). 00238 00239 Each element must be individually freed when it is no longer 00240 needed. If you'd like to instead be able to free all at once, you 00241 should instead use regular calloc and assign pointers into this 00242 space to represent elements. (In this case though, you cannot 00243 independently free elements.) 00244 00245 independent_calloc simplifies and speeds up implementations of many 00246 kinds of pools. It may also be useful when constructing large data 00247 structures that initially have a fixed number of fixed-sized nodes, 00248 but the number is not known at compile time, and some of the nodes 00249 may later need to be freed. For example: 00250 00251 struct Node { int item; struct Node* next; }; 00252 00253 struct Node* build_list() { 00254 struct Node** pool; 00255 int n = read_number_of_nodes_needed(); 00256 if (n <= 0) return 0; 00257 pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0); 00258 if (pool == 0) die(); 00259 // organize into a linked list... 00260 struct Node* first = pool[0]; 00261 for (i = 0; i < n-1; ++i) 00262 pool[i]->next = pool[i+1]; 00263 free(pool); // Can now free the array (or not, if it is needed later) 00264 return first; 00265 } 00266 */ 00267 void** dlindependent_calloc(size_t, size_t, void**); 00268 00269 /* 00270 independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]); 00271 00272 independent_comalloc allocates, all at once, a set of n_elements 00273 chunks with sizes indicated in the "sizes" array. It returns 00274 an array of pointers to these elements, each of which can be 00275 independently freed, realloc'ed etc. The elements are guaranteed to 00276 be adjacently allocated (this is not guaranteed to occur with 00277 multiple callocs or mallocs), which may also improve cache locality 00278 in some applications. 00279 00280 The "chunks" argument is optional (i.e., may be null). If it is null 00281 the returned array is itself dynamically allocated and should also 00282 be freed when it is no longer needed. Otherwise, the chunks array 00283 must be of at least n_elements in length. It is filled in with the 00284 pointers to the chunks. 00285 00286 In either case, independent_comalloc returns this pointer array, or 00287 null if the allocation failed. If n_elements is zero and chunks is 00288 null, it returns a chunk representing an array with zero elements 00289 (which should be freed if not wanted). 00290 00291 Each element must be individually freed when it is no longer 00292 needed. If you'd like to instead be able to free all at once, you 00293 should instead use a single regular malloc, and assign pointers at 00294 particular offsets in the aggregate space. (In this case though, you 00295 cannot independently free elements.) 00296 00297 independent_comallac differs from independent_calloc in that each 00298 element may have a different size, and also that it does not 00299 automatically clear elements. 00300 00301 independent_comalloc can be used to speed up allocation in cases 00302 where several structs or objects must always be allocated at the 00303 same time. For example: 00304 00305 struct Head { ... } 00306 struct Foot { ... } 00307 00308 void send_message(char* msg) { 00309 int msglen = strlen(msg); 00310 size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) }; 00311 void* chunks[3]; 00312 if (independent_comalloc(3, sizes, chunks) == 0) 00313 die(); 00314 struct Head* head = (struct Head*)(chunks[0]); 00315 char* body = (char*)(chunks[1]); 00316 struct Foot* foot = (struct Foot*)(chunks[2]); 00317 // ... 00318 } 00319 00320 In general though, independent_comalloc is worth using only for 00321 larger values of n_elements. For small values, you probably won't 00322 detect enough difference from series of malloc calls to bother. 00323 00324 Overuse of independent_comalloc can increase overall memory usage, 00325 since it cannot reuse existing noncontiguous small chunks that 00326 might be available for some of the elements. 00327 */ 00328 void** dlindependent_comalloc(size_t, size_t*, void**); 00329 00330 00331 /* 00332 pvalloc(size_t n); 00333 Equivalent to valloc(minimum-page-that-holds(n)), that is, 00334 round up n to nearest pagesize. 00335 */ 00336 void* dlpvalloc(size_t); 00337 00338 /* 00339 malloc_trim(size_t pad); 00340 00341 If possible, gives memory back to the system (via negative arguments 00342 to sbrk) if there is unused memory at the `high' end of the malloc 00343 pool or in unused MMAP segments. You can call this after freeing 00344 large blocks of memory to potentially reduce the system-level memory 00345 requirements of a program. However, it cannot guarantee to reduce 00346 memory. Under some allocation patterns, some large free blocks of 00347 memory will be locked between two used chunks, so they cannot be 00348 given back to the system. 00349 00350 The `pad' argument to malloc_trim represents the amount of free 00351 trailing space to leave untrimmed. If this argument is zero, only 00352 the minimum amount of memory to maintain internal data structures 00353 will be left. Non-zero arguments can be supplied to maintain enough 00354 trailing space to service future expected allocations without having 00355 to re-obtain memory from the system. 00356 00357 Malloc_trim returns 1 if it actually released any memory, else 0. 00358 */ 00359 int dlmalloc_trim(size_t); 00360 00361 /* 00362 malloc_usable_size(void* p); 00363 00364 Returns the number of bytes you can actually use in 00365 an allocated chunk, which may be more than you requested (although 00366 often not) due to alignment and minimum size constraints. 00367 You can use this many bytes without worrying about 00368 overwriting other allocated objects. This is not a particularly great 00369 programming practice. malloc_usable_size can be more useful in 00370 debugging and assertions, for example: 00371 00372 p = malloc(n); 00373 assert(malloc_usable_size(p) >= 256); 00374 */ 00375 size_t dlmalloc_usable_size(void*); 00376 00377 /* 00378 malloc_stats(); 00379 Prints on stderr the amount of space obtained from the system (both 00380 via sbrk and mmap), the maximum amount (which may be more than 00381 current if malloc_trim and/or munmap got called), and the current 00382 number of bytes allocated via malloc (or realloc, etc) but not yet 00383 freed. Note that this is the number of bytes allocated, not the 00384 number requested. It will be larger than the number requested 00385 because of alignment and bookkeeping overhead. Because it includes 00386 alignment wastage as being in use, this figure may be greater than 00387 zero even when no user-level chunks are allocated. 00388 00389 The reported current and maximum system memory can be inaccurate if 00390 a program makes other calls to system memory allocation functions 00391 (normally sbrk) outside of malloc. 00392 00393 malloc_stats prints only the most commonly interesting statistics. 00394 More information can be obtained by calling mallinfo. 00395 */ 00396 void dlmalloc_stats(void); 00397 00398 #endif /* !ONLY_MSPACES */ 00399 00400 #if MSPACES 00401 00402 /* 00403 mspace is an opaque type representing an independent 00404 region of space that supports mspace_malloc, etc. 00405 */ 00406 typedef void* mspace; 00407 00408 /* 00409 create_mspace creates and returns a new independent space with the 00410 given initial capacity, or, if 0, the default granularity size. It 00411 returns null if there is no system memory available to create the 00412 space. If argument locked is non-zero, the space uses a separate 00413 lock to control access. The capacity of the space will grow 00414 dynamically as needed to service mspace_malloc requests. You can 00415 control the sizes of incremental increases of this space by 00416 compiling with a different DEFAULT_GRANULARITY or dynamically 00417 setting with mallopt(M_GRANULARITY, value). 00418 */ 00419 mspace create_mspace(size_t capacity, int locked); 00420 00421 /* 00422 destroy_mspace destroys the given space, and attempts to return all 00423 of its memory back to the system, returning the total number of 00424 bytes freed. After destruction, the results of access to all memory 00425 used by the space become undefined. 00426 */ 00427 size_t destroy_mspace(mspace msp); 00428 00429 /* 00430 create_mspace_with_base uses the memory supplied as the initial base 00431 of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this 00432 space is used for bookkeeping, so the capacity must be at least this 00433 large. (Otherwise 0 is returned.) When this initial space is 00434 exhausted, additional memory will be obtained from the system. 00435 Destroying this space will deallocate all additionally allocated 00436 space (if possible) but not the initial base. 00437 */ 00438 mspace create_mspace_with_base(void* base, size_t capacity, int locked); 00439 00440 /* 00441 mspace_malloc behaves as malloc, but operates within 00442 the given space. 00443 */ 00444 void* mspace_malloc(mspace msp, size_t bytes); 00445 00446 /* 00447 mspace_free behaves as free, but operates within 00448 the given space. 00449 00450 If compiled with FOOTERS==1, mspace_free is not actually needed. 00451 free may be called instead of mspace_free because freed chunks from 00452 any space are handled by their originating spaces. 00453 */ 00454 void mspace_free(mspace msp, void* mem); 00455 00456 /* 00457 mspace_realloc behaves as realloc, but operates within 00458 the given space. 00459 00460 If compiled with FOOTERS==1, mspace_realloc is not actually 00461 needed. realloc may be called instead of mspace_realloc because 00462 realloced chunks from any space are handled by their originating 00463 spaces. 00464 */ 00465 void* mspace_realloc(mspace msp, void* mem, size_t newsize); 00466 00467 /* 00468 mspace_calloc behaves as calloc, but operates within 00469 the given space. 00470 */ 00471 void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size); 00472 00473 /* 00474 mspace_memalign behaves as memalign, but operates within 00475 the given space. 00476 */ 00477 void* mspace_memalign(mspace msp, size_t alignment, size_t bytes); 00478 00479 /* 00480 mspace_independent_calloc behaves as independent_calloc, but 00481 operates within the given space. 00482 */ 00483 void** mspace_independent_calloc(mspace msp, size_t n_elements, 00484 size_t elem_size, void* chunks[]); 00485 00486 /* 00487 mspace_independent_comalloc behaves as independent_comalloc, but 00488 operates within the given space. 00489 */ 00490 void** mspace_independent_comalloc(mspace msp, size_t n_elements, 00491 size_t sizes[], void* chunks[]); 00492 00493 /* 00494 mspace_footprint() returns the number of bytes obtained from the 00495 system for this space. 00496 */ 00497 size_t mspace_footprint(mspace msp); 00498 00499 00500 #if !NO_MALLINFO 00501 /* 00502 mspace_mallinfo behaves as mallinfo, but reports properties of 00503 the given space. 00504 */ 00505 struct mallinfo mspace_mallinfo(mspace msp); 00506 #endif /* NO_MALLINFO */ 00507 00508 /* 00509 mspace_malloc_stats behaves as malloc_stats, but reports 00510 properties of the given space. 00511 */ 00512 void mspace_malloc_stats(mspace msp); 00513 00514 /* 00515 mspace_trim behaves as malloc_trim, but 00516 operates within the given space. 00517 */ 00518 int mspace_trim(mspace msp, size_t pad); 00519 00520 /* 00521 An alias for mallopt. 00522 */ 00523 int mspace_mallopt(int, int); 00524 00525 #endif /* MSPACES */ 00526 00527 #ifdef __cplusplus 00528 }; /* end of extern "C" */ 00529 #endif 00530 00531 #endif /* MALLOC_280_H */ 00532 00533