casacore
Loading...
Searching...
No Matches
malloc.h
Go to the documentation of this file.
1// # malloc.h: malloc functions from Doug Lea
2// # Copyright (C) 1996,1999,2001
3// # Associated Universities, Inc. Washington DC, USA.
4// #
5// # This library is free software; you can redistribute it and/or modify it
6// # under the terms of the GNU Library General Public License as published by
7// # the Free Software Foundation; either version 2 of the License, or (at your
8// # option) any later version.
9// #
10// # This library is distributed in the hope that it will be useful, but WITHOUT
11// # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12// # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
13// # License for more details.
14// #
15// # You should have received a copy of the GNU Library General Public License
16// # along with this library; if not, write to the Free Software Foundation,
17// # Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
18// #
19// # Correspondence concerning AIPS++ should be addressed as follows:
20// # Internet email: casa-feedback@nrao.edu.
21// # Postal address: AIPS++ Project Office
22// # National Radio Astronomy Observatory
23// # 520 Edgemont Road
24// # Charlottesville, VA 22903-2475 USA
25
26#if !defined(AIPS_NO_LEA_MALLOC)
27
28#ifndef CASA_MALLOC_H
29#define CASA_MALLOC_H
30
31/*
32 A version of malloc/free/realloc written by Doug Lea and released to the
33 public domain. Send questions/comments/complaints/performance data
34 to dl@cs.oswego.edu
35
36* VERSION 2.6.5 Wed Jun 17 15:55:16 1998 Doug Lea (dl at gee)
37*/
38
39/* The only changes from the distribution are:
40 1. Added Casacore copyright notice and guard.
41 2. Compile to nothing for linux since we already get GNU malloc there.
42 3. If AIPS_DEBUG is set compile this malloc with DEBUG on.
43*/
44
45#if defined(AIPS_LINUX)
46/* IS linux. Include malloc.h so we only have to include casa/OS/malloc.h
47 without an ifdef on OS.
48*/
49#include <malloc.h>
50#else
51/* NOT linux */
52
53#if defined(AIPS_DEBUG)
54/* Hopefully not too expensive. If so we can turn it off. */
55#define DEBUG 1
56#endif
57
58/*
59 Default header file for malloc-2.8.x, written by Doug Lea
60 and released to the public domain, as explained at
61 http://creativecommons.org/licenses/publicdomain.
62
63 last update: Wed May 27 14:25:17 2009 Doug Lea (dl at gee)
64
65 This header is for ANSI C/C++ only. You can set any of
66 the following #defines before including:
67
68 * If USE_DL_PREFIX is defined, it is assumed that malloc.c
69 was also compiled with this option, so all routines
70 have names starting with "dl".
71
72 * If HAVE_USR_INCLUDE_MALLOC_H is defined, it is assumed that this
73 file will be #included AFTER <malloc.h>. This is needed only if
74 your system defines a struct mallinfo that is incompatible with the
75 standard one declared here. Otherwise, you can include this file
76 INSTEAD of your system system <malloc.h>. At least on ANSI, all
77 declarations should be compatible with system versions
78
79 * If MSPACES is defined, declarations for mspace versions are included.
80*/
81
82#ifndef MALLOC_280_H
83#define MALLOC_280_H
84
85#ifdef __cplusplus
86extern "C" {
87#endif
88
89#include <stddef.h> /* for size_t */
90
91#ifndef ONLY_MSPACES
92#define ONLY_MSPACES 0 /* define to a value */
93#endif /* ONLY_MSPACES */
94#ifndef NO_MALLINFO
95#define NO_MALLINFO 0
96#endif /* NO_MALLINFO */
97
98#if !ONLY_MSPACES
99
100#ifndef USE_DL_PREFIX
101#define dlcalloc calloc
102#define dlfree free
103#define dlmalloc malloc
104#define dlmemalign memalign
105#define dlrealloc realloc
106#define dlvalloc valloc
107#define dlpvalloc pvalloc
108#define dlmallinfo mallinfo
109#define dlmallopt mallopt
110#define dlmalloc_trim malloc_trim
111#define dlmalloc_stats malloc_stats
112#define dlmalloc_usable_size malloc_usable_size
113#define dlmalloc_footprint malloc_footprint
114#define dlindependent_calloc independent_calloc
115#define dlindependent_comalloc independent_comalloc
116#endif /* USE_DL_PREFIX */
117#if !NO_MALLINFO
118#ifndef HAVE_USR_INCLUDE_MALLOC_H
119#ifndef _MALLOC_H
120#ifndef MALLINFO_FIELD_TYPE
121#define MALLINFO_FIELD_TYPE size_t
122#endif /* MALLINFO_FIELD_TYPE */
123#ifndef STRUCT_MALLINFO_DECLARED
124#define STRUCT_MALLINFO_DECLARED 1
125struct mallinfo {
126 MALLINFO_FIELD_TYPE arena; /* non-mmapped space allocated from system */
127 MALLINFO_FIELD_TYPE ordblks; /* number of free chunks */
130 MALLINFO_FIELD_TYPE hblkhd; /* space in mmapped regions */
131 MALLINFO_FIELD_TYPE usmblks; /* maximum total allocated space */
133 MALLINFO_FIELD_TYPE uordblks; /* total allocated space */
134 MALLINFO_FIELD_TYPE fordblks; /* total free space */
135 MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */
136};
137#endif /* STRUCT_MALLINFO_DECLARED */
138#endif /* _MALLOC_H */
139#endif /* HAVE_USR_INCLUDE_MALLOC_H */
140#endif /* !NO_MALLINFO */
141
142/*
143 malloc(size_t n)
144 Returns a pointer to a newly allocated chunk of at least n bytes, or
145 null if no space is available, in which case errno is set to ENOMEM
146 on ANSI C systems.
147
148 If n is zero, malloc returns a minimum-sized chunk. (The minimum
149 size is 16 bytes on most 32bit systems, and 32 bytes on 64bit
150 systems.) Note that size_t is an unsigned type, so calls with
151 arguments that would be negative if signed are interpreted as
152 requests for huge amounts of space, which will often fail. The
153 maximum supported value of n differs across systems, but is in all
154 cases less than the maximum representable value of a size_t.
155*/
156void* dlmalloc(size_t);
157
158/*
159 free(void* p)
160 Releases the chunk of memory pointed to by p, that had been previously
161 allocated using malloc or a related routine such as realloc.
162 It has no effect if p is null. If p was not malloced or already
163 freed, free(p) will by default cuase the current program to abort.
164*/
165void dlfree(void*);
166
167/*
168 calloc(size_t n_elements, size_t element_size);
169 Returns a pointer to n_elements * element_size bytes, with all locations
170 set to zero.
171*/
172void* dlcalloc(size_t, size_t);
173
174/*
175 realloc(void* p, size_t n)
176 Returns a pointer to a chunk of size n that contains the same data
177 as does chunk p up to the minimum of (n, p's size) bytes, or null
178 if no space is available.
179
180 The returned pointer may or may not be the same as p. The algorithm
181 prefers extending p in most cases when possible, otherwise it
182 employs the equivalent of a malloc-copy-free sequence.
183
184 If p is null, realloc is equivalent to malloc.
185
186 If space is not available, realloc returns null, errno is set (if on
187 ANSI) and p is NOT freed.
188
189 if n is for fewer bytes than already held by p, the newly unused
190 space is lopped off and freed if possible. realloc with a size
191 argument of zero (re)allocates a minimum-sized chunk.
192
193 The old unix realloc convention of allowing the last-free'd chunk
194 to be used as an argument to realloc is not supported.
195*/
196
197void* dlrealloc(void*, size_t);
198
199/*
200 memalign(size_t alignment, size_t n);
201 Returns a pointer to a newly allocated chunk of n bytes, aligned
202 in accord with the alignment argument.
203
204 The alignment argument should be a power of two. If the argument is
205 not a power of two, the nearest greater power is used.
206 8-byte alignment is guaranteed by normal malloc calls, so don't
207 bother calling memalign with an argument of 8 or less.
208
209 Overreliance on memalign is a sure way to fragment space.
210*/
211void* dlmemalign(size_t, size_t);
212
213/*
214 valloc(size_t n);
215 Equivalent to memalign(pagesize, n), where pagesize is the page
216 size of the system. If the pagesize is unknown, 4096 is used.
217*/
218void* dlvalloc(size_t);
219
220/*
221 mallopt(int parameter_number, int parameter_value)
222 Sets tunable parameters The format is to provide a
223 (parameter-number, parameter-value) pair. mallopt then sets the
224 corresponding parameter to the argument value if it can (i.e., so
225 long as the value is meaningful), and returns 1 if successful else
226 0. SVID/XPG/ANSI defines four standard param numbers for mallopt,
227 normally defined in malloc.h. None of these are use in this malloc,
228 so setting them has no effect. But this malloc also supports other
229 options in mallopt:
230
231 Symbol param # default allowed param values
232 M_TRIM_THRESHOLD -1 2*1024*1024 any (-1U disables trimming)
233 M_GRANULARITY -2 page size any power of 2 >= page size
234 M_MMAP_THRESHOLD -3 256*1024 any (or 0 if no MMAP support)
235*/
236int dlmallopt(int, int);
237
238#define M_TRIM_THRESHOLD (-1)
239#define M_GRANULARITY (-2)
240#define M_MMAP_THRESHOLD (-3)
241
242/*
243 malloc_footprint();
244 Returns the number of bytes obtained from the system. The total
245 number of bytes allocated by malloc, realloc etc., is less than this
246 value. Unlike mallinfo, this function returns only a precomputed
247 result, so can be called frequently to monitor memory consumption.
248 Even if locks are otherwise defined, this function does not use them,
249 so results might not be up to date.
250*/
251size_t dlmalloc_footprint();
252
253#if !NO_MALLINFO
254/*
255 mallinfo()
256 Returns (by copy) a struct containing various summary statistics:
257
258 arena: current total non-mmapped bytes allocated from system
259 ordblks: the number of free chunks
260 smblks: always zero.
261 hblks: current number of mmapped regions
262 hblkhd: total bytes held in mmapped regions
263 usmblks: the maximum total allocated space. This will be greater
264 than current total if trimming has occurred.
265 fsmblks: always zero
266 uordblks: current total allocated space (normal or mmapped)
267 fordblks: total free space
268 keepcost: the maximum number of bytes that could ideally be released
269 back to system via malloc_trim. ("ideally" means that
270 it ignores page restrictions etc.)
271
272 Because these fields are ints, but internal bookkeeping may
273 be kept as longs, the reported values may wrap around zero and
274 thus be inaccurate.
275*/
276
277struct mallinfo dlmallinfo(void);
278#endif /* NO_MALLINFO */
279
280/*
281 independent_calloc(size_t n_elements, size_t element_size, void* chunks[]);
282
283 independent_calloc is similar to calloc, but instead of returning a
284 single cleared space, it returns an array of pointers to n_elements
285 independent elements that can hold contents of size elem_size, each
286 of which starts out cleared, and can be independently freed,
287 realloc'ed etc. The elements are guaranteed to be adjacently
288 allocated (this is not guaranteed to occur with multiple callocs or
289 mallocs), which may also improve cache locality in some
290 applications.
291
292 The "chunks" argument is optional (i.e., may be null, which is
293 probably the most typical usage). If it is null, the returned array
294 is itself dynamically allocated and should also be freed when it is
295 no longer needed. Otherwise, the chunks array must be of at least
296 n_elements in length. It is filled in with the pointers to the
297 chunks.
298
299 In either case, independent_calloc returns this pointer array, or
300 null if the allocation failed. If n_elements is zero and "chunks"
301 is null, it returns a chunk representing an array with zero elements
302 (which should be freed if not wanted).
303
304 Each element must be individually freed when it is no longer
305 needed. If you'd like to instead be able to free all at once, you
306 should instead use regular calloc and assign pointers into this
307 space to represent elements. (In this case though, you cannot
308 independently free elements.)
309
310 independent_calloc simplifies and speeds up implementations of many
311 kinds of pools. It may also be useful when constructing large data
312 structures that initially have a fixed number of fixed-sized nodes,
313 but the number is not known at compile time, and some of the nodes
314 may later need to be freed. For example:
315
316 struct Node { int item; struct Node* next; };
317
318 struct Node* build_list() {
319 struct Node** pool;
320 int n = read_number_of_nodes_needed();
321 if (n <= 0) return 0;
322 pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0);
323 if (pool == 0) die();
324 // organize into a linked list...
325 struct Node* first = pool[0];
326 for (i = 0; i < n-1; ++i)
327 pool[i]->next = pool[i+1];
328 free(pool); // Can now free the array (or not, if it is needed later)
329 return first;
330 }
331*/
332void** dlindependent_calloc(size_t, size_t, void**);
333
334/*
335 independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]);
336
337 independent_comalloc allocates, all at once, a set of n_elements
338 chunks with sizes indicated in the "sizes" array. It returns
339 an array of pointers to these elements, each of which can be
340 independently freed, realloc'ed etc. The elements are guaranteed to
341 be adjacently allocated (this is not guaranteed to occur with
342 multiple callocs or mallocs), which may also improve cache locality
343 in some applications.
344
345 The "chunks" argument is optional (i.e., may be null). If it is null
346 the returned array is itself dynamically allocated and should also
347 be freed when it is no longer needed. Otherwise, the chunks array
348 must be of at least n_elements in length. It is filled in with the
349 pointers to the chunks.
350
351 In either case, independent_comalloc returns this pointer array, or
352 null if the allocation failed. If n_elements is zero and chunks is
353 null, it returns a chunk representing an array with zero elements
354 (which should be freed if not wanted).
355
356 Each element must be individually freed when it is no longer
357 needed. If you'd like to instead be able to free all at once, you
358 should instead use a single regular malloc, and assign pointers at
359 particular offsets in the aggregate space. (In this case though, you
360 cannot independently free elements.)
361
362 independent_comallac differs from independent_calloc in that each
363 element may have a different size, and also that it does not
364 automatically clear elements.
365
366 independent_comalloc can be used to speed up allocation in cases
367 where several structs or objects must always be allocated at the
368 same time. For example:
369
370 struct Head { ... }
371 struct Foot { ... }
372
373 void send_message(char* msg) {
374 int msglen = strlen(msg);
375 size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) };
376 void* chunks[3];
377 if (independent_comalloc(3, sizes, chunks) == 0)
378 die();
379 struct Head* head = (struct Head*)(chunks[0]);
380 char* body = (char*)(chunks[1]);
381 struct Foot* foot = (struct Foot*)(chunks[2]);
382 // ...
383 }
384
385 In general though, independent_comalloc is worth using only for
386 larger values of n_elements. For small values, you probably won't
387 detect enough difference from series of malloc calls to bother.
388
389 Overuse of independent_comalloc can increase overall memory usage,
390 since it cannot reuse existing noncontiguous small chunks that
391 might be available for some of the elements.
392*/
393void** dlindependent_comalloc(size_t, size_t*, void**);
394
395/*
396 pvalloc(size_t n);
397 Equivalent to valloc(minimum-page-that-holds(n)), that is,
398 round up n to nearest pagesize.
399 */
400void* dlpvalloc(size_t);
401
402/*
403 malloc_trim(size_t pad);
404
405 If possible, gives memory back to the system (via negative arguments
406 to sbrk) if there is unused memory at the `high' end of the malloc
407 pool or in unused MMAP segments. You can call this after freeing
408 large blocks of memory to potentially reduce the system-level memory
409 requirements of a program. However, it cannot guarantee to reduce
410 memory. Under some allocation patterns, some large free blocks of
411 memory will be locked between two used chunks, so they cannot be
412 given back to the system.
413
414 The `pad' argument to malloc_trim represents the amount of free
415 trailing space to leave untrimmed. If this argument is zero, only
416 the minimum amount of memory to maintain internal data structures
417 will be left. Non-zero arguments can be supplied to maintain enough
418 trailing space to service future expected allocations without having
419 to re-obtain memory from the system.
420
421 Malloc_trim returns 1 if it actually released any memory, else 0.
422*/
423int dlmalloc_trim(size_t);
424
425/*
426 malloc_stats();
427 Prints on stderr the amount of space obtained from the system (both
428 via sbrk and mmap), the maximum amount (which may be more than
429 current if malloc_trim and/or munmap got called), and the current
430 number of bytes allocated via malloc (or realloc, etc) but not yet
431 freed. Note that this is the number of bytes allocated, not the
432 number requested. It will be larger than the number requested
433 because of alignment and bookkeeping overhead. Because it includes
434 alignment wastage as being in use, this figure may be greater than
435 zero even when no user-level chunks are allocated.
436
437 The reported current and maximum system memory can be inaccurate if
438 a program makes other calls to system memory allocation functions
439 (normally sbrk) outside of malloc.
440
441 malloc_stats prints only the most commonly interesting statistics.
442 More information can be obtained by calling mallinfo.
443*/
444void dlmalloc_stats();
445
446#endif /* !ONLY_MSPACES */
447
448/*
449 malloc_usable_size(void* p);
450
451 Returns the number of bytes you can actually use in
452 an allocated chunk, which may be more than you requested (although
453 often not) due to alignment and minimum size constraints.
454 You can use this many bytes without worrying about
455 overwriting other allocated objects. This is not a particularly great
456 programming practice. malloc_usable_size can be more useful in
457 debugging and assertions, for example:
458
459 p = malloc(n);
460 assert(malloc_usable_size(p) >= 256);
461*/
463
464#if MSPACES
465
466/*
467 mspace is an opaque type representing an independent
468 region of space that supports mspace_malloc, etc.
469*/
470typedef void* mspace;
471
472/*
473 create_mspace creates and returns a new independent space with the
474 given initial capacity, or, if 0, the default granularity size. It
475 returns null if there is no system memory available to create the
476 space. If argument locked is non-zero, the space uses a separate
477 lock to control access. The capacity of the space will grow
478 dynamically as needed to service mspace_malloc requests. You can
479 control the sizes of incremental increases of this space by
480 compiling with a different DEFAULT_GRANULARITY or dynamically
481 setting with mallopt(M_GRANULARITY, value).
482*/
483mspace create_mspace(size_t capacity, int locked);
484
485/*
486 destroy_mspace destroys the given space, and attempts to return all
487 of its memory back to the system, returning the total number of
488 bytes freed. After destruction, the results of access to all memory
489 used by the space become undefined.
490*/
492
493/*
494 create_mspace_with_base uses the memory supplied as the initial base
495 of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this
496 space is used for bookkeeping, so the capacity must be at least this
497 large. (Otherwise 0 is returned.) When this initial space is
498 exhausted, additional memory will be obtained from the system.
499 Destroying this space will deallocate all additionally allocated
500 space (if possible) but not the initial base.
501*/
502mspace create_mspace_with_base(void* base, size_t capacity, int locked);
503
504/*
505 mspace_track_large_chunks controls whether requests for large chunks
506 are allocated in their own untracked mmapped regions, separate from
507 others in this mspace. By default large chunks are not tracked,
508 which reduces fragmentation. However, such chunks are not
509 necessarily released to the system upon destroy_mspace. Enabling
510 tracking by setting to true may increase fragmentation, but avoids
511 leakage when relying on destroy_mspace to release all memory
512 allocated using this space. The function returns the previous
513 setting.
514*/
516
517/*
518 mspace_malloc behaves as malloc, but operates within
519 the given space.
520*/
521void* mspace_malloc(mspace msp, size_t bytes);
522
523/*
524 mspace_free behaves as free, but operates within
525 the given space.
526
527 If compiled with FOOTERS==1, mspace_free is not actually needed.
528 free may be called instead of mspace_free because freed chunks from
529 any space are handled by their originating spaces.
530*/
531void mspace_free(mspace msp, void* mem);
532
533/*
534 mspace_realloc behaves as realloc, but operates within
535 the given space.
536
537 If compiled with FOOTERS==1, mspace_realloc is not actually
538 needed. realloc may be called instead of mspace_realloc because
539 realloced chunks from any space are handled by their originating
540 spaces.
541*/
542void* mspace_realloc(mspace msp, void* mem, size_t newsize);
543
544/*
545 mspace_calloc behaves as calloc, but operates within
546 the given space.
547*/
548void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size);
549
550/*
551 mspace_memalign behaves as memalign, but operates within
552 the given space.
553*/
554void* mspace_memalign(mspace msp, size_t alignment, size_t bytes);
555
556/*
557 mspace_independent_calloc behaves as independent_calloc, but
558 operates within the given space.
559*/
560void** mspace_independent_calloc(mspace msp, size_t n_elements, size_t elem_size, void* chunks[]);
561
562/*
563 mspace_independent_comalloc behaves as independent_comalloc, but
564 operates within the given space.
565*/
566void** mspace_independent_comalloc(mspace msp, size_t n_elements, size_t sizes[], void* chunks[]);
567
568/*
569 mspace_footprint() returns the number of bytes obtained from the
570 system for this space.
571*/
573
574#if !NO_MALLINFO
575/*
576 mspace_mallinfo behaves as mallinfo, but reports properties of
577 the given space.
578*/
580#endif /* NO_MALLINFO */
581
582/*
583 malloc_usable_size(void* p) behaves the same as malloc_usable_size;
584*/
585size_t mspace_usable_size(void* mem);
586
587/*
588 mspace_malloc_stats behaves as malloc_stats, but reports
589 properties of the given space.
590*/
592
593/*
594 mspace_trim behaves as malloc_trim, but
595 operates within the given space.
596*/
597int mspace_trim(mspace msp, size_t pad);
598
599/*
600 An alias for mallopt.
601*/
602int mspace_mallopt(int, int);
603
604#endif /* MSPACES */
605
606#ifdef __cplusplus
607} /* end of extern "C" */
608#endif
609
610#endif /* MALLOC_280_H */
611
612#endif
613/* AIPS_LINUX */
614
615#endif
616/* AIPS_MALLOC */
617
618#endif
619/* AIPS_NO_LEA_MALLOC */
#define dlrealloc
Definition malloc.h:105
void * mspace_realloc(mspace msp, void *mem, size_t newsize)
int mspace_trim(mspace msp, size_t pad)
#define dlindependent_calloc
Definition malloc.h:114
size_t mspace_usable_size(void *mem)
void ** mspace_independent_comalloc(mspace msp, size_t n_elements, size_t sizes[], void *chunks[])
void * mspace
Definition malloc.h:470
#define dlmallopt
Definition malloc.h:109
struct Node * first
Definition malloc.h:325
#define dlmemalign
Definition malloc.h:104
In general though
Definition malloc.h:385
#define MALLINFO_FIELD_TYPE
Definition malloc.h:121
size_t destroy_mspace(mspace msp)
#define dlmalloc_trim
Definition malloc.h:110
int mspace_mallopt(int, int)
#define dlmalloc_footprint
Definition malloc.h:113
#define dlmalloc
Definition malloc.h:103
void * mspace_memalign(mspace msp, size_t alignment, size_t bytes)
#define dlpvalloc
Definition malloc.h:107
mspace create_mspace_with_base(void *base, size_t capacity, int locked)
void ** mspace_independent_calloc(mspace msp, size_t n_elements, size_t elem_size, void *chunks[])
void mspace_malloc_stats(mspace msp)
#define dlfree
Definition malloc.h:102
#define dlindependent_comalloc
Definition malloc.h:115
int mspace_track_large_chunks(mspace msp, int enable)
void mspace_free(mspace msp, void *mem)
#define dlmalloc_usable_size
Definition malloc.h:112
#define dlmallinfo
Definition malloc.h:108
size_t mspace_footprint(mspace msp)
mspace create_mspace(size_t capacity, int locked)
void * mspace_calloc(mspace msp, size_t n_elements, size_t elem_size)
#define dlcalloc
Definition malloc.h:101
struct mallinfo mspace_mallinfo(mspace msp)
free(pool)
void * mspace_malloc(mspace msp, size_t bytes)
#define dlmalloc_stats
Definition malloc.h:111
#define dlvalloc
Definition malloc.h:106
MALLINFO_FIELD_TYPE arena
Definition malloc.h:126
MALLINFO_FIELD_TYPE fordblks
Definition malloc.h:134
MALLINFO_FIELD_TYPE uordblks
Definition malloc.h:133
MALLINFO_FIELD_TYPE usmblks
Definition malloc.h:131
MALLINFO_FIELD_TYPE fsmblks
Definition malloc.h:132
MALLINFO_FIELD_TYPE smblks
Definition malloc.h:128
MALLINFO_FIELD_TYPE keepcost
Definition malloc.h:135
MALLINFO_FIELD_TYPE hblks
Definition malloc.h:129
MALLINFO_FIELD_TYPE hblkhd
Definition malloc.h:130
MALLINFO_FIELD_TYPE ordblks
Definition malloc.h:127