]> git.ipfire.org Git - thirdparty/gcc.git/blob - libbanshee/engine/malloc.c
Merge tree-ssa-20020619-branch into mainline.
[thirdparty/gcc.git] / libbanshee / engine / malloc.c
1 /*
2 This is a version (aka dlmalloc) of malloc/free/realloc written by
3 Doug Lea and released to the public domain. Use, modify, and
4 redistribute this code without permission or acknowledgement in any
5 way you wish. Send questions, comments, complaints, performance
6 data, etc to dl@cs.oswego.edu
7
8 * VERSION 2.7.0 Sun Mar 11 14:14:06 2001 Doug Lea (dl at gee)
9
10 Note: There may be an updated version of this malloc obtainable at
11 ftp://gee.cs.oswego.edu/pub/misc/malloc.c
12 Check before installing!
13
14 * Quickstart
15
16 This library is all in one file to simplify the most common usage:
17 ftp it, compile it (-O), and link it into another program. All
18 of the compile-time options default to reasonable values for use on
19 most unix platforms. Compile -DWIN32 for reasonable defaults on windows.
20 You might later want to step through various compile-time and dynamic
21 tuning options.
22
23 For convenience, an include file for code using this malloc is at:
24 ftp://gee.cs.oswego.edu/pub/misc/malloc-2.7.0.h
25 You don't really need this .h file unless you call functions not
26 defined in your system include files. The .h file contains only the
27 excerpts from this file needed for using this malloc on ANSI C/C++
28 systems, so long as you haven't changed compile-time options about
29 naming and tuning parameters. If you do, then you can create your
30 own malloc.h that does include all settings by cutting at the point
31 indicated below.
32
33 * Why use this malloc?
34
35 This is not the fastest, most space-conserving, most portable, or
36 most tunable malloc ever written. However it is among the fastest
37 while also being among the most space-conserving, portable and tunable.
38 Consistent balance across these factors results in a good general-purpose
39 allocator for malloc-intensive programs.
40
41 The main properties of the algorithms are:
42 * For large (>= 512 bytes) requests, it is a pure best-fit allocator,
43 with ties normally decided via FIFO (i.e. least recently used).
44 * For small (<= 64 bytes by default) requests, it is a caching
45 allocator, that maintains pools of quickly recycled chunks.
46 * In between, and for combinations of large and small requests, it does
47 the best it can trying to meet both goals at once.
48 * For very large requests (>= 128KB by default), it relies on system
49 memory mapping facilities, if supported.
50
51 For a longer but slightly out of date high-level description, see
52 http://gee.cs.oswego.edu/dl/html/malloc.html
53
54 You may already by default be using a C library containing a malloc
55 that is based on some version of this malloc (for example in
56 linux). You might still want to use the one in this file in order to
57 customize settings or to avoid overheads associated with library
58 versions.
59
60 * Contents, described in more detail in "description of public routines" below.
61
62 Standard (ANSI/SVID/...) functions:
63 malloc(size_t n);
64 calloc(size_t n_elements, size_t element_size);
65 free(Void_t* p);
66 realloc(Void_t* p, size_t n);
67 memalign(size_t alignment, size_t n);
68 valloc(size_t n);
69 mallinfo()
70 mallopt(int parameter_number, int parameter_value)
71
72 Additional functions:
73 independent_calloc(size_t n_elements, size_t size, Void_t* chunks[]);
74 independent_comalloc(size_t n_elements, size_t sizes[], Void_t* chunks[]);
75 pvalloc(size_t n);
76 cfree(Void_t* p);
77 malloc_trim(size_t pad);
78 malloc_usable_size(Void_t* p);
79 malloc_stats();
80
81 * Vital statistics:
82
83 Supported pointer representation: 4 or 8 bytes
84 Supported size_t representation: 4 or 8 bytes
85 Note that size_t is allowed to be 4 bytes even if pointers are 8.
86 You can adjust this by defining INTERNAL_SIZE_T
87
88 Alignment: 2 * sizeof(size_t) (default)
89 (i.e., 8 byte alignment with 4byte size_t). This suffices for
90 nearly all current machines and C compilers. However, you can
91 define MALLOC_ALIGNMENT to be wider than this if necessary.
92
93 Minimum overhead per allocated chunk: 4 or 8 bytes
94 Each malloced chunk has a hidden word of overhead holding size
95 and status information.
96
97 Minimum allocated size: 4-byte ptrs: 16 bytes (including 4 overhead)
98 8-byte ptrs: 24/32 bytes (including, 4/8 overhead)
99
100 When a chunk is freed, 12 (for 4byte ptrs) or 20 (for 8 byte
101 ptrs but 4 byte size) or 24 (for 8/8) additional bytes are
102 needed; 4 (8) for a trailing size field and 8 (16) bytes for
103 free list pointers. Thus, the minimum allocatable size is
104 16/24/32 bytes.
105
106 Even a request for zero bytes (i.e., malloc(0)) returns a
107 pointer to something of the minimum allocatable size.
108
109 The maximum overhead wastage (i.e., number of extra bytes
110 allocated than were requested in malloc) is less than or equal
111 to the minimum size, except for requests >= mmap_threshold that
112 are serviced via mmap(), where the worst case wastage is 2 *
113 sizeof(size_t) bytes plus the remainder from a system page (the
114 minimal mmap unit); typically 4096 or 8192 bytes.
115
116 Maximum allocated size: 4-byte size_t: 2^32 minus about two pages
117 8-byte size_t: 2^64 minus about two pages
118
119 It is assumed that (possibly signed) size_t values suffice to
120 represent chunk sizes. `Possibly signed' is due to the fact
121 that `size_t' may be defined on a system as either a signed or
122 an unsigned type. The ISO C standard says that it must be
123 unsigned, but a few systems are known not to adhere to this.
124 Additionally, even when size_t is unsigned, sbrk (which is by
125 default used to obtain memory from system) accepts signed
126 arguments, and may not be able to handle size_t-wide arguments
127 with negative sign bit. Generally, values that would
128 appear as negative after accounting for overhead and alignment
129 are supported only via mmap(), which does not have this
130 limitation.
131
132 Requests for sizes outside the allowed range will perform an optional
133 failure action and then return null. (Requests may also
134 also fail because a system is out of memory.)
135
136 Thread-safety: NOT thread-safe unless USE_MALLOC_LOCK defined
137
138 When USE_MALLOC_LOCK is defined, wrappers are created to
139 surround every public call with either a pthread mutex or
140 a win32 spinlock (depending on WIN32). This is not
141 especially fast, and can be a major bottleneck.
142 It is designed only to provide minimal protection
143 in concurrent environments, and to provide a basis for
144 extensions. If you are using malloc in a concurrent program,
145 you would be far better off obtaining ptmalloc, which is
146 derived from a version of this malloc, and is well-tuned for
147 concurrent programs. (See http://www.malloc.de)
148
149 Compliance: I believe it is compliant with the 1997 Single Unix Specification
150 (See http://www.opennc.org). Also SVID/XPG, ANSI C, and probably
151 others as well.
152
153 * Synopsis of compile-time options:
154
155 People have reported using previous versions of this malloc on all
156 versions of Unix, sometimes by tweaking some of the defines
157 below. It has been tested most extensively on Solaris and
158 Linux. It is also reported to work on WIN32 platforms.
159 People also report using it in stand-alone embedded systems.
160
161 The implementation is in straight, hand-tuned ANSI C. It is not
162 at all modular. (Sorry!) It uses a lot of macros. To be at all
163 usable, this code should be compiled using an optimizing compiler
164 (for example gcc -O3) that can simplify expressions and control
165 paths. (FAQ: some macros import variables as arguments rather than
166 declare locals because people reported that some debuggers
167 otherwise get confused.)
168
169 OPTION DEFAULT VALUE
170
171 Compilation Environment options:
172
173 __STD_C derived from C compiler defines
174 WIN32 NOT defined
175 HAVE_MEMCPY defined
176 USE_MEMCPY 1 if HAVE_MEMCPY is defined
177 HAVE_MMAP defined as 1
178 MMAP_CLEARS 1
179 HAVE_MREMAP 0 unless linux defined
180 malloc_getpagesize derived from system #includes, or 4096 if not
181 HAVE_USR_INCLUDE_MALLOC_H NOT defined
182 LACKS_UNISTD_H NOT defined unless WIN32
183 LACKS_SYS_PARAM_H NOT defined unless WIN32
184 LACKS_SYS_MMAN_H NOT defined unless WIN32
185
186 Changing default word sizes:
187
188 INTERNAL_SIZE_T size_t
189 MALLOC_ALIGNMENT 2 * sizeof(INTERNAL_SIZE_T)
190
191 Configuration and functionality options:
192
193 USE_DL_PREFIX NOT defined
194 USE_PUBLIC_MALLOC_WRAPPERS NOT defined
195 USE_MALLOC_LOCK NOT defined
196 DEBUG NOT defined
197 REALLOC_ZERO_BYTES_FREES NOT defined
198 MALLOC_FAILURE_ACTION errno = ENOMEM, if __STD_C defined, else no-op
199 TRIM_FASTBINS 0
200
201 Options for customizing MORECORE:
202
203 MORECORE sbrk
204 MORECORE_CONTIGUOUS 1
205 MORECORE_CANNOT_TRIM NOT defined
206 MMAP_AS_MORECORE_SIZE (1024 * 1024)
207
208 Tuning options that are also dynamically changeable via mallopt:
209
210 DEFAULT_MXFAST 64
211 DEFAULT_TRIM_THRESHOLD 128 * 1024
212 DEFAULT_TOP_PAD 0
213 DEFAULT_MMAP_THRESHOLD 128 * 1024
214 DEFAULT_MMAP_MAX 65536
215
216 There are several other #defined constants and macros that you
217 probably don't want to touch unless you are extending or adapting malloc.
218 */
219
220 /*
221 WIN32 sets up defaults for MS environment and compilers.
222 Otherwise defaults are for unix.
223 */
224
225 /* #define WIN32 */
226
227 #ifdef WIN32
228
229 #define WIN32_LEAN_AND_MEAN
230 #include <windows.h>
231
232 /* Win32 doesn't supply or need the following headers */
233 #define LACKS_UNISTD_H
234 #define LACKS_SYS_PARAM_H
235 #define LACKS_SYS_MMAN_H
236
237 /* Use the supplied emulation of sbrk */
238 #define MORECORE sbrk
239 #define MORECORE_CONTIGUOUS 1
240 #define MORECORE_FAILURE ((void*)(-1))
241
242 /* Use the supplied emulation of mmap and munmap */
243 #define HAVE_MMAP 1
244 #define MUNMAP_FAILURE (-1)
245 #define MMAP_CLEARS 1
246
247 /* These values don't really matter in windows mmap emulation */
248 #define MAP_PRIVATE 1
249 #define MAP_ANONYMOUS 2
250 #define PROT_READ 1
251 #define PROT_WRITE 2
252
253 /* Emulation functions defined at the end of this file */
254
255 /* If USE_MALLOC_LOCK, use supplied critical-section-based lock functions */
256 #ifdef USE_MALLOC_LOCK
257 static int slwait(int *sl);
258 static int slrelease(int *sl);
259 #endif
260
261 static long getpagesize(void);
262 static long getregionsize(void);
263 static void *sbrk(long size);
264 static void *mmap(void *ptr, long size, long prot, long type, long handle, long arg);
265 static long munmap(void *ptr, long size);
266
267 static void vminfo (unsigned long *free, unsigned long *reserved, unsigned long *committed);
268 static int cpuinfo (int whole, unsigned long *kernel, unsigned long *user);
269
270 #endif
271
272 /*
273 __STD_C should be nonzero if using ANSI-standard C compiler, a C++
274 compiler, or a C compiler sufficiently close to ANSI to get away
275 with it.
276 */
277
278 #ifndef __STD_C
279 #if defined(__STDC__) || defined(_cplusplus)
280 #define __STD_C 1
281 #else
282 #define __STD_C 0
283 #endif
284 #endif /*__STD_C*/
285
286
287 /*
288 Void_t* is the pointer type that malloc should say it returns
289 */
290
291 #ifndef Void_t
292 #if (__STD_C || defined(WIN32))
293 #define Void_t void
294 #else
295 #define Void_t char
296 #endif
297 #endif /*Void_t*/
298
299 #if __STD_C
300 #include <stddef.h> /* for size_t */
301 #else
302 #include <sys/types.h>
303 #endif
304
305 #ifdef __cplusplus
306 extern "C" {
307 #endif
308
309 /* define LACKS_UNISTD_H if your system does not have a <unistd.h>. */
310
311 /* #define LACKS_UNISTD_H */
312
313 #ifndef LACKS_UNISTD_H
314 #include <unistd.h>
315 #endif
316
317 /* define LACKS_SYS_PARAM_H if your system does not have a <sys/param.h>. */
318
319 /* #define LACKS_SYS_PARAM_H */
320
321
322 #include <stdio.h> /* needed for malloc_stats */
323 #include <errno.h> /* needed for optional MALLOC_FAILURE_ACTION */
324
325
326 /*
327 Debugging:
328
329 Because freed chunks may be overwritten with bookkeeping fields, this
330 malloc will often die when freed memory is overwritten by user
331 programs. This can be very effective (albeit in an annoying way)
332 in helping track down dangling pointers.
333
334 If you compile with -DDEBUG, a number of assertion checks are
335 enabled that will catch more memory errors. You probably won't be
336 able to make much sense of the actual assertion errors, but they
337 should help you locate incorrectly overwritten memory. The
338 checking is fairly extensive, and will slow down execution
339 noticeably. Calling malloc_stats or mallinfo with DEBUG set will
340 attempt to check every non-mmapped allocated and free chunk in the
341 course of computing the summmaries. (By nature, mmapped regions
342 cannot be checked very much automatically.)
343
344 Setting DEBUG may also be helpful if you are trying to modify
345 this code. The assertions in the check routines spell out in more
346 detail the assumptions and invariants underlying the algorithms.
347
348 Setting DEBUG does NOT provide an automated mechanism for checking
349 that all accesses to malloced memory stay within their
350 bounds. However, there are several add-ons and adaptations of this
351 or other mallocs available that do this.
352 */
353
354 #if DEBUG
355 #include <assert.h>
356 #else
357 #define assert(x) ((void)0)
358 #endif
359
360
361 /*
362 INTERNAL_SIZE_T is the word-size used for internal bookkeeping
363 of chunk sizes.
364
365 The default version is the same as size_t.
366
367 While not strictly necessary, it is best to define this as an
368 unsigned type, even if size_t is a signed type. This may avoid some
369 artificial size limitations on some systems.
370
371 On a 64-bit machine, you may be able to reduce malloc overhead by
372 defining INTERNAL_SIZE_T to be a 32 bit `unsigned int' at the
373 expense of not being able to handle more than 2^32 of malloced
374 space. If this limitation is acceptable, you are encouraged to set
375 this unless you are on a platform requiring 16byte alignments. In
376 this case the alignment requirements turn out to negate any
377 potential advantages of decreasing size_t word size.
378
379 Implementors: Beware of the possible combinations of:
380 - INTERNAL_SIZE_T might be signed or unsigned, might be 32 or 64 bits,
381 and might be the same width as int or as long
382 - size_t might have different width and signedness as INTERNAL_SIZE_T
383 - int and long might be 32 or 64 bits, and might be the same width
384 To deal with this, most comparisons and difference computations
385 among INTERNAL_SIZE_Ts should cast them to unsigned long, being
386 aware of the fact that casting an unsigned int to a wider long does
387 not sign-extend. (This also makes checking for negative numbers
388 awkward.) Some of these casts result in harmless compiler warnings
389 on some systems.
390 */
391
392 #ifndef INTERNAL_SIZE_T
393 #define INTERNAL_SIZE_T size_t
394 #endif
395
396 /* The corresponding word size */
397 #define SIZE_SZ (sizeof(INTERNAL_SIZE_T))
398
399
400 /*
401 MALLOC_ALIGNMENT is the minimum alignment for malloc'ed chunks.
402 It must be a power of two at least 2 * SIZE_SZ, even on machines
403 for which smaller alignments would suffice. It may be defined as
404 larger than this though. Note however that code and data structures
405 are optimized for the case of 8-byte alignment.
406 */
407
408
409 #ifndef MALLOC_ALIGNMENT
410 #define MALLOC_ALIGNMENT (2 * SIZE_SZ)
411 #endif
412
413 /* The corresponding bit mask value */
414 #define MALLOC_ALIGN_MASK (MALLOC_ALIGNMENT - 1)
415
416
417
418 /*
419 REALLOC_ZERO_BYTES_FREES should be set if a call to
420 realloc with zero bytes should be the same as a call to free.
421 Some people think it should. Otherwise, since this malloc
422 returns a unique pointer for malloc(0), so does realloc(p, 0).
423 */
424
425 /* #define REALLOC_ZERO_BYTES_FREES */
426
427 /*
428 TRIM_FASTBINS controls whether free() of a very small chunk can
429 immediately lead to trimming. Setting to true (1) can reduce memory
430 footprint, but will almost always slow down programs that use a lot
431 of small chunks.
432
433 Define this only if you are willing to give up some speed to more
434 aggressively reduce system-level memory footprint when releasing
435 memory in programs that use many small chunks. You can get
436 essentially the same effect by setting MXFAST to 0, but this can
437 lead to even greater slowdowns in programs using many small chunks.
438 TRIM_FASTBINS is an in-between compile-time option, that disables
439 only those chunks bordering topmost memory from being placed in
440 fastbins.
441 */
442
443 #ifndef TRIM_FASTBINS
444 #define TRIM_FASTBINS 0
445 #endif
446
447
448 /*
449 USE_DL_PREFIX will prefix all public routines with the string 'dl'.
450 This is necessary when you only want to use this malloc in one part
451 of a program, using your regular system malloc elsewhere.
452 */
453
454 /* #define USE_DL_PREFIX */
455
456
457 /*
458 USE_MALLOC_LOCK causes wrapper functions to surround each
459 callable routine with pthread mutex lock/unlock.
460
461 USE_MALLOC_LOCK forces USE_PUBLIC_MALLOC_WRAPPERS to be defined
462 */
463
464
465 /* #define USE_MALLOC_LOCK */
466
467
468 /*
469 If USE_PUBLIC_MALLOC_WRAPPERS is defined, every public routine is
470 actually a wrapper function that first calls MALLOC_PREACTION, then
471 calls the internal routine, and follows it with
472 MALLOC_POSTACTION. This is needed for locking, but you can also use
473 this, without USE_MALLOC_LOCK, for purposes of interception,
474 instrumentation, etc. It is a sad fact that using wrappers often
475 noticeably degrades performance of malloc-intensive programs.
476 */
477
478 #ifdef USE_MALLOC_LOCK
479 #define USE_PUBLIC_MALLOC_WRAPPERS
480 #else
481 /* #define USE_PUBLIC_MALLOC_WRAPPERS */
482 #endif
483
484
485 /*
486 Two-phase name translation.
487 All of the actual routines are given mangled names.
488 When wrappers are used, they become the public callable versions.
489 When DL_PREFIX is used, the callable names are prefixed.
490 */
491
492 #ifndef USE_PUBLIC_MALLOC_WRAPPERS
493 #define cALLOc public_cALLOc
494 #define fREe public_fREe
495 #define cFREe public_cFREe
496 #define mALLOc public_mALLOc
497 #define mEMALIGn public_mEMALIGn
498 #define rEALLOc public_rEALLOc
499 #define vALLOc public_vALLOc
500 #define pVALLOc public_pVALLOc
501 #define mALLINFo public_mALLINFo
502 #define mALLOPt public_mALLOPt
503 #define mTRIm public_mTRIm
504 #define mSTATs public_mSTATs
505 #define mUSABLe public_mUSABLe
506 #define iCALLOc public_iCALLOc
507 #define iCOMALLOc public_iCOMALLOc
508 #endif
509
510 #ifdef USE_DL_PREFIX
511 #define public_cALLOc dlcalloc
512 #define public_fREe dlfree
513 #define public_cFREe dlcfree
514 #define public_mALLOc dlmalloc
515 #define public_mEMALIGn dlmemalign
516 #define public_rEALLOc dlrealloc
517 #define public_vALLOc dlvalloc
518 #define public_pVALLOc dlpvalloc
519 #define public_mALLINFo dlmallinfo
520 #define public_mALLOPt dlmallopt
521 #define public_mTRIm dlmalloc_trim
522 #define public_mSTATs dlmalloc_stats
523 #define public_mUSABLe dlmalloc_usable_size
524 #define public_iCALLOc dlindependent_calloc
525 #define public_iCOMALLOc dlindependent_comalloc
526 #else /* USE_DL_PREFIX */
527 #define public_cALLOc calloc
528 #define public_fREe free
529 #define public_cFREe cfree
530 #define public_mALLOc malloc
531 #define public_mEMALIGn memalign
532 #define public_rEALLOc realloc
533 #define public_vALLOc valloc
534 #define public_pVALLOc pvalloc
535 #define public_mALLINFo mallinfo
536 #define public_mALLOPt mallopt
537 #define public_mTRIm malloc_trim
538 #define public_mSTATs malloc_stats
539 #define public_mUSABLe malloc_usable_size
540 #define public_iCALLOc independent_calloc
541 #define public_iCOMALLOc independent_comalloc
542 #endif /* USE_DL_PREFIX */
543
544
545 /*
546 HAVE_MEMCPY should be defined if you are not otherwise using
547 ANSI STD C, but still have memcpy and memset in your C library
548 and want to use them in calloc and realloc. Otherwise simple
549 macro versions are defined below.
550
551 USE_MEMCPY should be defined as 1 if you actually want to
552 have memset and memcpy called. People report that the macro
553 versions are faster than libc versions on some systems.
554
555 Even if USE_MEMCPY is set to 1, loops to copy/clear small chunks
556 (of <= 36 bytes) are manually unrolled in realloc and calloc.
557 */
558
559 #define HAVE_MEMCPY
560
561 #ifndef USE_MEMCPY
562 #ifdef HAVE_MEMCPY
563 #define USE_MEMCPY 1
564 #else
565 #define USE_MEMCPY 0
566 #endif
567 #endif
568
569
570 #if (__STD_C || defined(HAVE_MEMCPY))
571
572 #ifdef WIN32
573 /* On Win32 memset and memcpy are already declared in windows.h */
574 #else
575 #if __STD_C
576 void* memset(void*, int, size_t);
577 void* memcpy(void*, const void*, size_t);
578 #else
579 Void_t* memset();
580 Void_t* memcpy();
581 #endif
582 #endif
583 #endif
584
585 /*
586 MALLOC_FAILURE_ACTION is the action to take before "return 0" when
587 malloc fails to be able to return memory, either because memory is
588 exhausted or because of illegal arguments.
589
590 By default, sets errno if running on STD_C platform, else does nothing.
591 */
592
593 #ifndef MALLOC_FAILURE_ACTION
594 #if __STD_C
595 #define MALLOC_FAILURE_ACTION \
596 errno = ENOMEM;
597
598 #else
599 #define MALLOC_FAILURE_ACTION
600 #endif
601 #endif
602
603 /*
604 MORECORE-related declarations. By default, rely on sbrk
605 */
606
607
608 #ifdef LACKS_UNISTD_H
609 #if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__)
610 #if __STD_C
611 extern Void_t* sbrk(ptrdiff_t);
612 #else
613 extern Void_t* sbrk();
614 #endif
615 #endif
616 #endif
617
618 /*
619 MORECORE is the name of the routine to call to obtain more memory
620 from the system. See below for general guidance on writing
621 alternative MORECORE functions, as well as a version for WIN32 and a
622 sample version for pre-OSX macos.
623 */
624
625 #ifndef MORECORE
626 #define MORECORE sbrk
627 #endif
628
629 /*
630 MORECORE_FAILURE is the value returned upon failure of MORECORE
631 as well as mmap. Since it cannot be an otherwise valid memory address,
632 and must reflect values of standard sys calls, you probably ought not
633 try to redefine it.
634 */
635
636 #ifndef MORECORE_FAILURE
637 #define MORECORE_FAILURE (-1)
638 #endif
639
640 /*
641 If MORECORE_CONTIGUOUS is true, take advantage of fact that
642 consecutive calls to MORECORE with positive arguments always return
643 contiguous increasing addresses. This is true of unix sbrk. Even
644 if not defined, when regions happen to be contiguous, malloc will
645 permit allocations spanning regions obtained from different
646 calls. But defining this when applicable enables some stronger
647 consistency checks and space efficiencies.
648 */
649
650 #ifndef MORECORE_CONTIGUOUS
651 #define MORECORE_CONTIGUOUS 1
652 #endif
653
654 /*
655 Define MORECORE_CANNOT_TRIM if your version of MORECORE
656 cannot release space back to the system when given negative
657 arguments. This is generally necessary only if you are using
658 a hand-crafted MORECORE function that cannot handle negative arguments.
659 */
660
661 /* #define MORECORE_CANNOT_TRIM */
662
663
664 /*
665 Define HAVE_MMAP as true to optionally make malloc() use mmap() to
666 allocate very large blocks. These will be returned to the
667 operating system immediately after a free(). Also, if mmap
668 is available, it is used as a backup strategy in cases where
669 MORECORE fails to provide space from system.
670
671 This malloc is best tuned to work with mmap for large requests.
672 If you do not have mmap, operations involving very large chunks (1MB
673 or so) may be slower than you'd like.
674 */
675
676 #ifndef HAVE_MMAP
677 #define HAVE_MMAP 1
678
679 /*
680 Standard unix mmap using /dev/zero clears memory so calloc doesn't
681 need to.
682 */
683
684 #ifndef MMAP_CLEARS
685 #define MMAP_CLEARS 1
686 #endif
687
688 #else /* no mmap */
689 #ifndef MMAP_CLEARS
690 #define MMAP_CLEARS 0
691 #endif
692 #endif
693
694
695 /*
696 MMAP_AS_MORECORE_SIZE is the minimum mmap size argument to use if
697 sbrk fails, and mmap is used as a backup (which is done only if
698 HAVE_MMAP). The value must be a multiple of page size. This
699 backup strategy generally applies only when systems have "holes" in
700 address space, so sbrk cannot perform contiguous expansion, but
701 there is still space available on system. On systems for which
702 this is known to be useful (i.e. most linux kernels), this occurs
703 only when programs allocate huge amounts of memory. Between this,
704 and the fact that mmap regions tend to be limited, the size should
705 be large, to avoid too many mmap calls and thus avoid running out
706 of kernel resources.
707 */
708
709 #ifndef MMAP_AS_MORECORE_SIZE
710 #define MMAP_AS_MORECORE_SIZE (1024 * 1024)
711 #endif
712
713 /*
714 Define HAVE_MREMAP to make realloc() use mremap() to re-allocate
715 large blocks. This is currently only possible on Linux with
716 kernel versions newer than 1.3.77.
717 */
718
719 #ifndef HAVE_MREMAP
720 #ifdef linux
721 #define HAVE_MREMAP 1
722 #else
723 #define HAVE_MREMAP 0
724 #endif
725
726 #endif /* HAVE_MMAP */
727
728
729 /*
730 The system page size. To the extent possible, this malloc manages
731 memory from the system in page-size units. Note that this value is
732 cached during initialization into a field of malloc_state. So even
733 if malloc_getpagesize is a function, it is only called once.
734
735 The following mechanics for getpagesize were adapted from bsd/gnu
736 getpagesize.h. If none of the system-probes here apply, a value of
737 4096 is used, which should be OK: If they don't apply, then using
738 the actual value probably doesn't impact performance.
739 */
740
741
742 #ifndef malloc_getpagesize
743
744 #ifndef LACKS_UNISTD_H
745 # include <unistd.h>
746 #endif
747
748 # ifdef _SC_PAGESIZE /* some SVR4 systems omit an underscore */
749 # ifndef _SC_PAGE_SIZE
750 # define _SC_PAGE_SIZE _SC_PAGESIZE
751 # endif
752 # endif
753
754 # ifdef _SC_PAGE_SIZE
755 # define malloc_getpagesize sysconf(_SC_PAGE_SIZE)
756 # else
757 # if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE)
758 extern size_t getpagesize();
759 # define malloc_getpagesize getpagesize()
760 # else
761 # ifdef WIN32 /* use supplied emulation of getpagesize */
762 # define malloc_getpagesize getpagesize()
763 # else
764 # ifndef LACKS_SYS_PARAM_H
765 # include <sys/param.h>
766 # endif
767 # ifdef EXEC_PAGESIZE
768 # define malloc_getpagesize EXEC_PAGESIZE
769 # else
770 # ifdef NBPG
771 # ifndef CLSIZE
772 # define malloc_getpagesize NBPG
773 # else
774 # define malloc_getpagesize (NBPG * CLSIZE)
775 # endif
776 # else
777 # ifdef NBPC
778 # define malloc_getpagesize NBPC
779 # else
780 # ifdef PAGESIZE
781 # define malloc_getpagesize PAGESIZE
782 # else /* just guess */
783 # define malloc_getpagesize (4096)
784 # endif
785 # endif
786 # endif
787 # endif
788 # endif
789 # endif
790 # endif
791 #endif
792
793 /*
794 This version of malloc supports the standard SVID/XPG mallinfo
795 routine that returns a struct containing usage properties and
796 statistics. It should work on any SVID/XPG compliant system that has
797 a /usr/include/malloc.h defining struct mallinfo. (If you'd like to
798 install such a thing yourself, cut out the preliminary declarations
799 as described above and below and save them in a malloc.h file. But
800 there's no compelling reason to bother to do this.)
801
802 The main declaration needed is the mallinfo struct that is returned
803 (by-copy) by mallinfo(). The SVID/XPG malloinfo struct contains a
804 bunch of field that are not even meaningful in this version of
805 malloc. These fields are are instead filled by mallinfo() with
806 other numbers that might be of interest.
807
808 HAVE_USR_INCLUDE_MALLOC_H should be set if you have a
809 /usr/include/malloc.h file that includes a declaration of struct
810 mallinfo. If so, it is included; else an SVID2/XPG2 compliant
811 version is declared below. These must be precisely the same for
812 mallinfo() to work. The original SVID version of this struct,
813 defined on most systems with mallinfo, declares all fields as
814 ints. But some others define as unsigned long. If your system
815 defines the fields using a type of different width than listed here,
816 you must #include your system version and #define
817 HAVE_USR_INCLUDE_MALLOC_H.
818 */
819
820 /* #define HAVE_USR_INCLUDE_MALLOC_H */
821
822 #ifdef HAVE_USR_INCLUDE_MALLOC_H
823 #include "/usr/include/malloc.h"
824 #else
825
826 /* SVID2/XPG mallinfo structure */
827
828 struct mallinfo {
829 int arena; /* non-mmapped space allocated from system */
830 int ordblks; /* number of free chunks */
831 int smblks; /* number of fastbin blocks */
832 int hblks; /* number of mmapped regions */
833 int hblkhd; /* space in mmapped regions */
834 int usmblks; /* maximum total allocated space */
835 int fsmblks; /* space available in freed fastbin blocks */
836 int uordblks; /* total allocated space */
837 int fordblks; /* total free space */
838 int keepcost; /* top-most, releasable (via malloc_trim) space */
839 };
840
841 /*
842 SVID/XPG defines four standard parameter numbers for mallopt,
843 normally defined in malloc.h. Only one of these (M_MXFAST) is used
844 in this malloc. The others (M_NLBLKS, M_GRAIN, M_KEEP) don't apply,
845 so setting them has no effect. But this malloc also supports other
846 options in mallopt described below.
847 */
848 #endif
849
850
851 /* ---------- description of public routines ------------ */
852
853 /*
854 malloc(size_t n)
855 Returns a pointer to a newly allocated chunk of at least n bytes, or null
856 if no space is available. Additionally, on failure, errno is
857 set to ENOMEM on ANSI C systems.
858
859 If n is zero, malloc returns a minumum-sized chunk. (The minimum
860 size is 16 bytes on most 32bit systems, and 24 or 32 bytes on 64bit
861 systems.) On most systems, size_t is an unsigned type, so calls
862 with negative arguments are interpreted as requests for huge amounts
863 of space, which will often fail. The maximum supported value of n
864 differs across systems, but is in all cases less than the maximum
865 representable value of a size_t.
866 */
867 #if __STD_C
868 Void_t* public_mALLOc(size_t);
869 #else
870 Void_t* public_mALLOc();
871 #endif
872
873 /*
874 free(Void_t* p)
875 Releases the chunk of memory pointed to by p, that had been previously
876 allocated using malloc or a related routine such as realloc.
877 It has no effect if p is null. It can have arbitrary (i.e., bad!)
878 effects if p has already been freed.
879
880 Unless disabled (using mallopt), freeing very large spaces will
881 when possible, automatically trigger operations that give
882 back unused memory to the system, thus reducing program footprint.
883 */
884 #if __STD_C
885 void public_fREe(Void_t*);
886 #else
887 void public_fREe();
888 #endif
889
890 /*
891 calloc(size_t n_elements, size_t element_size);
892 Returns a pointer to n_elements * element_size bytes, with all locations
893 set to zero.
894 */
895 #if __STD_C
896 Void_t* public_cALLOc(size_t, size_t);
897 #else
898 Void_t* public_cALLOc();
899 #endif
900
901 /*
902 realloc(Void_t* p, size_t n)
903 Returns a pointer to a chunk of size n that contains the same data
904 as does chunk p up to the minimum of (n, p's size) bytes, or null
905 if no space is available.
906
907 The returned pointer may or may not be the same as p. The algorithm
908 prefers extending p when possible, otherwise it employs the
909 equivalent of a malloc-copy-free sequence.
910
911 If p is null, realloc is equivalent to malloc.
912
913 If space is not available, realloc returns null, errno is set (if on
914 ANSI) and p is NOT freed.
915
916 if n is for fewer bytes than already held by p, the newly unused
917 space is lopped off and freed if possible. Unless the #define
918 REALLOC_ZERO_BYTES_FREES is set, realloc with a size argument of
919 zero (re)allocates a minimum-sized chunk.
920
921 Large chunks that were internally obtained via mmap will always
922 be reallocated using malloc-copy-free sequences unless
923 the system supports MREMAP (currently only linux).
924
925 The old unix realloc convention of allowing the last-free'd chunk
926 to be used as an argument to realloc is not supported.
927 */
928 #if __STD_C
929 Void_t* public_rEALLOc(Void_t*, size_t);
930 #else
931 Void_t* public_rEALLOc();
932 #endif
933
934 /*
935 memalign(size_t alignment, size_t n);
936 Returns a pointer to a newly allocated chunk of n bytes, aligned
937 in accord with the alignment argument.
938
939 The alignment argument should be a power of two. If the argument is
940 not a power of two, the nearest greater power is used.
941 8-byte alignment is guaranteed by normal malloc calls, so don't
942 bother calling memalign with an argument of 8 or less.
943
944 Overreliance on memalign is a sure way to fragment space.
945 */
946 #if __STD_C
947 Void_t* public_mEMALIGn(size_t, size_t);
948 #else
949 Void_t* public_mEMALIGn();
950 #endif
951
952 /*
953 valloc(size_t n);
954 Equivalent to memalign(pagesize, n), where pagesize is the page
955 size of the system. If the pagesize is unknown, 4096 is used.
956 */
957 #if __STD_C
958 Void_t* public_vALLOc(size_t);
959 #else
960 Void_t* public_vALLOc();
961 #endif
962
963
964
965 /*
966 mallopt(int parameter_number, int parameter_value)
967 Sets tunable parameters The format is to provide a
968 (parameter-number, parameter-value) pair. mallopt then sets the
969 corresponding parameter to the argument value if it can (i.e., so
970 long as the value is meaningful), and returns 1 if successful else
971 0. SVID/XPG/ANSI defines four standard param numbers for mallopt,
972 normally defined in malloc.h. Only one of these (M_MXFAST) is used
973 in this malloc. The others (M_NLBLKS, M_GRAIN, M_KEEP) don't apply,
974 so setting them has no effect. But this malloc also supports four
975 other options in mallopt. See below for details. Briefly, supported
976 parameters are as follows (listed defaults are for "typical"
977 configurations).
978
979 Symbol param # default allowed param values
980 M_MXFAST 1 64 0-80 (0 disables fastbins)
981 M_TRIM_THRESHOLD -1 128*1024 any (-1U disables trimming)
982 M_TOP_PAD -2 0 any
983 M_MMAP_THRESHOLD -3 128*1024 any (or 0 if no MMAP support)
984 M_MMAP_MAX -4 65536 any (0 disables use of mmap)
985 */
986 #if __STD_C
987 int public_mALLOPt(int, int);
988 #else
989 int public_mALLOPt();
990 #endif
991
992
993 /*
994 mallinfo()
995 Returns (by copy) a struct containing various summary statistics:
996
997 arena: current total non-mmapped bytes allocated from system
998 ordblks: the number of free chunks
999 smblks: the number of fastbin blocks (i.e., small chunks that
1000 have been freed but not use resused or consolidated)
1001 hblks: current number of mmapped regions
1002 hblkhd: total bytes held in mmapped regions
1003 usmblks: the maximum total allocated space. This will be greater
1004 than current total if trimming has occurred.
1005 fsmblks: total bytes held in fastbin blocks
1006 uordblks: current total allocated space (normal or mmapped)
1007 fordblks: total free space
1008 keepcost: the maximum number of bytes that could ideally be released
1009 back to system via malloc_trim. ("ideally" means that
1010 it ignores page restrictions etc.)
1011
1012 Because these fields are ints, but internal bookkeeping may
1013 be kept as longs, the reported values may wrap around zero and
1014 thus be inaccurate.
1015 */
1016 #if __STD_C
1017 struct mallinfo public_mALLINFo(void);
1018 #else
1019 struct mallinfo public_mALLINFo();
1020 #endif
1021
1022 /*
1023 independent_calloc(size_t n_elements, size_t element_size, Void_t* chunks[]);
1024
1025 independent_calloc is similar to calloc, but instead of returning a
1026 single cleared space, it returns an array of pointers to n_elements
1027 independent elements that can hold contents of size elem_size, each
1028 of which starts out cleared, and can be independently freed,
1029 realloc'ed etc. The elements are guaranteed to be adjacently
1030 allocated (this is not guaranteed to occur with multiple callocs or
1031 mallocs), which may also improve cache locality in some
1032 applications.
1033
1034 The "chunks" argument is optional (i.e., may be null, which is
1035 probably the most typical usage). If it is null, the returned array
1036 is itself dynamically allocated and should also be freed when it is
1037 no longer needed. Otherwise, the chunks array must be of at least
1038 n_elements in length. It is filled in with the pointers to the
1039 chunks.
1040
1041 In either case, independent_calloc returns this pointer array, or
1042 null if the allocation failed. If n_elements is zero and "chunks"
1043 is null, it returns a chunk representing an array with zero elements
1044 (which should be freed if not wanted).
1045
1046 Each element must be individually freed when it is no longer
1047 needed. If you'd like to instead be able to free all at once, you
1048 should instead use regular calloc and assign pointers into this
1049 space to represent elements. (In this case though, you cannot
1050 independently free elements.)
1051
1052 independent_calloc simplifies and speeds up implementations of many
1053 kinds of pools. It may also be useful when constructing large data
1054 structures that initially have a fixed number of fixed-sized nodes,
1055 but the number is not known at compile time, and some of the nodes
1056 may later need to be freed. For example:
1057
1058 struct Node { int item; struct Node* next; };
1059
1060 struct Node* build_list() {
1061 struct Node** pool;
1062 int n = read_number_of_nodes_needed();
1063 if (n <= 0) return 0;
1064 pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0);
1065 if (pool == 0) die();
1066 // organize into a linked list...
1067 struct Node* first = pool[0];
1068 for (i = 0; i < n-1; ++i)
1069 pool[i]->next = pool[i+1];
1070 free(pool); // Can now free the array (or not, if it is needed later)
1071 return first;
1072 }
1073 */
1074 #if __STD_C
1075 Void_t** public_iCALLOc(size_t, size_t, Void_t**);
1076 #else
1077 Void_t** public_iCALLOc();
1078 #endif
1079
1080 /*
1081 independent_comalloc(size_t n_elements, size_t sizes[], Void_t* chunks[]);
1082
1083 independent_comalloc allocates, all at once, a set of n_elements
1084 chunks with sizes indicated in the "sizes" array. It returns
1085 an array of pointers to these elements, each of which can be
1086 independently freed, realloc'ed etc. The elements are guaranteed to
1087 be adjacently allocated (this is not guaranteed to occur with
1088 multiple callocs or mallocs), which may also improve cache locality
1089 in some applications.
1090
1091 The "chunks" argument is optional (i.e., may be null). If it is null
1092 the returned array is itself dynamically allocated and should also
1093 be freed when it is no longer needed. Otherwise, the chunks array
1094 must be of at least n_elements in length. It is filled in with the
1095 pointers to the chunks.
1096
1097 In either case, independent_comalloc returns this pointer array, or
1098 null if the allocation failed. If n_elements is zero and chunks is
1099 null, it returns a chunk representing an array with zero elements
1100 (which should be freed if not wanted).
1101
1102 Each element must be individually freed when it is no longer
1103 needed. If you'd like to instead be able to free all at once, you
1104 should instead use a single regular malloc, and assign pointers at
1105 particular offsets in the aggregate space. (In this case though, you
1106 cannot independently free elements.)
1107
1108 independent_comallac differs from independent_calloc in that each
1109 element may have a different size, and also that it does not
1110 automatically clear elements.
1111
1112 independent_comalloc can be used to speed up allocation in cases
1113 where several structs or objects must always be allocated at the
1114 same time. For example:
1115
1116 struct Head { ... }
1117 struct Foot { ... }
1118
1119 void send_message(char* msg) {
1120 int msglen = strlen(msg);
1121 size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) };
1122 void* chunks[3];
1123 if (independent_comalloc(3, sizes, chunks) == 0)
1124 die();
1125 struct Head* head = (struct Head*)(chunks[0]);
1126 char* body = (char*)(chunks[1]);
1127 struct Foot* foot = (struct Foot*)(chunks[2]);
1128 // ...
1129 }
1130
1131 In general though, independent_comalloc is worth using only for
1132 larger values of n_elements. For small values, you probably won't
1133 detect enough difference from series of malloc calls to bother.
1134
1135 Overuse of independent_comalloc can increase overall memory usage,
1136 since it cannot reuse existing noncontiguous small chunks that
1137 might be available for some of the elements.
1138 */
1139 #if __STD_C
1140 Void_t** public_iCOMALLOc(size_t, size_t*, Void_t**);
1141 #else
1142 Void_t** public_iCOMALLOc();
1143 #endif
1144
1145
1146 /*
1147 pvalloc(size_t n);
1148 Equivalent to valloc(minimum-page-that-holds(n)), that is,
1149 round up n to nearest pagesize.
1150 */
1151 #if __STD_C
1152 Void_t* public_pVALLOc(size_t);
1153 #else
1154 Void_t* public_pVALLOc();
1155 #endif
1156
1157 /*
1158 cfree(Void_t* p);
1159 Equivalent to free(p).
1160
1161 cfree is needed/defined on some systems that pair it with calloc,
1162 for odd historical reasons (such as: cfree is used in example
1163 code in the first edition of K&R).
1164 */
1165 #if __STD_C
1166 void public_cFREe(Void_t*);
1167 #else
1168 void public_cFREe();
1169 #endif
1170
1171 /*
1172 malloc_trim(size_t pad);
1173
1174 If possible, gives memory back to the system (via negative
1175 arguments to sbrk) if there is unused memory at the `high' end of
1176 the malloc pool. You can call this after freeing large blocks of
1177 memory to potentially reduce the system-level memory requirements
1178 of a program. However, it cannot guarantee to reduce memory. Under
1179 some allocation patterns, some large free blocks of memory will be
1180 locked between two used chunks, so they cannot be given back to
1181 the system.
1182
1183 The `pad' argument to malloc_trim represents the amount of free
1184 trailing space to leave untrimmed. If this argument is zero,
1185 only the minimum amount of memory to maintain internal data
1186 structures will be left (one page or less). Non-zero arguments
1187 can be supplied to maintain enough trailing space to service
1188 future expected allocations without having to re-obtain memory
1189 from the system.
1190
1191 Malloc_trim returns 1 if it actually released any memory, else 0.
1192 On systems that do not support "negative sbrks", it will always
1193 rreturn 0.
1194 */
1195 #if __STD_C
1196 int public_mTRIm(size_t);
1197 #else
1198 int public_mTRIm();
1199 #endif
1200
1201 /*
1202 malloc_usable_size(Void_t* p);
1203
1204 Returns the number of bytes you can actually use in
1205 an allocated chunk, which may be more than you requested (although
1206 often not) due to alignment and minimum size constraints.
1207 You can use this many bytes without worrying about
1208 overwriting other allocated objects. This is not a particularly great
1209 programming practice. malloc_usable_size can be more useful in
1210 debugging and assertions, for example:
1211
1212 p = malloc(n);
1213 assert(malloc_usable_size(p) >= 256);
1214
1215 */
1216 #if __STD_C
1217 size_t public_mUSABLe(Void_t*);
1218 #else
1219 size_t public_mUSABLe();
1220 #endif
1221
1222 /*
1223 malloc_stats();
1224 Prints on stderr the amount of space obtained from the system (both
1225 via sbrk and mmap), the maximum amount (which may be more than
1226 current if malloc_trim and/or munmap got called), and the current
1227 number of bytes allocated via malloc (or realloc, etc) but not yet
1228 freed. Note that this is the number of bytes allocated, not the
1229 number requested. It will be larger than the number requested
1230 because of alignment and bookkeeping overhead. Because it includes
1231 alignment wastage as being in use, this figure may be greater than
1232 zero even when no user-level chunks are allocated.
1233
1234 The reported current and maximum system memory can be inaccurate if
1235 a program makes other calls to system memory allocation functions
1236 (normally sbrk) outside of malloc.
1237
1238 malloc_stats prints only the most commonly interesting statistics.
1239 More information can be obtained by calling mallinfo.
1240
1241 */
1242 #if __STD_C
1243 void public_mSTATs();
1244 #else
1245 void public_mSTATs();
1246 #endif
1247
1248 /* mallopt tuning options */
1249
1250 /*
1251 M_MXFAST is the maximum request size used for "fastbins", special bins
1252 that hold returned chunks without consolidating their spaces. This
1253 enables future requests for chunks of the same size to be handled
1254 very quickly, but can increase fragmentation, and thus increase the
1255 overall memory footprint of a program.
1256
1257 This malloc manages fastbins very conservatively yet still
1258 efficiently, so fragmentation is rarely a problem for values less
1259 than or equal to the default. The maximum supported value of MXFAST
1260 is 80. You wouldn't want it any higher than this anyway. Fastbins
1261 are designed especially for use with many small structs, objects or
1262 strings -- the default handles structs/objects/arrays with sizes up
1263 to 8 4byte fields, or small strings representing words, tokens,
1264 etc. Using fastbins for larger objects normally worsens
1265 fragmentation without improving speed.
1266
1267 M_MXFAST is set in REQUEST size units. It is internally used in
1268 chunksize units, which adds padding and alignment. You can reduce
1269 M_MXFAST to 0 to disable all use of fastbins. This causes the malloc
1270 algorithm to be a closer approximation of fifo-best-fit in all cases,
1271 not just for larger requests, but will generally cause it to be
1272 slower.
1273 */
1274
1275
1276 /* M_MXFAST is a standard SVID/XPG tuning option, usually listed in malloc.h */
1277 #ifndef M_MXFAST
1278 #define M_MXFAST 1
1279 #endif
1280
1281 #ifndef DEFAULT_MXFAST
1282 #define DEFAULT_MXFAST 64
1283 #endif
1284
1285
1286 /*
1287 M_TRIM_THRESHOLD is the maximum amount of unused top-most memory
1288 to keep before releasing via malloc_trim in free().
1289
1290 Automatic trimming is mainly useful in long-lived programs.
1291 Because trimming via sbrk can be slow on some systems, and can
1292 sometimes be wasteful (in cases where programs immediately
1293 afterward allocate more large chunks) the value should be high
1294 enough so that your overall system performance would improve by
1295 releasing this much memory.
1296
1297 The trim threshold and the mmap control parameters (see below)
1298 can be traded off with one another. Trimming and mmapping are
1299 two different ways of releasing unused memory back to the
1300 system. Between these two, it is often possible to keep
1301 system-level demands of a long-lived program down to a bare
1302 minimum. For example, in one test suite of sessions measuring
1303 the XF86 X server on Linux, using a trim threshold of 128K and a
1304 mmap threshold of 192K led to near-minimal long term resource
1305 consumption.
1306
1307 If you are using this malloc in a long-lived program, it should
1308 pay to experiment with these values. As a rough guide, you
1309 might set to a value close to the average size of a process
1310 (program) running on your system. Releasing this much memory
1311 would allow such a process to run in memory. Generally, it's
1312 worth it to tune for trimming rather tham memory mapping when a
1313 program undergoes phases where several large chunks are
1314 allocated and released in ways that can reuse each other's
1315 storage, perhaps mixed with phases where there are no such
1316 chunks at all. And in well-behaved long-lived programs,
1317 controlling release of large blocks via trimming versus mapping
1318 is usually faster.
1319
1320 However, in most programs, these parameters serve mainly as
1321 protection against the system-level effects of carrying around
1322 massive amounts of unneeded memory. Since frequent calls to
1323 sbrk, mmap, and munmap otherwise degrade performance, the default
1324 parameters are set to relatively high values that serve only as
1325 safeguards.
1326
1327 The trim value It must be greater than page size to have any useful
1328 effect. To disable trimming completely, you can set to
1329 (unsigned long)(-1)
1330
1331 Trim settings interact with fastbin (MXFAST) settings: Unless
1332 TRIM_FASTBINS is defined, automatic trimming never takes place upon
1333 freeing a chunk with size less than or equal to MXFAST. Trimming is
1334 instead delayed until subsequent freeing of larger chunks. However,
1335 you can still force an attempted trim by calling malloc_trim.
1336
1337 Also, trimming is not generally possible in cases where
1338 the main arena is obtained via mmap.
1339
1340 Note that the trick some people use of mallocing a huge space and
1341 then freeing it at program startup, in an attempt to reserve system
1342 memory, doesn't have the intended effect under automatic trimming,
1343 since that memory will immediately be returned to the system.
1344 */
1345
1346 #define M_TRIM_THRESHOLD -1
1347
1348 #ifndef DEFAULT_TRIM_THRESHOLD
1349 #define DEFAULT_TRIM_THRESHOLD (128 * 1024)
1350 #endif
1351
1352 /*
1353 M_TOP_PAD is the amount of extra `padding' space to allocate or
1354 retain whenever sbrk is called. It is used in two ways internally:
1355
1356 * When sbrk is called to extend the top of the arena to satisfy
1357 a new malloc request, this much padding is added to the sbrk
1358 request.
1359
1360 * When malloc_trim is called automatically from free(),
1361 it is used as the `pad' argument.
1362
1363 In both cases, the actual amount of padding is rounded
1364 so that the end of the arena is always a system page boundary.
1365
1366 The main reason for using padding is to avoid calling sbrk so
1367 often. Having even a small pad greatly reduces the likelihood
1368 that nearly every malloc request during program start-up (or
1369 after trimming) will invoke sbrk, which needlessly wastes
1370 time.
1371
1372 Automatic rounding-up to page-size units is normally sufficient
1373 to avoid measurable overhead, so the default is 0. However, in
1374 systems where sbrk is relatively slow, it can pay to increase
1375 this value, at the expense of carrying around more memory than
1376 the program needs.
1377 */
1378
1379 #define M_TOP_PAD -2
1380
1381 #ifndef DEFAULT_TOP_PAD
1382 #define DEFAULT_TOP_PAD (0)
1383 #endif
1384
1385 /*
1386 M_MMAP_THRESHOLD is the request size threshold for using mmap()
1387 to service a request. Requests of at least this size that cannot
1388 be allocated using already-existing space will be serviced via mmap.
1389 (If enough normal freed space already exists it is used instead.)
1390
1391 Using mmap segregates relatively large chunks of memory so that
1392 they can be individually obtained and released from the host
1393 system. A request serviced through mmap is never reused by any
1394 other request (at least not directly; the system may just so
1395 happen to remap successive requests to the same locations).
1396
1397 Segregating space in this way has the benefits that:
1398
1399 1. Mmapped space can ALWAYS be individually released back
1400 to the system, which helps keep the system level memory
1401 demands of a long-lived program low.
1402 2. Mapped memory can never become `locked' between
1403 other chunks, as can happen with normally allocated chunks, which
1404 means that even trimming via malloc_trim would not release them.
1405 3. On some systems with "holes" in address spaces, mmap can obtain
1406 memory that sbrk cannot.
1407
1408 However, it has the disadvantages that:
1409
1410 1. The space cannot be reclaimed, consolidated, and then
1411 used to service later requests, as happens with normal chunks.
1412 2. It can lead to more wastage because of mmap page alignment
1413 requirements
1414 3. It causes malloc performance to be more dependent on host
1415 system memory management support routines which may vary in
1416 implementation quality and may impose arbitrary
1417 limitations. Generally, servicing a request via normal
1418 malloc steps is faster than going through a system's mmap.
1419
1420 The advantages of mmap nearly always outweigh disadvantages for
1421 "large" chunks, but the value of "large" varies across systems. The
1422 default is an empirically derived value that works well in most
1423 systems.
1424 */
1425
1426 #define M_MMAP_THRESHOLD -3
1427
1428 #ifndef DEFAULT_MMAP_THRESHOLD
1429 #define DEFAULT_MMAP_THRESHOLD (128 * 1024)
1430 #endif
1431
1432 /*
1433 M_MMAP_MAX is the maximum number of requests to simultaneously
1434 service using mmap. This parameter exists because
1435 . Some systems have a limited number of internal tables for
1436 use by mmap, and using more than a few of them may degrade
1437 performance.
1438
1439 The default is set to a value that serves only as a safeguard.
1440 Setting to 0 disables use of mmap for servicing large requests. If
1441 HAVE_MMAP is not set, the default value is 0, and attempts to set it
1442 to non-zero values in mallopt will fail.
1443 */
1444
1445 #define M_MMAP_MAX -4
1446
1447 #ifndef DEFAULT_MMAP_MAX
1448 #if HAVE_MMAP
1449 #define DEFAULT_MMAP_MAX (65536)
1450 #else
1451 #define DEFAULT_MMAP_MAX (0)
1452 #endif
1453 #endif
1454
1455 #ifdef __cplusplus
1456 }; /* end of extern "C" */
1457 #endif
1458
1459 /*
1460 ========================================================================
1461 To make a fully customizable malloc.h header file, cut everything
1462 above this line, put into file malloc.h, edit to suit, and #include it
1463 on the next line, as well as in programs that use this malloc.
1464 ========================================================================
1465 */
1466
1467 /* #include "malloc.h" */
1468
1469 /* --------------------- public wrappers ---------------------- */
1470
1471 #ifdef USE_PUBLIC_MALLOC_WRAPPERS
1472
1473 /* Declare all routines as internal */
1474 #if __STD_C
1475 static Void_t* mALLOc(size_t);
1476 static void fREe(Void_t*);
1477 static Void_t* rEALLOc(Void_t*, size_t);
1478 static Void_t* mEMALIGn(size_t, size_t);
1479 static Void_t* vALLOc(size_t);
1480 static Void_t* pVALLOc(size_t);
1481 static Void_t* cALLOc(size_t, size_t);
1482 static Void_t** iCALLOc(size_t, size_t, Void_t**);
1483 static Void_t** iCOMALLOc(size_t, size_t*, Void_t**);
1484 static void cFREe(Void_t*);
1485 static int mTRIm(size_t);
1486 static size_t mUSABLe(Void_t*);
1487 static void mSTATs();
1488 static int mALLOPt(int, int);
1489 static struct mallinfo mALLINFo(void);
1490 #else
1491 static Void_t* mALLOc();
1492 static void fREe();
1493 static Void_t* rEALLOc();
1494 static Void_t* mEMALIGn();
1495 static Void_t* vALLOc();
1496 static Void_t* pVALLOc();
1497 static Void_t* cALLOc();
1498 static Void_t** iCALLOc();
1499 static Void_t** iCOMALLOc();
1500 static void cFREe();
1501 static int mTRIm();
1502 static size_t mUSABLe();
1503 static void mSTATs();
1504 static int mALLOPt();
1505 static struct mallinfo mALLINFo();
1506 #endif
1507
1508 /*
1509 MALLOC_PREACTION and MALLOC_POSTACTION should be
1510 defined to return 0 on success, and nonzero on failure.
1511 The return value of MALLOC_POSTACTION is currently ignored
1512 in wrapper functions since there is no reasonable default
1513 action to take on failure.
1514 */
1515
1516
1517 #ifdef USE_MALLOC_LOCK
1518
1519 #ifdef WIN32
1520
1521 static int mALLOC_MUTEx;
1522 #define MALLOC_PREACTION slwait(&mALLOC_MUTEx)
1523 #define MALLOC_POSTACTION slrelease(&mALLOC_MUTEx)
1524
1525 #else
1526
1527 #include <pthread.h>
1528
1529 static pthread_mutex_t mALLOC_MUTEx = PTHREAD_MUTEX_INITIALIZER;
1530
1531 #define MALLOC_PREACTION pthread_mutex_lock(&mALLOC_MUTEx)
1532 #define MALLOC_POSTACTION pthread_mutex_unlock(&mALLOC_MUTEx)
1533
1534 #endif /* USE_MALLOC_LOCK */
1535
1536 #else
1537
1538 /* Substitute anything you like for these */
1539
1540 #define MALLOC_PREACTION (0)
1541 #define MALLOC_POSTACTION (0)
1542
1543 #endif
1544
1545 Void_t* public_mALLOc(size_t bytes) {
1546 Void_t* m;
1547 if (MALLOC_PREACTION != 0) {
1548 return 0;
1549 }
1550 m = mALLOc(bytes);
1551 if (MALLOC_POSTACTION != 0) {
1552 }
1553 return m;
1554 }
1555
1556 void public_fREe(Void_t* m) {
1557 if (MALLOC_PREACTION != 0) {
1558 return;
1559 }
1560 fREe(m);
1561 if (MALLOC_POSTACTION != 0) {
1562 }
1563 }
1564
1565 Void_t* public_rEALLOc(Void_t* m, size_t bytes) {
1566 if (MALLOC_PREACTION != 0) {
1567 return 0;
1568 }
1569 m = rEALLOc(m, bytes);
1570 if (MALLOC_POSTACTION != 0) {
1571 }
1572 return m;
1573 }
1574
1575 Void_t* public_mEMALIGn(size_t alignment, size_t bytes) {
1576 Void_t* m;
1577 if (MALLOC_PREACTION != 0) {
1578 return 0;
1579 }
1580 m = mEMALIGn(alignment, bytes);
1581 if (MALLOC_POSTACTION != 0) {
1582 }
1583 return m;
1584 }
1585
1586 Void_t* public_vALLOc(size_t bytes) {
1587 Void_t* m;
1588 if (MALLOC_PREACTION != 0) {
1589 return 0;
1590 }
1591 m = vALLOc(bytes);
1592 if (MALLOC_POSTACTION != 0) {
1593 }
1594 return m;
1595 }
1596
1597 Void_t* public_pVALLOc(size_t bytes) {
1598 Void_t* m;
1599 if (MALLOC_PREACTION != 0) {
1600 return 0;
1601 }
1602 m = pVALLOc(bytes);
1603 if (MALLOC_POSTACTION != 0) {
1604 }
1605 return m;
1606 }
1607
1608 Void_t* public_cALLOc(size_t n, size_t elem_size) {
1609 Void_t* m;
1610 if (MALLOC_PREACTION != 0) {
1611 return 0;
1612 }
1613 m = cALLOc(n, elem_size);
1614 if (MALLOC_POSTACTION != 0) {
1615 }
1616 return m;
1617 }
1618
1619
1620 Void_t** public_iCALLOc(size_t n, size_t elem_size, Void_t** chunks) {
1621 Void_t** m;
1622 if (MALLOC_PREACTION != 0) {
1623 return 0;
1624 }
1625 m = iCALLOc(n, elem_size, chunks);
1626 if (MALLOC_POSTACTION != 0) {
1627 }
1628 return m;
1629 }
1630
1631 Void_t** public_iCOMALLOc(size_t n, size_t sizes[], Void_t** chunks) {
1632 Void_t** m;
1633 if (MALLOC_PREACTION != 0) {
1634 return 0;
1635 }
1636 m = iCOMALLOc(n, sizes, chunks);
1637 if (MALLOC_POSTACTION != 0) {
1638 }
1639 return m;
1640 }
1641
1642 void public_cFREe(Void_t* m) {
1643 if (MALLOC_PREACTION != 0) {
1644 return;
1645 }
1646 cFREe(m);
1647 if (MALLOC_POSTACTION != 0) {
1648 }
1649 }
1650
1651 int public_mTRIm(size_t s) {
1652 int result;
1653 if (MALLOC_PREACTION != 0) {
1654 return 0;
1655 }
1656 result = mTRIm(s);
1657 if (MALLOC_POSTACTION != 0) {
1658 }
1659 return result;
1660 }
1661
1662 size_t public_mUSABLe(Void_t* m) {
1663 size_t result;
1664 if (MALLOC_PREACTION != 0) {
1665 return 0;
1666 }
1667 result = mUSABLe(m);
1668 if (MALLOC_POSTACTION != 0) {
1669 }
1670 return result;
1671 }
1672
1673 void public_mSTATs() {
1674 if (MALLOC_PREACTION != 0) {
1675 return;
1676 }
1677 mSTATs();
1678 if (MALLOC_POSTACTION != 0) {
1679 }
1680 }
1681
1682 struct mallinfo public_mALLINFo() {
1683 struct mallinfo m;
1684 if (MALLOC_PREACTION != 0) {
1685 struct mallinfo nm = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
1686 return nm;
1687 }
1688 m = mALLINFo();
1689 if (MALLOC_POSTACTION != 0) {
1690 }
1691 return m;
1692 }
1693
1694 int public_mALLOPt(int p, int v) {
1695 int result;
1696 if (MALLOC_PREACTION != 0) {
1697 return 0;
1698 }
1699 result = mALLOPt(p, v);
1700 if (MALLOC_POSTACTION != 0) {
1701 }
1702 return result;
1703 }
1704
1705 #endif
1706
1707
1708
1709 /* ------------- Optional versions of memcopy ---------------- */
1710
1711
1712 #if USE_MEMCPY
1713
1714 /*
1715 Note: memcpy is ONLY invoked with non-overlapping regions,
1716 so the (usually slower) memmove is not needed.
1717 */
1718
1719 #define MALLOC_COPY(dest, src, nbytes) memcpy(dest, src, nbytes)
1720 #define MALLOC_ZERO(dest, nbytes) memset(dest, 0, nbytes)
1721
1722 #else /* !USE_MEMCPY */
1723
1724 /* Use Duff's device for good zeroing/copying performance. */
1725
1726 #define MALLOC_ZERO(charp, nbytes) \
1727 do { \
1728 INTERNAL_SIZE_T* mzp = (INTERNAL_SIZE_T*)(charp); \
1729 unsigned long mctmp = (nbytes)/sizeof(INTERNAL_SIZE_T); \
1730 long mcn; \
1731 if (mctmp < 8) mcn = 0; else { mcn = (mctmp-1)/8; mctmp %= 8; } \
1732 switch (mctmp) { \
1733 case 0: for(;;) { *mzp++ = 0; \
1734 case 7: *mzp++ = 0; \
1735 case 6: *mzp++ = 0; \
1736 case 5: *mzp++ = 0; \
1737 case 4: *mzp++ = 0; \
1738 case 3: *mzp++ = 0; \
1739 case 2: *mzp++ = 0; \
1740 case 1: *mzp++ = 0; if(mcn <= 0) break; mcn--; } \
1741 } \
1742 } while(0)
1743
1744 define MALLOC_COPY(dest,src,nbytes) \
1745 do { \
1746 INTERNAL_SIZE_T* mcsrc = (INTERNAL_SIZE_T*) src; \
1747 INTERNAL_SIZE_T* mcdst = (INTERNAL_SIZE_T*) dest; \
1748 unsigned long mctmp = (nbytes)/sizeof(INTERNAL_SIZE_T); \
1749 long mcn; \
1750 if (mctmp < 8) mcn = 0; else { mcn = (mctmp-1)/8; mctmp %= 8; } \
1751 switch (mctmp) { \
1752 case 0: for(;;) { *mcdst++ = *mcsrc++; \
1753 case 7: *mcdst++ = *mcsrc++; \
1754 case 6: *mcdst++ = *mcsrc++; \
1755 case 5: *mcdst++ = *mcsrc++; \
1756 case 4: *mcdst++ = *mcsrc++; \
1757 case 3: *mcdst++ = *mcsrc++; \
1758 case 2: *mcdst++ = *mcsrc++; \
1759 case 1: *mcdst++ = *mcsrc++; if(mcn <= 0) break; mcn--; } \
1760 } \
1761 } while(0)
1762
1763 #endif
1764
1765 /* ------------------ MMAP support ------------------ */
1766
1767
1768 #if HAVE_MMAP
1769
1770 #include <fcntl.h>
1771 #ifndef LACKS_SYS_MMAN_H
1772 #include <sys/mman.h>
1773 #endif
1774
1775 #if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
1776 #define MAP_ANONYMOUS MAP_ANON
1777 #endif
1778
1779 /*
1780 Nearly all versions of mmap support MAP_ANONYMOUS,
1781 so the following is unlikely to be needed, but is
1782 supplied just in case.
1783 */
1784
1785 #ifndef MAP_ANONYMOUS
1786
1787 static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */
1788
1789 #define MMAP(addr, size, prot, flags) ((dev_zero_fd < 0) ? \
1790 (dev_zero_fd = open("/dev/zero", O_RDWR), \
1791 mmap((addr), (size), (prot), (flags), dev_zero_fd, 0)) : \
1792 mmap((addr), (size), (prot), (flags), dev_zero_fd, 0))
1793
1794 #else
1795
1796 #define MMAP(addr, size, prot, flags) \
1797 (mmap((addr), (size), (prot), (flags)|MAP_ANONYMOUS, -1, 0))
1798
1799 #endif
1800
1801
1802 #endif /* HAVE_MMAP */
1803
1804
1805 /*
1806 ----------------------- Chunk representations -----------------------
1807 */
1808
1809
1810 /*
1811 This struct declaration is misleading (but accurate and necessary).
1812 It declares a "view" into memory allowing access to necessary
1813 fields at known offsets from a given base. See explanation below.
1814 */
1815
1816 struct malloc_chunk {
1817
1818 INTERNAL_SIZE_T prev_size; /* Size of previous chunk (if free). */
1819 INTERNAL_SIZE_T size; /* Size in bytes, including overhead. */
1820
1821 struct malloc_chunk* fd; /* double links -- used only if free. */
1822 struct malloc_chunk* bk;
1823 };
1824
1825
1826 typedef struct malloc_chunk* mchunkptr;
1827
1828 /*
1829 malloc_chunk details:
1830
1831 (The following includes lightly edited explanations by Colin Plumb.)
1832
1833 Chunks of memory are maintained using a `boundary tag' method as
1834 described in e.g., Knuth or Standish. (See the paper by Paul
1835 Wilson ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a
1836 survey of such techniques.) Sizes of free chunks are stored both
1837 in the front of each chunk and at the end. This makes
1838 consolidating fragmented chunks into bigger chunks very fast. The
1839 size fields also hold bits representing whether chunks are free or
1840 in use.
1841
1842 An allocated chunk looks like this:
1843
1844
1845 chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1846 | Size of previous chunk, if allocated | |
1847 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1848 | Size of chunk, in bytes |P|
1849 mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1850 | User data starts here... .
1851 . .
1852 . (malloc_usable_space() bytes) .
1853 . |
1854 nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1855 | Size of chunk |
1856 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1857
1858
1859 Where "chunk" is the front of the chunk for the purpose of most of
1860 the malloc code, but "mem" is the pointer that is returned to the
1861 user. "Nextchunk" is the beginning of the next contiguous chunk.
1862
1863 Chunks always begin on even word boundries, so the mem portion
1864 (which is returned to the user) is also on an even word boundary, and
1865 thus at least double-word aligned.
1866
1867 Free chunks are stored in circular doubly-linked lists, and look like this:
1868
1869 chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1870 | Size of previous chunk |
1871 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1872 `head:' | Size of chunk, in bytes |P|
1873 mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1874 | Forward pointer to next chunk in list |
1875 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1876 | Back pointer to previous chunk in list |
1877 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1878 | Unused space (may be 0 bytes long) .
1879 . .
1880 . |
1881 nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1882 `foot:' | Size of chunk, in bytes |
1883 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1884
1885 The P (PREV_INUSE) bit, stored in the unused low-order bit of the
1886 chunk size (which is always a multiple of two words), is an in-use
1887 bit for the *previous* chunk. If that bit is *clear*, then the
1888 word before the current chunk size contains the previous chunk
1889 size, and can be used to find the front of the previous chunk.
1890 The very first chunk allocated always has this bit set,
1891 preventing access to non-existent (or non-owned) memory. If
1892 prev_inuse is set for any given chunk, then you CANNOT determine
1893 the size of the previous chunk, and might even get a memory
1894 addressing fault when trying to do so.
1895
1896 Note that the `foot' of the current chunk is actually represented
1897 as the prev_size of the NEXT chunk. This makes it easier to
1898 deal with alignments etc but can be very confusing when trying
1899 to extend or adapt this code.
1900
1901 The two exceptions to all this are
1902
1903 1. The special chunk `top' doesn't bother using the
1904 trailing size field since there is no next contiguous chunk
1905 that would have to index off it. After initialization, `top'
1906 is forced to always exist. If it would become less than
1907 MINSIZE bytes long, it is replenished.
1908
1909 2. Chunks allocated via mmap, which have the second-lowest-order
1910 bit (IS_MMAPPED) set in their size fields. Because they are
1911 allocated one-by-one, each must contain its own trailing size field.
1912
1913 */
1914
1915 /*
1916 ---------- Size and alignment checks and conversions ----------
1917 */
1918
1919 /* conversion from malloc headers to user pointers, and back */
1920
1921 #define chunk2mem(p) ((Void_t*)((char*)(p) + 2*SIZE_SZ))
1922 #define mem2chunk(mem) ((mchunkptr)((char*)(mem) - 2*SIZE_SZ))
1923
1924 /* The smallest possible chunk */
1925 #define MIN_CHUNK_SIZE (sizeof(struct malloc_chunk))
1926
1927 /* The smallest size we can malloc is an aligned minimal chunk */
1928
1929 #define MINSIZE \
1930 (unsigned long)(((MIN_CHUNK_SIZE+MALLOC_ALIGN_MASK) & ~MALLOC_ALIGN_MASK))
1931
1932 /* Check if m has acceptable alignment */
1933
1934 #define aligned_OK(m) (((unsigned long)((m)) & (MALLOC_ALIGN_MASK)) == 0)
1935
1936
1937 /*
1938 Check if a request is so large that it would wrap around zero when
1939 padded and aligned. To simplify some other code, the bound is made
1940 low enough so that adding MINSIZE will also not wrap around sero.
1941 */
1942
1943 #define REQUEST_OUT_OF_RANGE(req) \
1944 ((unsigned long)(req) >= \
1945 (unsigned long)(INTERNAL_SIZE_T)(-2 * MINSIZE))
1946
1947 /* pad request bytes into a usable size -- internal version */
1948
1949 #define request2size(req) \
1950 (((req) + SIZE_SZ + MALLOC_ALIGN_MASK < MINSIZE) ? \
1951 MINSIZE : \
1952 ((req) + SIZE_SZ + MALLOC_ALIGN_MASK) & ~MALLOC_ALIGN_MASK)
1953
1954 /* Same, except also perform argument check */
1955
1956 #define checked_request2size(req, sz) \
1957 if (REQUEST_OUT_OF_RANGE(req)) { \
1958 MALLOC_FAILURE_ACTION; \
1959 return 0; \
1960 } \
1961 (sz) = request2size(req);
1962
1963 /*
1964 --------------- Physical chunk operations ---------------
1965 */
1966
1967
1968 /* size field is or'ed with PREV_INUSE when previous adjacent chunk in use */
1969 #define PREV_INUSE 0x1
1970
1971 /* extract inuse bit of previous chunk */
1972 #define prev_inuse(p) ((p)->size & PREV_INUSE)
1973
1974
1975 /* size field is or'ed with IS_MMAPPED if the chunk was obtained with mmap() */
1976 #define IS_MMAPPED 0x2
1977
1978 /* check for mmap()'ed chunk */
1979 #define chunk_is_mmapped(p) ((p)->size & IS_MMAPPED)
1980
1981 /*
1982 Bits to mask off when extracting size
1983
1984 Note: IS_MMAPPED is intentionally not masked off from size field in
1985 macros for which mmapped chunks should never be seen. This should
1986 cause helpful core dumps to occur if it is tried by accident by
1987 people extending or adapting this malloc.
1988 */
1989 #define SIZE_BITS (PREV_INUSE|IS_MMAPPED)
1990
1991 /* Get size, ignoring use bits */
1992 #define chunksize(p) ((p)->size & ~(SIZE_BITS))
1993
1994
1995 /* Ptr to next physical malloc_chunk. */
1996 #define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->size & ~PREV_INUSE) ))
1997
1998 /* Ptr to previous physical malloc_chunk */
1999 #define prev_chunk(p) ((mchunkptr)( ((char*)(p)) - ((p)->prev_size) ))
2000
2001 /* Treat space at ptr + offset as a chunk */
2002 #define chunk_at_offset(p, s) ((mchunkptr)(((char*)(p)) + (s)))
2003
2004 /* extract p's inuse bit */
2005 #define inuse(p)\
2006 ((((mchunkptr)(((char*)(p))+((p)->size & ~PREV_INUSE)))->size) & PREV_INUSE)
2007
2008 /* set/clear chunk as being inuse without otherwise disturbing */
2009 #define set_inuse(p)\
2010 ((mchunkptr)(((char*)(p)) + ((p)->size & ~PREV_INUSE)))->size |= PREV_INUSE
2011
2012 #define clear_inuse(p)\
2013 ((mchunkptr)(((char*)(p)) + ((p)->size & ~PREV_INUSE)))->size &= ~(PREV_INUSE)
2014
2015
2016 /* check/set/clear inuse bits in known places */
2017 #define inuse_bit_at_offset(p, s)\
2018 (((mchunkptr)(((char*)(p)) + (s)))->size & PREV_INUSE)
2019
2020 #define set_inuse_bit_at_offset(p, s)\
2021 (((mchunkptr)(((char*)(p)) + (s)))->size |= PREV_INUSE)
2022
2023 #define clear_inuse_bit_at_offset(p, s)\
2024 (((mchunkptr)(((char*)(p)) + (s)))->size &= ~(PREV_INUSE))
2025
2026
2027 /* Set size at head, without disturbing its use bit */
2028 #define set_head_size(p, s) ((p)->size = (((p)->size & PREV_INUSE) | (s)))
2029
2030 /* Set size/use field */
2031 #define set_head(p, s) ((p)->size = (s))
2032
2033 /* Set size at footer (only when chunk is not in use) */
2034 #define set_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_size = (s))
2035
2036
2037 /*
2038 -------------------- Internal data structures --------------------
2039
2040 All internal state is held in an instance of malloc_state defined
2041 below. There are no other static variables, except in two optional
2042 cases:
2043 * If USE_MALLOC_LOCK is defined, the mALLOC_MUTEx declared above.
2044 * If HAVE_MMAP is true, but mmap doesn't support
2045 MAP_ANONYMOUS, a dummy file descriptor for mmap.
2046
2047 Beware of lots of tricks that minimize the total bookkeeping space
2048 requirements. The result is a little over 1K bytes (for 4byte
2049 pointers and size_t.)
2050 */
2051
2052 /*
2053 Bins
2054
2055 An array of bin headers for free chunks. Each bin is doubly
2056 linked. The bins are approximately proportionally (log) spaced.
2057 There are a lot of these bins (128). This may look excessive, but
2058 works very well in practice. Most bins hold sizes that are
2059 unusual as malloc request sizes, but are more usual for fragments
2060 and consolidated sets of chunks, which is what these bins hold, so
2061 they can be found quickly. All procedures maintain the invariant
2062 that no consolidated chunk physically borders another one, so each
2063 chunk in a list is known to be preceeded and followed by either
2064 inuse chunks or the ends of memory.
2065
2066 Chunks in bins are kept in size order, with ties going to the
2067 approximately least recently used chunk. Ordering isn't needed
2068 for the small bins, which all contain the same-sized chunks, but
2069 facilitates best-fit allocation for larger chunks. These lists
2070 are just sequential. Keeping them in order almost never requires
2071 enough traversal to warrant using fancier ordered data
2072 structures.
2073
2074 Chunks of the same size are linked with the most
2075 recently freed at the front, and allocations are taken from the
2076 back. This results in LRU (FIFO) allocation order, which tends
2077 to give each chunk an equal opportunity to be consolidated with
2078 adjacent freed chunks, resulting in larger free chunks and less
2079 fragmentation.
2080
2081 To simplify use in double-linked lists, each bin header acts
2082 as a malloc_chunk. This avoids special-casing for headers.
2083 But to conserve space and improve locality, we allocate
2084 only the fd/bk pointers of bins, and then use repositioning tricks
2085 to treat these as the fields of a malloc_chunk*.
2086 */
2087
2088 typedef struct malloc_chunk* mbinptr;
2089
2090 /* addressing -- note that bin_at(0) does not exist */
2091 #define bin_at(m, i) ((mbinptr)((char*)&((m)->bins[(i)<<1]) - (SIZE_SZ<<1)))
2092
2093 /* analog of ++bin */
2094 #define next_bin(b) ((mbinptr)((char*)(b) + (sizeof(mchunkptr)<<1)))
2095
2096 /* Reminders about list directionality within bins */
2097 #define first(b) ((b)->fd)
2098 #define last(b) ((b)->bk)
2099
2100 /* Take a chunk off a bin list */
2101 #define unlink(P, BK, FD) { \
2102 FD = P->fd; \
2103 BK = P->bk; \
2104 FD->bk = BK; \
2105 BK->fd = FD; \
2106 }
2107
2108 /*
2109 Indexing
2110
2111 Bins for sizes < 512 bytes contain chunks of all the same size, spaced
2112 8 bytes apart. Larger bins are approximately logarithmically spaced:
2113
2114 64 bins of size 8
2115 32 bins of size 64
2116 16 bins of size 512
2117 8 bins of size 4096
2118 4 bins of size 32768
2119 2 bins of size 262144
2120 1 bin of size what's left
2121
2122 There is actually a little bit of slop in the numbers in bin_index
2123 for the sake of speed. This makes no difference elsewhere.
2124
2125 The bins top out around 1MB because we expect to service large
2126 requests via mmap.
2127 */
2128
2129 #define NBINS 128
2130 #define NSMALLBINS 64
2131 #define SMALLBIN_WIDTH 8
2132 #define MIN_LARGE_SIZE 512
2133
2134 #define in_smallbin_range(sz) \
2135 ((unsigned long)(sz) < (unsigned long)MIN_LARGE_SIZE)
2136
2137 #define smallbin_index(sz) (((unsigned)(sz)) >> 3)
2138
2139 #define largebin_index(sz) \
2140 (((((unsigned long)(sz)) >> 6) <= 32)? 56 + (((unsigned long)(sz)) >> 6): \
2141 ((((unsigned long)(sz)) >> 9) <= 20)? 91 + (((unsigned long)(sz)) >> 9): \
2142 ((((unsigned long)(sz)) >> 12) <= 10)? 110 + (((unsigned long)(sz)) >> 12): \
2143 ((((unsigned long)(sz)) >> 15) <= 4)? 119 + (((unsigned long)(sz)) >> 15): \
2144 ((((unsigned long)(sz)) >> 18) <= 2)? 124 + (((unsigned long)(sz)) >> 18): \
2145 126)
2146
2147 #define bin_index(sz) \
2148 ((in_smallbin_range(sz)) ? smallbin_index(sz) : largebin_index(sz))
2149
2150
2151 /*
2152 Unsorted chunks
2153
2154 All remainders from chunk splits, as well as all returned chunks,
2155 are first placed in the "unsorted" bin. They are then placed
2156 in regular bins after malloc gives them ONE chance to be used before
2157 binning. So, basically, the unsorted_chunks list acts as a queue,
2158 with chunks being placed on it in free (and malloc_consolidate),
2159 and taken off (to be either used or placed in bins) in malloc.
2160 */
2161
2162 /* The otherwise unindexable 1-bin is used to hold unsorted chunks. */
2163 #define unsorted_chunks(M) (bin_at(M, 1))
2164
2165 /*
2166 Top
2167
2168 The top-most available chunk (i.e., the one bordering the end of
2169 available memory) is treated specially. It is never included in
2170 any bin, is used only if no other chunk is available, and is
2171 released back to the system if it is very large (see
2172 M_TRIM_THRESHOLD). Because top initially
2173 points to its own bin with initial zero size, thus forcing
2174 extension on the first malloc request, we avoid having any special
2175 code in malloc to check whether it even exists yet. But we still
2176 need to do so when getting memory from system, so we make
2177 initial_top treat the bin as a legal but unusable chunk during the
2178 interval between initialization and the first call to
2179 sYSMALLOc. (This is somewhat delicate, since it relies on
2180 the 2 preceding words to be zero during this interval as well.)
2181 */
2182
2183 /* Conveniently, the unsorted bin can be used as dummy top on first call */
2184 #define initial_top(M) (unsorted_chunks(M))
2185
2186 /*
2187 Binmap
2188
2189 To help compensate for the large number of bins, a one-level index
2190 structure is used for bin-by-bin searching. `binmap' is a
2191 bitvector recording whether bins are definitely empty so they can
2192 be skipped over during during traversals. The bits are NOT always
2193 cleared as soon as bins are empty, but instead only
2194 when they are noticed to be empty during traversal in malloc.
2195 */
2196
2197 /* Conservatively use 32 bits per map word, even if on 64bit system */
2198 #define BINMAPSHIFT 5
2199 #define BITSPERMAP (1U << BINMAPSHIFT)
2200 #define BINMAPSIZE (NBINS / BITSPERMAP)
2201
2202 #define idx2block(i) ((i) >> BINMAPSHIFT)
2203 #define idx2bit(i) ((1U << ((i) & ((1U << BINMAPSHIFT)-1))))
2204
2205 #define mark_bin(m,i) ((m)->binmap[idx2block(i)] |= idx2bit(i))
2206 #define unmark_bin(m,i) ((m)->binmap[idx2block(i)] &= ~(idx2bit(i)))
2207 #define get_binmap(m,i) ((m)->binmap[idx2block(i)] & idx2bit(i))
2208
2209 /*
2210 Fastbins
2211
2212 An array of lists holding recently freed small chunks. Fastbins
2213 are not doubly linked. It is faster to single-link them, and
2214 since chunks are never removed from the middles of these lists,
2215 double linking is not necessary. Also, unlike regular bins, they
2216 are not even processed in FIFO order (they use faster LIFO) since
2217 ordering doesn't much matter in the transient contexts in which
2218 fastbins are normally used.
2219
2220 Chunks in fastbins keep their inuse bit set, so they cannot
2221 be consolidated with other free chunks. malloc_consolidate
2222 releases all chunks in fastbins and consolidates them with
2223 other free chunks.
2224 */
2225
2226 typedef struct malloc_chunk* mfastbinptr;
2227
2228 /* offset 2 to use otherwise unindexable first 2 bins */
2229 #define fastbin_index(sz) ((((unsigned int)(sz)) >> 3) - 2)
2230
2231 /* The maximum fastbin request size we support */
2232 #define MAX_FAST_SIZE 80
2233
2234 #define NFASTBINS (fastbin_index(request2size(MAX_FAST_SIZE))+1)
2235
2236 /*
2237 FASTBIN_CONSOLIDATION_THRESHOLD is the size of a chunk in free()
2238 that triggers automatic consolidation of possibly-surrounding
2239 fastbin chunks. This is a heuristic, so the exact value should not
2240 matter too much. It is defined at half the default trim threshold as a
2241 compromise heuristic to only attempt consolidation if it is likely
2242 to lead to trimming. However, it is not dynamically tunable, since
2243 consolidation reduces fragmentation surrounding loarge chunks even
2244 if trimming is not used.
2245 */
2246
2247 #define FASTBIN_CONSOLIDATION_THRESHOLD (65536UL)
2248
2249 /*
2250 Since the lowest 2 bits in max_fast don't matter in size comparisons,
2251 they are used as flags.
2252 */
2253
2254 /*
2255 FASTCHUNKS_BIT held in max_fast indicates that there are probably
2256 some fastbin chunks. It is set true on entering a chunk into any
2257 fastbin, and cleared only in malloc_consolidate.
2258
2259 The truth value is inverted so that have_fastchunks will be true
2260 upon startup (since statics are zero-filled), simplifying
2261 initialization checks.
2262 */
2263
2264 #define FASTCHUNKS_BIT (1U)
2265
2266 #define have_fastchunks(M) (((M)->max_fast & FASTCHUNKS_BIT) == 0)
2267 #define clear_fastchunks(M) ((M)->max_fast |= FASTCHUNKS_BIT)
2268 #define set_fastchunks(M) ((M)->max_fast &= ~FASTCHUNKS_BIT)
2269
2270 /*
2271 NONCONTIGUOUS_BIT indicates that MORECORE does not return contiguous
2272 regions. Otherwise, contiguity is exploited in merging together,
2273 when possible, results from consecutive MORECORE calls.
2274
2275 The initial value comes from MORECORE_CONTIGUOUS, but is
2276 changed dynamically if mmap is ever used as an sbrk substitute.
2277 */
2278
2279 #define NONCONTIGUOUS_BIT (2U)
2280
2281 #define contiguous(M) (((M)->max_fast & NONCONTIGUOUS_BIT) == 0)
2282 #define noncontiguous(M) (((M)->max_fast & NONCONTIGUOUS_BIT) != 0)
2283 #define set_noncontiguous(M) ((M)->max_fast |= NONCONTIGUOUS_BIT)
2284 #define set_contiguous(M) ((M)->max_fast &= ~NONCONTIGUOUS_BIT)
2285
2286 /*
2287 Set value of max_fast.
2288 Use impossibly small value if 0.
2289 Precondition: there are no existing fastbin chunks.
2290 Setting the value clears fastchunk bit but preserves noncontiguous bit.
2291 */
2292
2293 #define set_max_fast(M, s) \
2294 (M)->max_fast = (((s) == 0)? SMALLBIN_WIDTH: request2size(s)) | \
2295 FASTCHUNKS_BIT | \
2296 ((M)->max_fast & NONCONTIGUOUS_BIT)
2297
2298
2299 /*
2300 ----------- Internal state representation and initialization -----------
2301 */
2302
2303 struct malloc_state {
2304
2305 /* The maximum chunk size to be eligible for fastbin */
2306 INTERNAL_SIZE_T max_fast; /* low 2 bits used as flags */
2307
2308 /* Fastbins */
2309 mfastbinptr fastbins[NFASTBINS];
2310
2311 /* Base of the topmost chunk -- not otherwise kept in a bin */
2312 mchunkptr top;
2313
2314 /* The remainder from the most recent split of a small request */
2315 mchunkptr last_remainder;
2316
2317 /* Normal bins packed as described above */
2318 mchunkptr bins[NBINS * 2];
2319
2320 /* Bitmap of bins */
2321 unsigned int binmap[BINMAPSIZE];
2322
2323 /* Tunable parameters */
2324 unsigned long trim_threshold;
2325 INTERNAL_SIZE_T top_pad;
2326 INTERNAL_SIZE_T mmap_threshold;
2327
2328 /* Memory map support */
2329 int n_mmaps;
2330 int n_mmaps_max;
2331 int max_n_mmaps;
2332
2333 /* Cache malloc_getpagesize */
2334 unsigned int pagesize;
2335
2336 /* Statistics */
2337 INTERNAL_SIZE_T mmapped_mem;
2338 INTERNAL_SIZE_T sbrked_mem;
2339 INTERNAL_SIZE_T max_sbrked_mem;
2340 INTERNAL_SIZE_T max_mmapped_mem;
2341 INTERNAL_SIZE_T max_total_mem;
2342 };
2343
2344 typedef struct malloc_state *mstate;
2345
2346 /*
2347 There is exactly one instance of this struct in this malloc.
2348 If you are adapting this malloc in a way that does NOT use a static
2349 malloc_state, you MUST explicitly zero-fill it before using. This
2350 malloc relies on the property that malloc_state is initialized to
2351 all zeroes (as is true of C statics).
2352 */
2353
2354 static struct malloc_state av_; /* never directly referenced */
2355
2356 /*
2357 All uses of av_ are via get_malloc_state().
2358 At most one "call" to get_malloc_state is made per invocation of
2359 the public versions of malloc and free, but other routines
2360 that in turn invoke malloc and/or free may call more then once.
2361 Also, it is called in check* routines if DEBUG is set.
2362 */
2363
2364 #define get_malloc_state() (&(av_))
2365
2366 /*
2367 Initialize a malloc_state struct.
2368
2369 This is called only from within malloc_consolidate, which needs
2370 be called in the same contexts anyway. It is never called directly
2371 outside of malloc_consolidate because some optimizing compilers try
2372 to inline it at all call points, which turns out not to be an
2373 optimization at all. (Inlining it in malloc_consolidate is fine though.)
2374 */
2375
2376 #if __STD_C
2377 static void malloc_init_state(mstate av)
2378 #else
2379 static void malloc_init_state(av) mstate av;
2380 #endif
2381 {
2382 int i;
2383 mbinptr bin;
2384
2385 /* Establish circular links for normal bins */
2386 for (i = 1; i < NBINS; ++i) {
2387 bin = bin_at(av,i);
2388 bin->fd = bin->bk = bin;
2389 }
2390
2391 av->top_pad = DEFAULT_TOP_PAD;
2392 av->n_mmaps_max = DEFAULT_MMAP_MAX;
2393 av->mmap_threshold = DEFAULT_MMAP_THRESHOLD;
2394 av->trim_threshold = DEFAULT_TRIM_THRESHOLD;
2395
2396 #if !MORECORE_CONTIGUOUS
2397 set_noncontiguous(av);
2398 #endif
2399
2400 set_max_fast(av, DEFAULT_MXFAST);
2401
2402 av->top = initial_top(av);
2403 av->pagesize = malloc_getpagesize;
2404 }
2405
2406 /*
2407 Other internal utilities operating on mstates
2408 */
2409
2410 #if __STD_C
2411 static Void_t* sYSMALLOc(INTERNAL_SIZE_T, mstate);
2412 static int sYSTRIm(size_t, mstate);
2413 static void malloc_consolidate(mstate);
2414 static Void_t** iALLOc(size_t, size_t*, int, Void_t**);
2415 #else
2416 static Void_t* sYSMALLOc();
2417 static int sYSTRIm();
2418 static void malloc_consolidate();
2419 static Void_t** iALLOc();
2420 #endif
2421
2422 /*
2423 Debugging support
2424
2425 These routines make a number of assertions about the states
2426 of data structures that should be true at all times. If any
2427 are not true, it's very likely that a user program has somehow
2428 trashed memory. (It's also possible that there is a coding error
2429 in malloc. In which case, please report it!)
2430 */
2431
2432 #if ! DEBUG
2433
2434 #define check_chunk(P)
2435 #define check_free_chunk(P)
2436 #define check_inuse_chunk(P)
2437 #define check_remalloced_chunk(P,N)
2438 #define check_malloced_chunk(P,N)
2439 #define check_malloc_state()
2440
2441 #else
2442 #define check_chunk(P) do_check_chunk(P)
2443 #define check_free_chunk(P) do_check_free_chunk(P)
2444 #define check_inuse_chunk(P) do_check_inuse_chunk(P)
2445 #define check_remalloced_chunk(P,N) do_check_remalloced_chunk(P,N)
2446 #define check_malloced_chunk(P,N) do_check_malloced_chunk(P,N)
2447 #define check_malloc_state() do_check_malloc_state()
2448
2449 /*
2450 Properties of all chunks
2451 */
2452
2453 #if __STD_C
2454 static void do_check_chunk(mchunkptr p)
2455 #else
2456 static void do_check_chunk(p) mchunkptr p;
2457 #endif
2458 {
2459 mstate av = get_malloc_state();
2460 unsigned long sz = chunksize(p);
2461 /* min and max possible addresses assuming contiguous allocation */
2462 char* max_address = (char*)(av->top) + chunksize(av->top);
2463 char* min_address = max_address - av->sbrked_mem;
2464
2465 if (!chunk_is_mmapped(p)) {
2466
2467 /* Has legal address ... */
2468 if (p != av->top) {
2469 if (contiguous(av)) {
2470 assert(((char*)p) >= min_address);
2471 assert(((char*)p + sz) <= ((char*)(av->top)));
2472 }
2473 }
2474 else {
2475 /* top size is always at least MINSIZE */
2476 assert((unsigned long)(sz) >= MINSIZE);
2477 /* top predecessor always marked inuse */
2478 assert(prev_inuse(p));
2479 }
2480
2481 }
2482 else {
2483 #if HAVE_MMAP
2484 /* address is outside main heap */
2485 if (contiguous(av) && av->top != initial_top(av)) {
2486 assert(((char*)p) < min_address || ((char*)p) > max_address);
2487 }
2488 /* chunk is page-aligned */
2489 assert(((p->prev_size + sz) & (av->pagesize-1)) == 0);
2490 /* mem is aligned */
2491 assert(aligned_OK(chunk2mem(p)));
2492 #else
2493 /* force an appropriate assert violation if debug set */
2494 assert(!chunk_is_mmapped(p));
2495 #endif
2496 }
2497 }
2498
2499 /*
2500 Properties of free chunks
2501 */
2502
2503 #if __STD_C
2504 static void do_check_free_chunk(mchunkptr p)
2505 #else
2506 static void do_check_free_chunk(p) mchunkptr p;
2507 #endif
2508 {
2509 mstate av = get_malloc_state();
2510
2511 INTERNAL_SIZE_T sz = p->size & ~PREV_INUSE;
2512 mchunkptr next = chunk_at_offset(p, sz);
2513
2514 do_check_chunk(p);
2515
2516 /* Chunk must claim to be free ... */
2517 assert(!inuse(p));
2518 assert (!chunk_is_mmapped(p));
2519
2520 /* Unless a special marker, must have OK fields */
2521 if ((unsigned long)(sz) >= MINSIZE)
2522 {
2523 assert((sz & MALLOC_ALIGN_MASK) == 0);
2524 assert(aligned_OK(chunk2mem(p)));
2525 /* ... matching footer field */
2526 assert(next->prev_size == sz);
2527 /* ... and is fully consolidated */
2528 assert(prev_inuse(p));
2529 assert (next == av->top || inuse(next));
2530
2531 /* ... and has minimally sane links */
2532 assert(p->fd->bk == p);
2533 assert(p->bk->fd == p);
2534 }
2535 else /* markers are always of size SIZE_SZ */
2536 assert(sz == SIZE_SZ);
2537 }
2538
2539 /*
2540 Properties of inuse chunks
2541 */
2542
2543 #if __STD_C
2544 static void do_check_inuse_chunk(mchunkptr p)
2545 #else
2546 static void do_check_inuse_chunk(p) mchunkptr p;
2547 #endif
2548 {
2549 mstate av = get_malloc_state();
2550 mchunkptr next;
2551 do_check_chunk(p);
2552
2553 if (chunk_is_mmapped(p))
2554 return; /* mmapped chunks have no next/prev */
2555
2556 /* Check whether it claims to be in use ... */
2557 assert(inuse(p));
2558
2559 next = next_chunk(p);
2560
2561 /* ... and is surrounded by OK chunks.
2562 Since more things can be checked with free chunks than inuse ones,
2563 if an inuse chunk borders them and debug is on, it's worth doing them.
2564 */
2565 if (!prev_inuse(p)) {
2566 /* Note that we cannot even look at prev unless it is not inuse */
2567 mchunkptr prv = prev_chunk(p);
2568 assert(next_chunk(prv) == p);
2569 do_check_free_chunk(prv);
2570 }
2571
2572 if (next == av->top) {
2573 assert(prev_inuse(next));
2574 assert(chunksize(next) >= MINSIZE);
2575 }
2576 else if (!inuse(next))
2577 do_check_free_chunk(next);
2578 }
2579
2580 /*
2581 Properties of chunks recycled from fastbins
2582 */
2583
2584 #if __STD_C
2585 static void do_check_remalloced_chunk(mchunkptr p, INTERNAL_SIZE_T s)
2586 #else
2587 static void do_check_remalloced_chunk(p, s) mchunkptr p; INTERNAL_SIZE_T s;
2588 #endif
2589 {
2590 INTERNAL_SIZE_T sz = p->size & ~PREV_INUSE;
2591
2592 do_check_inuse_chunk(p);
2593
2594 /* Legal size ... */
2595 assert((sz & MALLOC_ALIGN_MASK) == 0);
2596 assert((unsigned long)(sz) >= MINSIZE);
2597 /* ... and alignment */
2598 assert(aligned_OK(chunk2mem(p)));
2599 /* chunk is less than MINSIZE more than request */
2600 assert((long)(sz) - (long)(s) >= 0);
2601 assert((long)(sz) - (long)(s + MINSIZE) < 0);
2602 }
2603
2604 /*
2605 Properties of nonrecycled chunks at the point they are malloced
2606 */
2607
2608 #if __STD_C
2609 static void do_check_malloced_chunk(mchunkptr p, INTERNAL_SIZE_T s)
2610 #else
2611 static void do_check_malloced_chunk(p, s) mchunkptr p; INTERNAL_SIZE_T s;
2612 #endif
2613 {
2614 /* same as recycled case ... */
2615 do_check_remalloced_chunk(p, s);
2616
2617 /*
2618 ... plus, must obey implementation invariant that prev_inuse is
2619 always true of any allocated chunk; i.e., that each allocated
2620 chunk borders either a previously allocated and still in-use
2621 chunk, or the base of its memory arena. This is ensured
2622 by making all allocations from the the `lowest' part of any found
2623 chunk. This does not necessarily hold however for chunks
2624 recycled via fastbins.
2625 */
2626
2627 assert(prev_inuse(p));
2628 }
2629
2630
2631 /*
2632 Properties of malloc_state.
2633
2634 This may be useful for debugging malloc, as well as detecting user
2635 programmer errors that somehow write into malloc_state.
2636
2637 If you are extending or experimenting with this malloc, you can
2638 probably figure out how to hack this routine to print out or
2639 display chunk addresses, sizes, bins, and other instrumentation.
2640 */
2641
2642 static void do_check_malloc_state()
2643 {
2644 mstate av = get_malloc_state();
2645 int i;
2646 mchunkptr p;
2647 mchunkptr q;
2648 mbinptr b;
2649 unsigned int binbit;
2650 int empty;
2651 unsigned int idx;
2652 INTERNAL_SIZE_T size;
2653 unsigned long total = 0;
2654 int max_fast_bin;
2655
2656 /* internal size_t must be no wider than pointer type */
2657 assert(sizeof(INTERNAL_SIZE_T) <= sizeof(char*));
2658
2659 /* alignment is a power of 2 */
2660 assert((MALLOC_ALIGNMENT & (MALLOC_ALIGNMENT-1)) == 0);
2661
2662 /* cannot run remaining checks until fully initialized */
2663 if (av->top == 0 || av->top == initial_top(av))
2664 return;
2665
2666 /* pagesize is a power of 2 */
2667 assert((av->pagesize & (av->pagesize-1)) == 0);
2668
2669 /* properties of fastbins */
2670
2671 /* max_fast is in allowed range */
2672 assert((av->max_fast & ~1) <= request2size(MAX_FAST_SIZE));
2673
2674 max_fast_bin = fastbin_index(av->max_fast);
2675
2676 for (i = 0; i < NFASTBINS; ++i) {
2677 p = av->fastbins[i];
2678
2679 /* all bins past max_fast are empty */
2680 if (i > max_fast_bin)
2681 assert(p == 0);
2682
2683 while (p != 0) {
2684 /* each chunk claims to be inuse */
2685 do_check_inuse_chunk(p);
2686 total += chunksize(p);
2687 /* chunk belongs in this bin */
2688 assert(fastbin_index(chunksize(p)) == i);
2689 p = p->fd;
2690 }
2691 }
2692
2693 if (total != 0)
2694 assert(have_fastchunks(av));
2695 else if (!have_fastchunks(av))
2696 assert(total == 0);
2697
2698 /* check normal bins */
2699 for (i = 1; i < NBINS; ++i) {
2700 b = bin_at(av,i);
2701
2702 /* binmap is accurate (except for bin 1 == unsorted_chunks) */
2703 if (i >= 2) {
2704 binbit = get_binmap(av,i);
2705 empty = last(b) == b;
2706 if (!binbit)
2707 assert(empty);
2708 else if (!empty)
2709 assert(binbit);
2710 }
2711
2712 for (p = last(b); p != b; p = p->bk) {
2713 /* each chunk claims to be free */
2714 do_check_free_chunk(p);
2715 size = chunksize(p);
2716 total += size;
2717 if (i >= 2) {
2718 /* chunk belongs in bin */
2719 idx = bin_index(size);
2720 assert(idx == i);
2721 /* lists are sorted */
2722 assert(p->bk == b ||
2723 (unsigned long)chunksize(p->bk) >= (unsigned long)chunksize(p));
2724 }
2725 /* chunk is followed by a legal chain of inuse chunks */
2726 for (q = next_chunk(p);
2727 (q != av->top && inuse(q) &&
2728 (unsigned long)(chunksize(q)) >= MINSIZE);
2729 q = next_chunk(q))
2730 do_check_inuse_chunk(q);
2731 }
2732 }
2733
2734 /* top chunk is OK */
2735 check_chunk(av->top);
2736
2737 /* sanity checks for statistics */
2738
2739 assert(total <= (unsigned long)(av->max_total_mem));
2740 assert(av->n_mmaps >= 0);
2741 assert(av->n_mmaps <= av->n_mmaps_max);
2742 assert(av->n_mmaps <= av->max_n_mmaps);
2743
2744 assert((unsigned long)(av->sbrked_mem) <=
2745 (unsigned long)(av->max_sbrked_mem));
2746
2747 assert((unsigned long)(av->mmapped_mem) <=
2748 (unsigned long)(av->max_mmapped_mem));
2749
2750 assert((unsigned long)(av->max_total_mem) >=
2751 (unsigned long)(av->mmapped_mem) + (unsigned long)(av->sbrked_mem));
2752 }
2753 #endif
2754
2755
2756 /* ----------- Routines dealing with system allocation -------------- */
2757
2758 /*
2759 sysmalloc handles malloc cases requiring more memory from the system.
2760 On entry, it is assumed that av->top does not have enough
2761 space to service request for nb bytes, thus requiring that av->top
2762 be extended or replaced.
2763 */
2764
2765 #if __STD_C
2766 static Void_t* sYSMALLOc(INTERNAL_SIZE_T nb, mstate av)
2767 #else
2768 static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av;
2769 #endif
2770 {
2771 mchunkptr old_top; /* incoming value of av->top */
2772 INTERNAL_SIZE_T old_size; /* its size */
2773 char* old_end; /* its end address */
2774
2775 long size; /* arg to first MORECORE or mmap call */
2776 char* brk; /* return value from MORECORE */
2777
2778 long correction; /* arg to 2nd MORECORE call */
2779 char* snd_brk; /* 2nd return val */
2780
2781 INTERNAL_SIZE_T front_misalign; /* unusable bytes at front of new space */
2782 INTERNAL_SIZE_T end_misalign; /* partial page left at end of new space */
2783 char* aligned_brk; /* aligned offset into brk */
2784
2785 mchunkptr p; /* the allocated/returned chunk */
2786 mchunkptr remainder; /* remainder from allocation */
2787 unsigned long remainder_size; /* its size */
2788
2789 unsigned long sum; /* for updating stats */
2790
2791 size_t pagemask = av->pagesize - 1;
2792
2793
2794 #if HAVE_MMAP
2795
2796 /*
2797 If have mmap, and the request size meets the mmap threshold, and
2798 the system supports mmap, and there are few enough currently
2799 allocated mmapped regions, try to directly map this request
2800 rather than expanding top.
2801 */
2802
2803 if ((unsigned long)(nb) >= (unsigned long)(av->mmap_threshold) &&
2804 (av->n_mmaps < av->n_mmaps_max)) {
2805
2806 char* mm; /* return value from mmap call*/
2807
2808 /*
2809 Round up size to nearest page. For mmapped chunks, the overhead
2810 is one SIZE_SZ unit larger than for normal chunks, because there
2811 is no following chunk whose prev_size field could be used.
2812 */
2813 size = (nb + SIZE_SZ + MALLOC_ALIGN_MASK + pagemask) & ~pagemask;
2814
2815 /* Don't try if size wraps around 0 */
2816 if ((unsigned long)(size) > (unsigned long)(nb)) {
2817
2818 mm = (char*)(MMAP(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE));
2819
2820 if (mm != (char*)(MORECORE_FAILURE)) {
2821
2822 /*
2823 The offset to the start of the mmapped region is stored
2824 in the prev_size field of the chunk. This allows us to adjust
2825 returned start address to meet alignment requirements here
2826 and in memalign(), and still be able to compute proper
2827 address argument for later munmap in free() and realloc().
2828 */
2829
2830 front_misalign = (INTERNAL_SIZE_T)chunk2mem(mm) & MALLOC_ALIGN_MASK;
2831 if (front_misalign > 0) {
2832 correction = MALLOC_ALIGNMENT - front_misalign;
2833 p = (mchunkptr)(mm + correction);
2834 p->prev_size = correction;
2835 set_head(p, (size - correction) |IS_MMAPPED);
2836 }
2837 else {
2838 p = (mchunkptr)mm;
2839 set_head(p, size|IS_MMAPPED);
2840 }
2841
2842 /* update statistics */
2843
2844 if (++av->n_mmaps > av->max_n_mmaps)
2845 av->max_n_mmaps = av->n_mmaps;
2846
2847 sum = av->mmapped_mem += size;
2848 if (sum > (unsigned long)(av->max_mmapped_mem))
2849 av->max_mmapped_mem = sum;
2850 sum += av->sbrked_mem;
2851 if (sum > (unsigned long)(av->max_total_mem))
2852 av->max_total_mem = sum;
2853
2854 check_chunk(p);
2855
2856 return chunk2mem(p);
2857 }
2858 }
2859 }
2860 #endif
2861
2862 /* Record incoming configuration of top */
2863
2864 old_top = av->top;
2865 old_size = chunksize(old_top);
2866 old_end = (char*)(chunk_at_offset(old_top, old_size));
2867
2868 brk = snd_brk = (char*)(MORECORE_FAILURE);
2869
2870 /*
2871 If not the first time through, we require old_size to be
2872 at least MINSIZE and to have prev_inuse set.
2873 */
2874
2875 assert((old_top == initial_top(av) && old_size == 0) ||
2876 ((unsigned long) (old_size) >= MINSIZE &&
2877 prev_inuse(old_top)));
2878
2879 /* Precondition: not enough current space to satisfy nb request */
2880 assert((unsigned long)(old_size) < (unsigned long)(nb + MINSIZE));
2881
2882 /* Precondition: all fastbins are consolidated */
2883 assert(!have_fastchunks(av));
2884
2885
2886 /* Request enough space for nb + pad + overhead */
2887
2888 size = nb + av->top_pad + MINSIZE;
2889
2890 /*
2891 If contiguous, we can subtract out existing space that we hope to
2892 combine with new space. We add it back later only if
2893 we don't actually get contiguous space.
2894 */
2895
2896 if (contiguous(av))
2897 size -= old_size;
2898
2899 /*
2900 Round to a multiple of page size.
2901 If MORECORE is not contiguous, this ensures that we only call it
2902 with whole-page arguments. And if MORECORE is contiguous and
2903 this is not first time through, this preserves page-alignment of
2904 previous calls. Otherwise, we correct to page-align below.
2905 */
2906
2907 size = (size + pagemask) & ~pagemask;
2908
2909 /*
2910 Don't try to call MORECORE if argument is so big as to appear
2911 negative. Note that since mmap takes size_t arg, it may succeed
2912 below even if we cannot call MORECORE.
2913 */
2914
2915 if (size > 0)
2916 brk = (char*)(MORECORE(size));
2917
2918 /*
2919 If have mmap, try using it as a backup when MORECORE fails or
2920 cannot be used. This is worth doing on systems that have "holes" in
2921 address space, so sbrk cannot extend to give contiguous space, but
2922 space is available elsewhere. Note that we ignore mmap max count
2923 and threshold limits, since the space will not be used as a
2924 segregated mmap region.
2925 */
2926
2927 #if HAVE_MMAP
2928 if (brk == (char*)(MORECORE_FAILURE)) {
2929
2930 /* Cannot merge with old top, so add its size back in */
2931 if (contiguous(av))
2932 size = (size + old_size + pagemask) & ~pagemask;
2933
2934 /* If we are relying on mmap as backup, then use larger units */
2935 if ((unsigned long)(size) < (unsigned long)(MMAP_AS_MORECORE_SIZE))
2936 size = MMAP_AS_MORECORE_SIZE;
2937
2938 /* Don't try if size wraps around 0 */
2939 if ((unsigned long)(size) > (unsigned long)(nb)) {
2940
2941 brk = (char*)(MMAP(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE));
2942
2943 if (brk != (char*)(MORECORE_FAILURE)) {
2944
2945 /* We do not need, and cannot use, another sbrk call to find end */
2946 snd_brk = brk + size;
2947
2948 /*
2949 Record that we no longer have a contiguous sbrk region.
2950 After the first time mmap is used as backup, we do not
2951 ever rely on contiguous space since this could incorrectly
2952 bridge regions.
2953 */
2954 set_noncontiguous(av);
2955 }
2956 }
2957 }
2958 #endif
2959
2960 if (brk != (char*)(MORECORE_FAILURE)) {
2961 av->sbrked_mem += size;
2962
2963 /*
2964 If MORECORE extends previous space, we can likewise extend top size.
2965 */
2966
2967 if (brk == old_end && snd_brk == (char*)(MORECORE_FAILURE)) {
2968 set_head(old_top, (size + old_size) | PREV_INUSE);
2969 }
2970
2971 /*
2972 Otherwise, make adjustments:
2973
2974 * If the first time through or noncontiguous, we need to call sbrk
2975 just to find out where the end of memory lies.
2976
2977 * We need to ensure that all returned chunks from malloc will meet
2978 MALLOC_ALIGNMENT
2979
2980 * If there was an intervening foreign sbrk, we need to adjust sbrk
2981 request size to account for fact that we will not be able to
2982 combine new space with existing space in old_top.
2983
2984 * Almost all systems internally allocate whole pages at a time, in
2985 which case we might as well use the whole last page of request.
2986 So we allocate enough more memory to hit a page boundary now,
2987 which in turn causes future contiguous calls to page-align.
2988 */
2989
2990 else {
2991 front_misalign = 0;
2992 end_misalign = 0;
2993 correction = 0;
2994 aligned_brk = brk;
2995
2996 /* handle contiguous cases */
2997 if (contiguous(av)) {
2998
2999 /* Guarantee alignment of first new chunk made from this space */
3000
3001 front_misalign = (INTERNAL_SIZE_T)chunk2mem(brk) & MALLOC_ALIGN_MASK;
3002 if (front_misalign > 0) {
3003
3004 /*
3005 Skip over some bytes to arrive at an aligned position.
3006 We don't need to specially mark these wasted front bytes.
3007 They will never be accessed anyway because
3008 prev_inuse of av->top (and any chunk created from its start)
3009 is always true after initialization.
3010 */
3011
3012 correction = MALLOC_ALIGNMENT - front_misalign;
3013 aligned_brk += correction;
3014 }
3015
3016 /*
3017 If this isn't adjacent to existing space, then we will not
3018 be able to merge with old_top space, so must add to 2nd request.
3019 */
3020
3021 correction += old_size;
3022
3023 /* Extend the end address to hit a page boundary */
3024 end_misalign = (INTERNAL_SIZE_T)(brk + size + correction);
3025 correction += ((end_misalign + pagemask) & ~pagemask) - end_misalign;
3026
3027 assert(correction >= 0);
3028 snd_brk = (char*)(MORECORE(correction));
3029
3030 /*
3031 If can't allocate correction, try to at least find out current
3032 brk. It might be enough to proceed without failing.
3033
3034 Note that if second sbrk did NOT fail, we assume that space
3035 is contiguous with first sbrk. This is a safe assumption unless
3036 program is multithreaded but doesn't use locks and a foreign sbrk
3037 occurred between our first and second calls.
3038 */
3039
3040 if (snd_brk == (char*)(MORECORE_FAILURE)) {
3041 correction = 0;
3042 snd_brk = (char*)(MORECORE(0));
3043 }
3044 }
3045
3046 /* handle non-contiguous cases */
3047 else {
3048 /* MORECORE/mmap must correctly align */
3049 assert(((unsigned long)chunk2mem(brk) & MALLOC_ALIGN_MASK) == 0);
3050
3051 /* Find out current end of memory */
3052 if (snd_brk == (char*)(MORECORE_FAILURE)) {
3053 snd_brk = (char*)(MORECORE(0));
3054 }
3055 }
3056
3057 /* Adjust top based on results of second sbrk */
3058 if (snd_brk != (char*)(MORECORE_FAILURE)) {
3059 av->top = (mchunkptr)aligned_brk;
3060 set_head(av->top, (snd_brk - aligned_brk + correction) | PREV_INUSE);
3061 av->sbrked_mem += correction;
3062
3063 /*
3064 If not the first time through, we either have a
3065 gap due to foreign sbrk or a non-contiguous region. Insert a
3066 double fencepost at old_top to prevent consolidation with space
3067 we don't own. These fenceposts are artificial chunks that are
3068 marked as inuse and are in any case too small to use. We need
3069 two to make sizes and alignments work out.
3070 */
3071
3072 if (old_size != 0) {
3073 /*
3074 Shrink old_top to insert fenceposts, keeping size a
3075 multiple of MALLOC_ALIGNMENT. We know there is at least
3076 enough space in old_top to do this.
3077 */
3078 old_size = (old_size - 3*SIZE_SZ) & ~MALLOC_ALIGN_MASK;
3079 set_head(old_top, old_size | PREV_INUSE);
3080
3081 /*
3082 Note that the following assignments completely overwrite
3083 old_top when old_size was previously MINSIZE. This is
3084 intentional. We need the fencepost, even if old_top otherwise gets
3085 lost.
3086 */
3087 chunk_at_offset(old_top, old_size )->size =
3088 SIZE_SZ|PREV_INUSE;
3089
3090 chunk_at_offset(old_top, old_size + SIZE_SZ)->size =
3091 SIZE_SZ|PREV_INUSE;
3092
3093 /* If possible, release the rest. */
3094 if (old_size >= MINSIZE) {
3095 fREe(chunk2mem(old_top));
3096 }
3097
3098 }
3099 }
3100 }
3101
3102 /* Update statistics */
3103 sum = av->sbrked_mem;
3104 if (sum > (unsigned long)(av->max_sbrked_mem))
3105 av->max_sbrked_mem = sum;
3106
3107 sum += av->mmapped_mem;
3108 if (sum > (unsigned long)(av->max_total_mem))
3109 av->max_total_mem = sum;
3110
3111 check_malloc_state();
3112
3113 /* finally, do the allocation */
3114 p = av->top;
3115 size = chunksize(p);
3116
3117 /* check that one of the above allocation paths succeeded */
3118 if ((unsigned long)(size) >= (unsigned long)(nb + MINSIZE)) {
3119 remainder_size = size - nb;
3120 remainder = chunk_at_offset(p, nb);
3121 av->top = remainder;
3122 set_head(p, nb | PREV_INUSE);
3123 set_head(remainder, remainder_size | PREV_INUSE);
3124 check_malloced_chunk(p, nb);
3125 return chunk2mem(p);
3126 }
3127 }
3128
3129 /* catch all failure paths */
3130 MALLOC_FAILURE_ACTION;
3131 return 0;
3132 }
3133
3134
3135 /*
3136 sYSTRIm is an inverse of sorts to sYSMALLOc. It gives memory back
3137 to the system (via negative arguments to sbrk) if there is unused
3138 memory at the `high' end of the malloc pool. It is called
3139 automatically by free() when top space exceeds the trim
3140 threshold. It is also called by the public malloc_trim routine. It
3141 returns 1 if it actually released any memory, else 0.
3142 */
3143
3144 #if __STD_C
3145 static int sYSTRIm(size_t pad, mstate av)
3146 #else
3147 static int sYSTRIm(pad, av) size_t pad; mstate av;
3148 #endif
3149 {
3150 long top_size; /* Amount of top-most memory */
3151 long extra; /* Amount to release */
3152 long released; /* Amount actually released */
3153 char* current_brk; /* address returned by pre-check sbrk call */
3154 char* new_brk; /* address returned by post-check sbrk call */
3155 size_t pagesz;
3156
3157 pagesz = av->pagesize;
3158 top_size = chunksize(av->top);
3159
3160 /* Release in pagesize units, keeping at least one page */
3161 extra = ((top_size - pad - MINSIZE + (pagesz-1)) / pagesz - 1) * pagesz;
3162
3163 if (extra > 0) {
3164
3165 /*
3166 Only proceed if end of memory is where we last set it.
3167 This avoids problems if there were foreign sbrk calls.
3168 */
3169 current_brk = (char*)(MORECORE(0));
3170 if (current_brk == (char*)(av->top) + top_size) {
3171
3172 /*
3173 Attempt to release memory. We ignore MORECORE return value,
3174 and instead call again to find out where new end of memory is.
3175 This avoids problems if first call releases less than we asked,
3176 of if failure somehow altered brk value. (We could still
3177 encounter problems if it altered brk in some very bad way,
3178 but the only thing we can do is adjust anyway, which will cause
3179 some downstream failure.)
3180 */
3181
3182 MORECORE(-extra);
3183 new_brk = (char*)(MORECORE(0));
3184
3185 if (new_brk != (char*)MORECORE_FAILURE) {
3186 released = (long)(current_brk - new_brk);
3187
3188 if (released != 0) {
3189 /* Success. Adjust top. */
3190 av->sbrked_mem -= released;
3191 set_head(av->top, (top_size - released) | PREV_INUSE);
3192 check_malloc_state();
3193 return 1;
3194 }
3195 }
3196 }
3197 }
3198 return 0;
3199 }
3200
3201 /*
3202 ------------------------------ malloc ------------------------------
3203 */
3204
3205 #if __STD_C
3206 Void_t* mALLOc(size_t bytes)
3207 #else
3208 Void_t* mALLOc(bytes) size_t bytes;
3209 #endif
3210 {
3211 mstate av = get_malloc_state();
3212
3213 INTERNAL_SIZE_T nb; /* normalized request size */
3214 unsigned int idx; /* associated bin index */
3215 mbinptr bin; /* associated bin */
3216 mfastbinptr* fb; /* associated fastbin */
3217
3218 mchunkptr victim; /* inspected/selected chunk */
3219 INTERNAL_SIZE_T size; /* its size */
3220 int victim_index; /* its bin index */
3221
3222 mchunkptr remainder; /* remainder from a split */
3223 unsigned long remainder_size; /* its size */
3224
3225 unsigned int block; /* bit map traverser */
3226 unsigned int bit; /* bit map traverser */
3227 unsigned int map; /* current word of binmap */
3228
3229 mchunkptr fwd; /* misc temp for linking */
3230 mchunkptr bck; /* misc temp for linking */
3231
3232 /*
3233 Convert request size to internal form by adding SIZE_SZ bytes
3234 overhead plus possibly more to obtain necessary alignment and/or
3235 to obtain a size of at least MINSIZE, the smallest allocatable
3236 size. Also, checked_request2size traps (returning 0) request sizes
3237 that are so large that they wrap around zero when padded and
3238 aligned.
3239 */
3240
3241 checked_request2size(bytes, nb);
3242
3243 /*
3244 If the size qualifies as a fastbin, first check corresponding bin.
3245 This code is safe to execute even if av is not yet initialized, so we
3246 can try it without checking, which saves some time on this fast path.
3247 */
3248
3249 if ((unsigned long)(nb) <= (unsigned long)(av->max_fast)) {
3250 fb = &(av->fastbins[(fastbin_index(nb))]);
3251 if ( (victim = *fb) != 0) {
3252 *fb = victim->fd;
3253 check_remalloced_chunk(victim, nb);
3254 return chunk2mem(victim);
3255 }
3256 }
3257
3258 /*
3259 If a small request, check regular bin. Since these "smallbins"
3260 hold one size each, no searching within bins is necessary.
3261 (For a large request, we need to wait until unsorted chunks are
3262 processed to find best fit. But for small ones, fits are exact
3263 anyway, so we can check now, which is faster.)
3264 */
3265
3266 if (in_smallbin_range(nb)) {
3267 idx = smallbin_index(nb);
3268 bin = bin_at(av,idx);
3269
3270 if ( (victim = last(bin)) != bin) {
3271 if (victim == 0) /* initialization check */
3272 malloc_consolidate(av);
3273 else {
3274 bck = victim->bk;
3275 set_inuse_bit_at_offset(victim, nb);
3276 bin->bk = bck;
3277 bck->fd = bin;
3278
3279 check_malloced_chunk(victim, nb);
3280 return chunk2mem(victim);
3281 }
3282 }
3283 }
3284
3285 /*
3286 If this is a large request, consolidate fastbins before continuing.
3287 While it might look excessive to kill all fastbins before
3288 even seeing if there is space available, this avoids
3289 fragmentation problems normally associated with fastbins.
3290 Also, in practice, programs tend to have runs of either small or
3291 large requests, but less often mixtures, so consolidation is not
3292 invoked all that often in most programs. And the programs that
3293 it is called frequently in otherwise tend to fragment.
3294 */
3295
3296 else {
3297 idx = largebin_index(nb);
3298 if (have_fastchunks(av))
3299 malloc_consolidate(av);
3300 }
3301
3302 /*
3303 Process recently freed or remaindered chunks, taking one only if
3304 it is exact fit, or, if this a small request, the chunk is remainder from
3305 the most recent non-exact fit. Place other traversed chunks in
3306 bins. Note that this step is the only place in any routine where
3307 chunks are placed in bins.
3308
3309 The outer loop here is needed because we might not realize until
3310 near the end of malloc that we should have consolidated, so must
3311 do so and retry. This happens at most once, and only when we would
3312 otherwise need to expand memory to service a "small" request.
3313 */
3314
3315 for(;;) {
3316
3317 while ( (victim = unsorted_chunks(av)->bk) != unsorted_chunks(av)) {
3318 bck = victim->bk;
3319 size = chunksize(victim);
3320
3321 /*
3322 If a small request, try to use last remainder if it is the
3323 only chunk in unsorted bin. This helps promote locality for
3324 runs of consecutive small requests. This is the only
3325 exception to best-fit, and applies only when there is
3326 no exact fit for a small chunk.
3327 */
3328
3329 if (in_smallbin_range(nb) &&
3330 bck == unsorted_chunks(av) &&
3331 victim == av->last_remainder &&
3332 (unsigned long)(size) > (unsigned long)(nb + MINSIZE)) {
3333
3334 /* split and reattach remainder */
3335 remainder_size = size - nb;
3336 remainder = chunk_at_offset(victim, nb);
3337 unsorted_chunks(av)->bk = unsorted_chunks(av)->fd = remainder;
3338 av->last_remainder = remainder;
3339 remainder->bk = remainder->fd = unsorted_chunks(av);
3340
3341 set_head(victim, nb | PREV_INUSE);
3342 set_head(remainder, remainder_size | PREV_INUSE);
3343 set_foot(remainder, remainder_size);
3344
3345 check_malloced_chunk(victim, nb);
3346 return chunk2mem(victim);
3347 }
3348
3349 /* remove from unsorted list */
3350 unsorted_chunks(av)->bk = bck;
3351 bck->fd = unsorted_chunks(av);
3352
3353 /* Take now instead of binning if exact fit */
3354
3355 if (size == nb) {
3356 set_inuse_bit_at_offset(victim, size);
3357 check_malloced_chunk(victim, nb);
3358 return chunk2mem(victim);
3359 }
3360
3361 /* place chunk in bin */
3362
3363 if (in_smallbin_range(size)) {
3364 victim_index = smallbin_index(size);
3365 bck = bin_at(av, victim_index);
3366 fwd = bck->fd;
3367 }
3368 else {
3369 victim_index = largebin_index(size);
3370 bck = bin_at(av, victim_index);
3371 fwd = bck->fd;
3372
3373 /* maintain large bins in sorted order */
3374 if (fwd != bck) {
3375 size |= PREV_INUSE; /* Or with inuse bit to speed comparisons */
3376 /* if smaller than smallest, bypass loop below */
3377 if ((unsigned long)(size) <= (unsigned long)(bck->bk->size)) {
3378 fwd = bck;
3379 bck = bck->bk;
3380 }
3381 else {
3382 while ((unsigned long)(size) < (unsigned long)(fwd->size))
3383 fwd = fwd->fd;
3384 bck = fwd->bk;
3385 }
3386 }
3387 }
3388
3389 mark_bin(av, victim_index);
3390 victim->bk = bck;
3391 victim->fd = fwd;
3392 fwd->bk = victim;
3393 bck->fd = victim;
3394 }
3395
3396 /*
3397 If a large request, scan through the chunks of current bin in
3398 sorted order to find smallest that fits. This is the only step
3399 where an unbounded number of chunks might be scanned without doing
3400 anything useful with them. However the lists tend to be short.
3401 */
3402
3403 if (!in_smallbin_range(nb)) {
3404 bin = bin_at(av, idx);
3405
3406 /* skip scan if empty or largest chunk is too small */
3407 if ((victim = last(bin)) != bin &&
3408 (unsigned long)(first(bin)->size) >= (unsigned long)(nb)) {
3409
3410 while (((unsigned long)(size = chunksize(victim)) <
3411 (unsigned long)(nb)))
3412 victim = victim->bk;
3413
3414 remainder_size = size - nb;
3415 unlink(victim, bck, fwd);
3416
3417 /* Exhaust */
3418 if (remainder_size < MINSIZE) {
3419 set_inuse_bit_at_offset(victim, size);
3420 check_malloced_chunk(victim, nb);
3421 return chunk2mem(victim);
3422 }
3423 /* Split */
3424 else {
3425 remainder = chunk_at_offset(victim, nb);
3426 unsorted_chunks(av)->bk = unsorted_chunks(av)->fd = remainder;
3427 remainder->bk = remainder->fd = unsorted_chunks(av);
3428 set_head(victim, nb | PREV_INUSE);
3429 set_head(remainder, remainder_size | PREV_INUSE);
3430 set_foot(remainder, remainder_size);
3431 check_malloced_chunk(victim, nb);
3432 return chunk2mem(victim);
3433 }
3434 }
3435 }
3436
3437 /*
3438 Search for a chunk by scanning bins, starting with next largest
3439 bin. This search is strictly by best-fit; i.e., the smallest
3440 (with ties going to approximately the least recently used) chunk
3441 that fits is selected.
3442
3443 The bitmap avoids needing to check that most blocks are nonempty.
3444 The particular case of skipping all bins during warm-up phases
3445 when no chunks have been returned yet is faster than it might look.
3446 */
3447
3448 ++idx;
3449 bin = bin_at(av,idx);
3450 block = idx2block(idx);
3451 map = av->binmap[block];
3452 bit = idx2bit(idx);
3453
3454 for (;;) {
3455
3456 /* Skip rest of block if there are no more set bits in this block. */
3457 if (bit > map || bit == 0) {
3458 do {
3459 if (++block >= BINMAPSIZE) /* out of bins */
3460 goto use_top;
3461 } while ( (map = av->binmap[block]) == 0);
3462
3463 bin = bin_at(av, (block << BINMAPSHIFT));
3464 bit = 1;
3465 }
3466
3467 /* Advance to bin with set bit. There must be one. */
3468 while ((bit & map) == 0) {
3469 bin = next_bin(bin);
3470 bit <<= 1;
3471 assert(bit != 0);
3472 }
3473
3474 /* Inspect the bin. It is likely to be non-empty */
3475 victim = last(bin);
3476
3477 /* If a false alarm (empty bin), clear the bit. */
3478 if (victim == bin) {
3479 av->binmap[block] = map &= ~bit; /* Write through */
3480 bin = next_bin(bin);
3481 bit <<= 1;
3482 }
3483
3484 else {
3485 size = chunksize(victim);
3486
3487 /* We know the first chunk in this bin is big enough to use. */
3488 assert((unsigned long)(size) >= (unsigned long)(nb));
3489
3490 remainder_size = size - nb;
3491
3492 /* unlink */
3493 bck = victim->bk;
3494 bin->bk = bck;
3495 bck->fd = bin;
3496
3497 /* Exhaust */
3498 if (remainder_size < MINSIZE) {
3499 set_inuse_bit_at_offset(victim, size);
3500 check_malloced_chunk(victim, nb);
3501 return chunk2mem(victim);
3502 }
3503
3504 /* Split */
3505 else {
3506 remainder = chunk_at_offset(victim, nb);
3507
3508 unsorted_chunks(av)->bk = unsorted_chunks(av)->fd = remainder;
3509 remainder->bk = remainder->fd = unsorted_chunks(av);
3510 /* advertise as last remainder */
3511 if (in_smallbin_range(nb))
3512 av->last_remainder = remainder;
3513
3514 set_head(victim, nb | PREV_INUSE);
3515 set_head(remainder, remainder_size | PREV_INUSE);
3516 set_foot(remainder, remainder_size);
3517 check_malloced_chunk(victim, nb);
3518 return chunk2mem(victim);
3519 }
3520 }
3521 }
3522
3523 use_top:
3524 /*
3525 If large enough, split off the chunk bordering the end of memory
3526 (held in av->top). Note that this is in accord with the best-fit
3527 search rule. In effect, av->top is treated as larger (and thus
3528 less well fitting) than any other available chunk since it can
3529 be extended to be as large as necessary (up to system
3530 limitations).
3531
3532 We require that av->top always exists (i.e., has size >=
3533 MINSIZE) after initialization, so if it would otherwise be
3534 exhuasted by current request, it is replenished. (The main
3535 reason for ensuring it exists is that we may need MINSIZE space
3536 to put in fenceposts in sysmalloc.)
3537 */
3538
3539 victim = av->top;
3540 size = chunksize(victim);
3541
3542 if ((unsigned long)(size) >= (unsigned long)(nb + MINSIZE)) {
3543 remainder_size = size - nb;
3544 remainder = chunk_at_offset(victim, nb);
3545 av->top = remainder;
3546 set_head(victim, nb | PREV_INUSE);
3547 set_head(remainder, remainder_size | PREV_INUSE);
3548
3549 check_malloced_chunk(victim, nb);
3550 return chunk2mem(victim);
3551 }
3552
3553 /*
3554 If there is space available in fastbins, consolidate and retry,
3555 to possibly avoid expanding memory. This can occur only if nb is
3556 in smallbin range so we didn't consolidate upon entry.
3557 */
3558
3559 else if (have_fastchunks(av)) {
3560 assert(in_smallbin_range(nb));
3561 malloc_consolidate(av);
3562 idx = smallbin_index(nb); /* restore original bin index */
3563 }
3564
3565 /*
3566 Otherwise, relay to handle system-dependent cases
3567 */
3568 else
3569 return sYSMALLOc(nb, av);
3570 }
3571 }
3572
3573 /*
3574 ------------------------------ free ------------------------------
3575 */
3576
3577 #if __STD_C
3578 void fREe(Void_t* mem)
3579 #else
3580 void fREe(mem) Void_t* mem;
3581 #endif
3582 {
3583 mstate av = get_malloc_state();
3584
3585 mchunkptr p; /* chunk corresponding to mem */
3586 INTERNAL_SIZE_T size; /* its size */
3587 mfastbinptr* fb; /* associated fastbin */
3588 mchunkptr nextchunk; /* next contiguous chunk */
3589 INTERNAL_SIZE_T nextsize; /* its size */
3590 int nextinuse; /* true if nextchunk is used */
3591 INTERNAL_SIZE_T prevsize; /* size of previous contiguous chunk */
3592 mchunkptr bck; /* misc temp for linking */
3593 mchunkptr fwd; /* misc temp for linking */
3594
3595
3596 /* free(0) has no effect */
3597 if (mem != 0) {
3598 p = mem2chunk(mem);
3599 size = chunksize(p);
3600
3601 check_inuse_chunk(p);
3602
3603 /*
3604 If eligible, place chunk on a fastbin so it can be found
3605 and used quickly in malloc.
3606 */
3607
3608 if ((unsigned long)(size) <= (unsigned long)(av->max_fast)
3609
3610 #if TRIM_FASTBINS
3611 /*
3612 If TRIM_FASTBINS set, don't place chunks
3613 bordering top into fastbins
3614 */
3615 && (chunk_at_offset(p, size) != av->top)
3616 #endif
3617 ) {
3618
3619 set_fastchunks(av);
3620 fb = &(av->fastbins[fastbin_index(size)]);
3621 p->fd = *fb;
3622 *fb = p;
3623 }
3624
3625 /*
3626 Consolidate other non-mmapped chunks as they arrive.
3627 */
3628
3629 else if (!chunk_is_mmapped(p)) {
3630 nextchunk = chunk_at_offset(p, size);
3631 nextsize = chunksize(nextchunk);
3632
3633 /* consolidate backward */
3634 if (!prev_inuse(p)) {
3635 prevsize = p->prev_size;
3636 size += prevsize;
3637 p = chunk_at_offset(p, -((long) prevsize));
3638 unlink(p, bck, fwd);
3639 }
3640
3641 if (nextchunk != av->top) {
3642 /* get and clear inuse bit */
3643 nextinuse = inuse_bit_at_offset(nextchunk, nextsize);
3644 set_head(nextchunk, nextsize);
3645
3646 /* consolidate forward */
3647 if (!nextinuse) {
3648 unlink(nextchunk, bck, fwd);
3649 size += nextsize;
3650 }
3651
3652 /*
3653 Place the chunk in unsorted chunk list. Chunks are
3654 not placed into regular bins until after they have
3655 been given one chance to be used in malloc.
3656 */
3657
3658 bck = unsorted_chunks(av);
3659 fwd = bck->fd;
3660 p->bk = bck;
3661 p->fd = fwd;
3662 bck->fd = p;
3663 fwd->bk = p;
3664
3665 set_head(p, size | PREV_INUSE);
3666 set_foot(p, size);
3667
3668 check_free_chunk(p);
3669 }
3670
3671 /*
3672 If the chunk borders the current high end of memory,
3673 consolidate into top
3674 */
3675
3676 else {
3677 size += nextsize;
3678 set_head(p, size | PREV_INUSE);
3679 av->top = p;
3680 check_chunk(p);
3681 }
3682
3683 /*
3684 If freeing a large space, consolidate possibly-surrounding
3685 chunks. Then, if the total unused topmost memory exceeds trim
3686 threshold, ask malloc_trim to reduce top.
3687
3688 Unless max_fast is 0, we don't know if there are fastbins
3689 bordering top, so we cannot tell for sure whether threshold
3690 has been reached unless fastbins are consolidated. But we
3691 don't want to consolidate on each free. As a compromise,
3692 consolidation is performed if FASTBIN_CONSOLIDATION_THRESHOLD
3693 is reached.
3694 */
3695
3696 if ((unsigned long)(size) >= FASTBIN_CONSOLIDATION_THRESHOLD) {
3697 if (have_fastchunks(av))
3698 malloc_consolidate(av);
3699
3700 #ifndef MORECORE_CANNOT_TRIM
3701 if ((unsigned long)(chunksize(av->top)) >=
3702 (unsigned long)(av->trim_threshold))
3703 sYSTRIm(av->top_pad, av);
3704 #endif
3705 }
3706
3707 }
3708 /*
3709 If the chunk was allocated via mmap, release via munmap()
3710 Note that if HAVE_MMAP is false but chunk_is_mmapped is
3711 true, then user must have overwritten memory. There's nothing
3712 we can do to catch this error unless DEBUG is set, in which case
3713 check_inuse_chunk (above) will have triggered error.
3714 */
3715
3716 else {
3717 #if HAVE_MMAP
3718 int ret;
3719 INTERNAL_SIZE_T offset = p->prev_size;
3720 av->n_mmaps--;
3721 av->mmapped_mem -= (size + offset);
3722 ret = munmap((char*)p - offset, size + offset);
3723 /* munmap returns non-zero on failure */
3724 assert(ret == 0);
3725 #endif
3726 }
3727 }
3728 }
3729
3730 /*
3731 ------------------------- malloc_consolidate -------------------------
3732
3733 malloc_consolidate is a specialized version of free() that tears
3734 down chunks held in fastbins. Free itself cannot be used for this
3735 purpose since, among other things, it might place chunks back onto
3736 fastbins. So, instead, we need to use a minor variant of the same
3737 code.
3738
3739 Also, because this routine needs to be called the first time through
3740 malloc anyway, it turns out to be the perfect place to trigger
3741 initialization code.
3742 */
3743
3744 #if __STD_C
3745 static void malloc_consolidate(mstate av)
3746 #else
3747 static void malloc_consolidate(av) mstate av;
3748 #endif
3749 {
3750 mfastbinptr* fb; /* current fastbin being consolidated */
3751 mfastbinptr* maxfb; /* last fastbin (for loop control) */
3752 mchunkptr p; /* current chunk being consolidated */
3753 mchunkptr nextp; /* next chunk to consolidate */
3754 mchunkptr unsorted_bin; /* bin header */
3755 mchunkptr first_unsorted; /* chunk to link to */
3756
3757 /* These have same use as in free() */
3758 mchunkptr nextchunk;
3759 INTERNAL_SIZE_T size;
3760 INTERNAL_SIZE_T nextsize;
3761 INTERNAL_SIZE_T prevsize;
3762 int nextinuse;
3763 mchunkptr bck;
3764 mchunkptr fwd;
3765
3766 /*
3767 If max_fast is 0, we know that av hasn't
3768 yet been initialized, in which case do so below
3769 */
3770
3771 if (av->max_fast != 0) {
3772 clear_fastchunks(av);
3773
3774 unsorted_bin = unsorted_chunks(av);
3775
3776 /*
3777 Remove each chunk from fast bin and consolidate it, placing it
3778 then in unsorted bin. Among other reasons for doing this,
3779 placing in unsorted bin avoids needing to calculate actual bins
3780 until malloc is sure that chunks aren't immediately going to be
3781 reused anyway.
3782 */
3783
3784 maxfb = &(av->fastbins[fastbin_index(av->max_fast)]);
3785 fb = &(av->fastbins[0]);
3786 do {
3787 if ( (p = *fb) != 0) {
3788 *fb = 0;
3789
3790 do {
3791 check_inuse_chunk(p);
3792 nextp = p->fd;
3793
3794 /* Slightly streamlined version of consolidation code in free() */
3795 size = p->size & ~PREV_INUSE;
3796 nextchunk = chunk_at_offset(p, size);
3797 nextsize = chunksize(nextchunk);
3798
3799 if (!prev_inuse(p)) {
3800 prevsize = p->prev_size;
3801 size += prevsize;
3802 p = chunk_at_offset(p, -((long) prevsize));
3803 unlink(p, bck, fwd);
3804 }
3805
3806 if (nextchunk != av->top) {
3807 nextinuse = inuse_bit_at_offset(nextchunk, nextsize);
3808 set_head(nextchunk, nextsize);
3809
3810 if (!nextinuse) {
3811 size += nextsize;
3812 unlink(nextchunk, bck, fwd);
3813 }
3814
3815 first_unsorted = unsorted_bin->fd;
3816 unsorted_bin->fd = p;
3817 first_unsorted->bk = p;
3818
3819 set_head(p, size | PREV_INUSE);
3820 p->bk = unsorted_bin;
3821 p->fd = first_unsorted;
3822 set_foot(p, size);
3823 }
3824
3825 else {
3826 size += nextsize;
3827 set_head(p, size | PREV_INUSE);
3828 av->top = p;
3829 }
3830
3831 } while ( (p = nextp) != 0);
3832
3833 }
3834 } while (fb++ != maxfb);
3835 }
3836 else {
3837 malloc_init_state(av);
3838 check_malloc_state();
3839 }
3840 }
3841
3842 /*
3843 ------------------------------ realloc ------------------------------
3844 */
3845
3846
3847 #if __STD_C
3848 Void_t* rEALLOc(Void_t* oldmem, size_t bytes)
3849 #else
3850 Void_t* rEALLOc(oldmem, bytes) Void_t* oldmem; size_t bytes;
3851 #endif
3852 {
3853 mstate av = get_malloc_state();
3854
3855 INTERNAL_SIZE_T nb; /* padded request size */
3856
3857 mchunkptr oldp; /* chunk corresponding to oldmem */
3858 INTERNAL_SIZE_T oldsize; /* its size */
3859
3860 mchunkptr newp; /* chunk to return */
3861 INTERNAL_SIZE_T newsize; /* its size */
3862 Void_t* newmem; /* corresponding user mem */
3863
3864 mchunkptr next; /* next contiguous chunk after oldp */
3865
3866 mchunkptr remainder; /* extra space at end of newp */
3867 unsigned long remainder_size; /* its size */
3868
3869 mchunkptr bck; /* misc temp for linking */
3870 mchunkptr fwd; /* misc temp for linking */
3871
3872 unsigned long copysize; /* bytes to copy */
3873 unsigned int ncopies; /* INTERNAL_SIZE_T words to copy */
3874 INTERNAL_SIZE_T* s; /* copy source */
3875 INTERNAL_SIZE_T* d; /* copy destination */
3876
3877
3878 #ifdef REALLOC_ZERO_BYTES_FREES
3879 if (bytes == 0) {
3880 fREe(oldmem);
3881 return 0;
3882 }
3883 #endif
3884
3885 /* realloc of null is supposed to be same as malloc */
3886 if (oldmem == 0) return mALLOc(bytes);
3887
3888 checked_request2size(bytes, nb);
3889
3890 oldp = mem2chunk(oldmem);
3891 oldsize = chunksize(oldp);
3892
3893 check_inuse_chunk(oldp);
3894
3895 if (!chunk_is_mmapped(oldp)) {
3896
3897 if ((unsigned long)(oldsize) >= (unsigned long)(nb)) {
3898 /* already big enough; split below */
3899 newp = oldp;
3900 newsize = oldsize;
3901 }
3902
3903 else {
3904 next = chunk_at_offset(oldp, oldsize);
3905
3906 /* Try to expand forward into top */
3907 if (next == av->top &&
3908 (unsigned long)(newsize = oldsize + chunksize(next)) >=
3909 (unsigned long)(nb + MINSIZE)) {
3910 set_head_size(oldp, nb);
3911 av->top = chunk_at_offset(oldp, nb);
3912 set_head(av->top, (newsize - nb) | PREV_INUSE);
3913 return chunk2mem(oldp);
3914 }
3915
3916 /* Try to expand forward into next chunk; split off remainder below */
3917 else if (next != av->top &&
3918 !inuse(next) &&
3919 (unsigned long)(newsize = oldsize + chunksize(next)) >=
3920 (unsigned long)(nb)) {
3921 newp = oldp;
3922 unlink(next, bck, fwd);
3923 }
3924
3925 /* allocate, copy, free */
3926 else {
3927 newmem = mALLOc(nb - MALLOC_ALIGN_MASK);
3928 if (newmem == 0)
3929 return 0; /* propagate failure */
3930
3931 newp = mem2chunk(newmem);
3932 newsize = chunksize(newp);
3933
3934 /*
3935 Avoid copy if newp is next chunk after oldp.
3936 */
3937 if (newp == next) {
3938 newsize += oldsize;
3939 newp = oldp;
3940 }
3941 else {
3942 /*
3943 Unroll copy of <= 36 bytes (72 if 8byte sizes)
3944 We know that contents have an odd number of
3945 INTERNAL_SIZE_T-sized words; minimally 3.
3946 */
3947
3948 copysize = oldsize - SIZE_SZ;
3949 s = (INTERNAL_SIZE_T*)(oldmem);
3950 d = (INTERNAL_SIZE_T*)(newmem);
3951 ncopies = copysize / sizeof(INTERNAL_SIZE_T);
3952 assert(ncopies >= 3);
3953
3954 if (ncopies > 9)
3955 MALLOC_COPY(d, s, copysize);
3956
3957 else {
3958 *(d+0) = *(s+0);
3959 *(d+1) = *(s+1);
3960 *(d+2) = *(s+2);
3961 if (ncopies > 4) {
3962 *(d+3) = *(s+3);
3963 *(d+4) = *(s+4);
3964 if (ncopies > 6) {
3965 *(d+5) = *(s+5);
3966 *(d+6) = *(s+6);
3967 if (ncopies > 8) {
3968 *(d+7) = *(s+7);
3969 *(d+8) = *(s+8);
3970 }
3971 }
3972 }
3973 }
3974
3975 fREe(oldmem);
3976 check_inuse_chunk(newp);
3977 return chunk2mem(newp);
3978 }
3979 }
3980 }
3981
3982 /* If possible, free extra space in old or extended chunk */
3983
3984 assert((unsigned long)(newsize) >= (unsigned long)(nb));
3985
3986 remainder_size = newsize - nb;
3987
3988 if (remainder_size < MINSIZE) { /* not enough extra to split off */
3989 set_head_size(newp, newsize);
3990 set_inuse_bit_at_offset(newp, newsize);
3991 }
3992 else { /* split remainder */
3993 remainder = chunk_at_offset(newp, nb);
3994 set_head_size(newp, nb);
3995 set_head(remainder, remainder_size | PREV_INUSE);
3996 /* Mark remainder as inuse so free() won't complain */
3997 set_inuse_bit_at_offset(remainder, remainder_size);
3998 fREe(chunk2mem(remainder));
3999 }
4000
4001 check_inuse_chunk(newp);
4002 return chunk2mem(newp);
4003 }
4004
4005 /*
4006 Handle mmap cases
4007 */
4008
4009 else {
4010 #if HAVE_MMAP
4011
4012 #if HAVE_MREMAP
4013 INTERNAL_SIZE_T offset = oldp->prev_size;
4014 size_t pagemask = av->pagesize - 1;
4015 char *cp;
4016 unsigned long sum;
4017
4018 /* Note the extra SIZE_SZ overhead */
4019 newsize = (nb + offset + SIZE_SZ + pagemask) & ~pagemask;
4020
4021 /* don't need to remap if still within same page */
4022 if (oldsize == newsize - offset)
4023 return oldmem;
4024
4025 cp = (char*)mremap((char*)oldp - offset, oldsize + offset, newsize, 1);
4026
4027 if (cp != (char*)MORECORE_FAILURE) {
4028
4029 newp = (mchunkptr)(cp + offset);
4030 set_head(newp, (newsize - offset)|IS_MMAPPED);
4031
4032 assert(aligned_OK(chunk2mem(newp)));
4033 assert((newp->prev_size == offset));
4034
4035 /* update statistics */
4036 sum = av->mmapped_mem += newsize - oldsize;
4037 if (sum > (unsigned long)(av->max_mmapped_mem))
4038 av->max_mmapped_mem = sum;
4039 sum += av->sbrked_mem;
4040 if (sum > (unsigned long)(av->max_total_mem))
4041 av->max_total_mem = sum;
4042
4043 return chunk2mem(newp);
4044 }
4045 #endif
4046
4047 /* Note the extra SIZE_SZ overhead. */
4048 if ((unsigned long)(oldsize) >= (unsigned long)(nb + SIZE_SZ))
4049 newmem = oldmem; /* do nothing */
4050 else {
4051 /* Must alloc, copy, free. */
4052 newmem = mALLOc(nb - MALLOC_ALIGN_MASK);
4053 if (newmem != 0) {
4054 MALLOC_COPY(newmem, oldmem, oldsize - 2*SIZE_SZ);
4055 fREe(oldmem);
4056 }
4057 }
4058 return newmem;
4059
4060 #else
4061 /* If !HAVE_MMAP, but chunk_is_mmapped, user must have overwritten mem */
4062 check_malloc_state();
4063 MALLOC_FAILURE_ACTION;
4064 return 0;
4065 #endif
4066 }
4067 }
4068
4069 /*
4070 ------------------------------ memalign ------------------------------
4071 */
4072
4073 #if __STD_C
4074 Void_t* mEMALIGn(size_t alignment, size_t bytes)
4075 #else
4076 Void_t* mEMALIGn(alignment, bytes) size_t alignment; size_t bytes;
4077 #endif
4078 {
4079 INTERNAL_SIZE_T nb; /* padded request size */
4080 char* m; /* memory returned by malloc call */
4081 mchunkptr p; /* corresponding chunk */
4082 char* brk; /* alignment point within p */
4083 mchunkptr newp; /* chunk to return */
4084 INTERNAL_SIZE_T newsize; /* its size */
4085 INTERNAL_SIZE_T leadsize; /* leading space before alignment point */
4086 mchunkptr remainder; /* spare room at end to split off */
4087 unsigned long remainder_size; /* its size */
4088 INTERNAL_SIZE_T size;
4089
4090 /* If need less alignment than we give anyway, just relay to malloc */
4091
4092 if (alignment <= MALLOC_ALIGNMENT) return mALLOc(bytes);
4093
4094 /* Otherwise, ensure that it is at least a minimum chunk size */
4095
4096 if (alignment < MINSIZE) alignment = MINSIZE;
4097
4098 /* Make sure alignment is power of 2 (in case MINSIZE is not). */
4099 if ((alignment & (alignment - 1)) != 0) {
4100 size_t a = MALLOC_ALIGNMENT * 2;
4101 while ((unsigned long)a < (unsigned long)alignment) a <<= 1;
4102 alignment = a;
4103 }
4104
4105 checked_request2size(bytes, nb);
4106
4107 /*
4108 Strategy: find a spot within that chunk that meets the alignment
4109 request, and then possibly free the leading and trailing space.
4110 */
4111
4112
4113 /* Call malloc with worst case padding to hit alignment. */
4114
4115 m = (char*)(mALLOc(nb + alignment + MINSIZE));
4116
4117 if (m == 0) return 0; /* propagate failure */
4118
4119 p = mem2chunk(m);
4120
4121 if ((((unsigned long)(m)) % alignment) != 0) { /* misaligned */
4122
4123 /*
4124 Find an aligned spot inside chunk. Since we need to give back
4125 leading space in a chunk of at least MINSIZE, if the first
4126 calculation places us at a spot with less than MINSIZE leader,
4127 we can move to the next aligned spot -- we've allocated enough
4128 total room so that this is always possible.
4129 */
4130
4131 brk = (char*)mem2chunk(((unsigned long)(m + alignment - 1)) &
4132 -((signed long) alignment));
4133 if ((unsigned long)(brk - (char*)(p)) < MINSIZE)
4134 brk += alignment;
4135
4136 newp = (mchunkptr)brk;
4137 leadsize = brk - (char*)(p);
4138 newsize = chunksize(p) - leadsize;
4139
4140 /* For mmapped chunks, just adjust offset */
4141 if (chunk_is_mmapped(p)) {
4142 newp->prev_size = p->prev_size + leadsize;
4143 set_head(newp, newsize|IS_MMAPPED);
4144 return chunk2mem(newp);
4145 }
4146
4147 /* Otherwise, give back leader, use the rest */
4148 set_head(newp, newsize | PREV_INUSE);
4149 set_inuse_bit_at_offset(newp, newsize);
4150 set_head_size(p, leadsize);
4151 fREe(chunk2mem(p));
4152 p = newp;
4153
4154 assert (newsize >= nb &&
4155 (((unsigned long)(chunk2mem(p))) % alignment) == 0);
4156 }
4157
4158 /* Also give back spare room at the end */
4159 if (!chunk_is_mmapped(p)) {
4160 size = chunksize(p);
4161 if ((unsigned long)(size) > (unsigned long)(nb + MINSIZE)) {
4162 remainder_size = size - nb;
4163 remainder = chunk_at_offset(p, nb);
4164 set_head(remainder, remainder_size | PREV_INUSE);
4165 set_head_size(p, nb);
4166 fREe(chunk2mem(remainder));
4167 }
4168 }
4169
4170 check_inuse_chunk(p);
4171 return chunk2mem(p);
4172 }
4173
4174 /*
4175 ------------------------------ calloc ------------------------------
4176 */
4177
4178 #if __STD_C
4179 Void_t* cALLOc(size_t n_elements, size_t elem_size)
4180 #else
4181 Void_t* cALLOc(n_elements, elem_size) size_t n_elements; size_t elem_size;
4182 #endif
4183 {
4184 mchunkptr p;
4185 unsigned long clearsize;
4186 unsigned long nclears;
4187 INTERNAL_SIZE_T* d;
4188
4189 Void_t* mem = mALLOc(n_elements * elem_size);
4190
4191 if (mem != 0) {
4192 p = mem2chunk(mem);
4193
4194 #if MMAP_CLEARS
4195 if (!chunk_is_mmapped(p)) /* don't need to clear mmapped space */
4196 #endif
4197 {
4198 /*
4199 Unroll clear of <= 36 bytes (72 if 8byte sizes)
4200 We know that contents have an odd number of
4201 INTERNAL_SIZE_T-sized words; minimally 3.
4202 */
4203
4204 d = (INTERNAL_SIZE_T*)mem;
4205 clearsize = chunksize(p) - SIZE_SZ;
4206 nclears = clearsize / sizeof(INTERNAL_SIZE_T);
4207 assert(nclears >= 3);
4208
4209 if (nclears > 9)
4210 MALLOC_ZERO(d, clearsize);
4211
4212 else {
4213 *(d+0) = 0;
4214 *(d+1) = 0;
4215 *(d+2) = 0;
4216 if (nclears > 4) {
4217 *(d+3) = 0;
4218 *(d+4) = 0;
4219 if (nclears > 6) {
4220 *(d+5) = 0;
4221 *(d+6) = 0;
4222 if (nclears > 8) {
4223 *(d+7) = 0;
4224 *(d+8) = 0;
4225 }
4226 }
4227 }
4228 }
4229 }
4230 }
4231 return mem;
4232 }
4233
4234 /*
4235 ------------------------------ cfree ------------------------------
4236 */
4237
4238 #if __STD_C
4239 void cFREe(Void_t *mem)
4240 #else
4241 void cFREe(mem) Void_t *mem;
4242 #endif
4243 {
4244 fREe(mem);
4245 }
4246
4247 /*
4248 ------------------------- independent_calloc -------------------------
4249 */
4250
4251 #if __STD_C
4252 Void_t** iCALLOc(size_t n_elements, size_t elem_size, Void_t* chunks[])
4253 #else
4254 Void_t** iCALLOc(n_elements, elem_size, chunks) size_t n_elements; size_t elem_size; Void_t* chunks[];
4255 #endif
4256 {
4257 size_t sz = elem_size; /* serves as 1-element array */
4258 /* opts arg of 3 means all elements are same size, and should be cleared */
4259 return iALLOc(n_elements, &sz, 3, chunks);
4260 }
4261
4262 /*
4263 ------------------------- independent_comalloc -------------------------
4264 */
4265
4266 #if __STD_C
4267 Void_t** iCOMALLOc(size_t n_elements, size_t sizes[], Void_t* chunks[])
4268 #else
4269 Void_t** iCOMALLOc(n_elements, sizes, chunks) size_t n_elements; size_t sizes[]; Void_t* chunks[];
4270 #endif
4271 {
4272 return iALLOc(n_elements, sizes, 0, chunks);
4273 }
4274
4275
4276 /*
4277 ------------------------------ ialloc ------------------------------
4278 ialloc provides common support for independent_X routines, handling all of
4279 the combinations that can result.
4280
4281 The opts arg has:
4282 bit 0 set if all elements are same size (using sizes[0])
4283 bit 1 set if elements should be zeroed
4284 */
4285
4286
4287 #if __STD_C
4288 static Void_t** iALLOc(size_t n_elements,
4289 size_t* sizes,
4290 int opts,
4291 Void_t* chunks[])
4292 #else
4293 static Void_t** iALLOc(n_elements, sizes, opts, chunks) size_t n_elements; size_t* sizes; int opts; Void_t* chunks[];
4294 #endif
4295 {
4296 mstate av = get_malloc_state();
4297 INTERNAL_SIZE_T element_size; /* chunksize of each element, if all same */
4298 INTERNAL_SIZE_T contents_size; /* total size of elements */
4299 INTERNAL_SIZE_T array_size; /* request size of pointer array */
4300 Void_t* mem; /* malloced aggregate space */
4301 mchunkptr p; /* corresponding chunk */
4302 INTERNAL_SIZE_T remainder_size; /* remaining bytes while splitting */
4303 Void_t** marray; /* either "chunks" or malloced ptr array */
4304 mchunkptr array_chunk; /* chunk for malloced ptr array */
4305 int mmx; /* to disable mmap */
4306 INTERNAL_SIZE_T size;
4307 size_t i;
4308
4309 /* Ensure initialization/consolidation */
4310 if (have_fastchunks(av)) malloc_consolidate(av);
4311
4312 /* compute array length, if needed */
4313 if (chunks != 0) {
4314 if (n_elements == 0)
4315 return chunks; /* nothing to do */
4316 marray = chunks;
4317 array_size = 0;
4318 }
4319 else {
4320 /* if empty req, must still return chunk representing empty array */
4321 if (n_elements == 0)
4322 return (Void_t**) mALLOc(0);
4323 marray = 0;
4324 array_size = request2size(n_elements * (sizeof(Void_t*)));
4325 }
4326
4327 /* compute total element size */
4328 if (opts & 0x1) { /* all-same-size */
4329 element_size = request2size(*sizes);
4330 contents_size = n_elements * element_size;
4331 }
4332 else { /* add up all the sizes */
4333 element_size = 0;
4334 contents_size = 0;
4335 for (i = 0; i != n_elements; ++i)
4336 contents_size += request2size(sizes[i]);
4337 }
4338
4339 /* subtract out alignment bytes from total to minimize overallocation */
4340 size = contents_size + array_size - MALLOC_ALIGN_MASK;
4341
4342 /*
4343 Allocate the aggregate chunk.
4344 But first disable mmap so malloc won't use it, since
4345 we would not be able to later free/realloc space internal
4346 to a segregated mmap region.
4347 */
4348 mmx = av->n_mmaps_max; /* disable mmap */
4349 av->n_mmaps_max = 0;
4350 mem = mALLOc(size);
4351 av->n_mmaps_max = mmx; /* reset mmap */
4352 if (mem == 0)
4353 return 0;
4354
4355 p = mem2chunk(mem);
4356 assert(!chunk_is_mmapped(p));
4357 remainder_size = chunksize(p);
4358
4359 if (opts & 0x2) { /* optionally clear the elements */
4360 MALLOC_ZERO(mem, remainder_size - SIZE_SZ - array_size);
4361 }
4362
4363 /* If not provided, allocate the pointer array as final part of chunk */
4364 if (marray == 0) {
4365 array_chunk = chunk_at_offset(p, contents_size);
4366 marray = (Void_t**) (chunk2mem(array_chunk));
4367 set_head(array_chunk, (remainder_size - contents_size) | PREV_INUSE);
4368 remainder_size = contents_size;
4369 }
4370
4371 /* split out elements */
4372 for (i = 0; ; ++i) {
4373 marray[i] = chunk2mem(p);
4374 if (i != n_elements-1) {
4375 if (element_size != 0)
4376 size = element_size;
4377 else
4378 size = request2size(sizes[i]);
4379 remainder_size -= size;
4380 set_head(p, size | PREV_INUSE);
4381 p = chunk_at_offset(p, size);
4382 }
4383 else { /* the final element absorbs any overallocation slop */
4384 set_head(p, remainder_size | PREV_INUSE);
4385 break;
4386 }
4387 }
4388
4389 #if DEBUG
4390 if (marray != chunks) {
4391 /* final element must have exactly exhausted chunk */
4392 if (element_size != 0)
4393 assert(remainder_size == element_size);
4394 else
4395 assert(remainder_size == request2size(sizes[i]));
4396 check_inuse_chunk(mem2chunk(marray));
4397 }
4398
4399 for (i = 0; i != n_elements; ++i)
4400 check_inuse_chunk(mem2chunk(marray[i]));
4401 #endif
4402
4403 return marray;
4404 }
4405
4406
4407 /*
4408 ------------------------------ valloc ------------------------------
4409 */
4410
4411 #if __STD_C
4412 Void_t* vALLOc(size_t bytes)
4413 #else
4414 Void_t* vALLOc(bytes) size_t bytes;
4415 #endif
4416 {
4417 /* Ensure initialization/consolidation */
4418 mstate av = get_malloc_state();
4419 if (have_fastchunks(av)) malloc_consolidate(av);
4420 return mEMALIGn(av->pagesize, bytes);
4421 }
4422
4423 /*
4424 ------------------------------ pvalloc ------------------------------
4425 */
4426
4427
4428 #if __STD_C
4429 Void_t* pVALLOc(size_t bytes)
4430 #else
4431 Void_t* pVALLOc(bytes) size_t bytes;
4432 #endif
4433 {
4434 mstate av = get_malloc_state();
4435 size_t pagesz;
4436
4437 /* Ensure initialization/consolidation */
4438 if (have_fastchunks(av)) malloc_consolidate(av);
4439 pagesz = av->pagesize;
4440 return mEMALIGn(pagesz, (bytes + pagesz - 1) & ~(pagesz - 1));
4441 }
4442
4443
4444 /*
4445 ------------------------------ malloc_trim ------------------------------
4446 */
4447
4448 #if __STD_C
4449 int mTRIm(size_t pad)
4450 #else
4451 int mTRIm(pad) size_t pad;
4452 #endif
4453 {
4454 mstate av = get_malloc_state();
4455 /* Ensure initialization/consolidation */
4456 malloc_consolidate(av);
4457
4458 #ifndef MORECORE_CANNOT_TRIM
4459 return sYSTRIm(pad, av);
4460 #else
4461 return 0;
4462 #endif
4463 }
4464
4465
4466 /*
4467 ------------------------- malloc_usable_size -------------------------
4468 */
4469
4470 #if __STD_C
4471 size_t mUSABLe(Void_t* mem)
4472 #else
4473 size_t mUSABLe(mem) Void_t* mem;
4474 #endif
4475 {
4476 mchunkptr p;
4477 if (mem != 0) {
4478 p = mem2chunk(mem);
4479 if (chunk_is_mmapped(p))
4480 return chunksize(p) - 2*SIZE_SZ;
4481 else if (inuse(p))
4482 return chunksize(p) - SIZE_SZ;
4483 }
4484 return 0;
4485 }
4486
4487 /*
4488 ------------------------------ mallinfo ------------------------------
4489 */
4490
4491 struct mallinfo mALLINFo()
4492 {
4493 mstate av = get_malloc_state();
4494 struct mallinfo mi;
4495 int i;
4496 mbinptr b;
4497 mchunkptr p;
4498 INTERNAL_SIZE_T avail;
4499 INTERNAL_SIZE_T fastavail;
4500 int nblocks;
4501 int nfastblocks;
4502
4503 /* Ensure initialization */
4504 if (av->top == 0) malloc_consolidate(av);
4505
4506 check_malloc_state();
4507
4508 /* Account for top */
4509 avail = chunksize(av->top);
4510 nblocks = 1; /* top always exists */
4511
4512 /* traverse fastbins */
4513 nfastblocks = 0;
4514 fastavail = 0;
4515
4516 for (i = 0; i < NFASTBINS; ++i) {
4517 for (p = av->fastbins[i]; p != 0; p = p->fd) {
4518 ++nfastblocks;
4519 fastavail += chunksize(p);
4520 }
4521 }
4522
4523 avail += fastavail;
4524
4525 /* traverse regular bins */
4526 for (i = 1; i < NBINS; ++i) {
4527 b = bin_at(av, i);
4528 for (p = last(b); p != b; p = p->bk) {
4529 ++nblocks;
4530 avail += chunksize(p);
4531 }
4532 }
4533
4534 mi.smblks = nfastblocks;
4535 mi.ordblks = nblocks;
4536 mi.fordblks = avail;
4537 mi.uordblks = av->sbrked_mem - avail;
4538 mi.arena = av->sbrked_mem;
4539 mi.hblks = av->n_mmaps;
4540 mi.hblkhd = av->mmapped_mem;
4541 mi.fsmblks = fastavail;
4542 mi.keepcost = chunksize(av->top);
4543 mi.usmblks = av->max_total_mem;
4544 return mi;
4545 }
4546
4547 /*
4548 ------------------------------ malloc_stats ------------------------------
4549 */
4550
4551 void mSTATs()
4552 {
4553 struct mallinfo mi = mALLINFo();
4554
4555 #ifdef WIN32
4556 {
4557 unsigned long free, reserved, committed;
4558 vminfo (&free, &reserved, &committed);
4559 fprintf(stderr, "free bytes = %10lu\n",
4560 free);
4561 fprintf(stderr, "reserved bytes = %10lu\n",
4562 reserved);
4563 fprintf(stderr, "committed bytes = %10lu\n",
4564 committed);
4565 }
4566 #endif
4567
4568
4569 fprintf(stderr, "max system bytes = %10lu\n",
4570 (unsigned long)(mi.usmblks));
4571 fprintf(stderr, "system bytes = %10lu\n",
4572 (unsigned long)(mi.arena + mi.hblkhd));
4573 fprintf(stderr, "in use bytes = %10lu\n",
4574 (unsigned long)(mi.uordblks + mi.hblkhd));
4575
4576
4577 #ifdef WIN32
4578 {
4579 unsigned long kernel, user;
4580 if (cpuinfo (TRUE, &kernel, &user)) {
4581 fprintf(stderr, "kernel ms = %10lu\n",
4582 kernel);
4583 fprintf(stderr, "user ms = %10lu\n",
4584 user);
4585 }
4586 }
4587 #endif
4588 }
4589
4590
4591 /*
4592 ------------------------------ mallopt ------------------------------
4593 */
4594
4595 #if __STD_C
4596 int mALLOPt(int param_number, int value)
4597 #else
4598 int mALLOPt(param_number, value) int param_number; int value;
4599 #endif
4600 {
4601 mstate av = get_malloc_state();
4602 /* Ensure initialization/consolidation */
4603 malloc_consolidate(av);
4604
4605 switch(param_number) {
4606 case M_MXFAST:
4607 if (value >= 0 && value <= MAX_FAST_SIZE) {
4608 set_max_fast(av, value);
4609 return 1;
4610 }
4611 else
4612 return 0;
4613
4614 case M_TRIM_THRESHOLD:
4615 av->trim_threshold = value;
4616 return 1;
4617
4618 case M_TOP_PAD:
4619 av->top_pad = value;
4620 return 1;
4621
4622 case M_MMAP_THRESHOLD:
4623 av->mmap_threshold = value;
4624 return 1;
4625
4626 case M_MMAP_MAX:
4627 #if !HAVE_MMAP
4628 if (value != 0)
4629 return 0;
4630 #endif
4631 av->n_mmaps_max = value;
4632 return 1;
4633
4634 default:
4635 return 0;
4636 }
4637 }
4638
4639
4640 /*
4641 -------------------- Alternative MORECORE functions --------------------
4642 */
4643
4644
4645 /*
4646 General Requirements for MORECORE.
4647
4648 The MORECORE function must have the following properties:
4649
4650 If MORECORE_CONTIGUOUS is false:
4651
4652 * MORECORE must allocate in multiples of pagesize. It will
4653 only be called with arguments that are multiples of pagesize.
4654
4655 * MORECORE(0) must return an address that is at least
4656 MALLOC_ALIGNMENT aligned. (Page-aligning always suffices.)
4657
4658 else (i.e. If MORECORE_CONTIGUOUS is true):
4659
4660 * Consecutive calls to MORECORE with positive arguments
4661 return increasing addresses, indicating that space has been
4662 contiguously extended.
4663
4664 * MORECORE need not allocate in multiples of pagesize.
4665 Calls to MORECORE need not have args of multiples of pagesize.
4666
4667 * MORECORE need not page-align.
4668
4669 In either case:
4670
4671 * MORECORE may allocate more memory than requested. (Or even less,
4672 but this will generally result in a malloc failure.)
4673
4674 * MORECORE must not allocate memory when given argument zero, but
4675 instead return one past the end address of memory from previous
4676 nonzero call. This malloc does NOT call MORECORE(0)
4677 until at least one call with positive arguments is made, so
4678 the initial value returned is not important.
4679
4680 * Even though consecutive calls to MORECORE need not return contiguous
4681 addresses, it must be OK for malloc'ed chunks to span multiple
4682 regions in those cases where they do happen to be contiguous.
4683
4684 * MORECORE need not handle negative arguments -- it may instead
4685 just return MORECORE_FAILURE when given negative arguments.
4686 Negative arguments are always multiples of pagesize. MORECORE
4687 must not misinterpret negative args as large positive unsigned
4688 args. You can suppress all such calls from even occurring by defining
4689 MORECORE_CANNOT_TRIM,
4690
4691 There is some variation across systems about the type of the
4692 argument to sbrk/MORECORE. If size_t is unsigned, then it cannot
4693 actually be size_t, because sbrk supports negative args, so it is
4694 normally the signed type of the same width as size_t (sometimes
4695 declared as "intptr_t", and sometimes "ptrdiff_t"). It doesn't much
4696 matter though. Internally, we use "long" as arguments, which should
4697 work across all reasonable possibilities.
4698
4699 Additionally, if MORECORE ever returns failure for a positive
4700 request, and HAVE_MMAP is true, then mmap is used as a noncontiguous
4701 system allocator. This is a useful backup strategy for systems with
4702 holes in address spaces -- in this case sbrk cannot contiguously
4703 expand the heap, but mmap may be able to map noncontiguous space.
4704
4705 If you'd like mmap to ALWAYS be used, you can define MORECORE to be
4706 a function that always returns MORECORE_FAILURE.
4707
4708 If you are using this malloc with something other than sbrk (or its
4709 emulation) to supply memory regions, you probably want to set
4710 MORECORE_CONTIGUOUS as false. As an example, here is a custom
4711 allocator kindly contributed for pre-OSX macOS. It uses virtually
4712 but not necessarily physically contiguous non-paged memory (locked
4713 in, present and won't get swapped out). You can use it by
4714 uncommenting this section, adding some #includes, and setting up the
4715 appropriate defines above:
4716
4717 #define MORECORE osMoreCore
4718 #define MORECORE_CONTIGUOUS 0
4719
4720 There is also a shutdown routine that should somehow be called for
4721 cleanup upon program exit.
4722
4723 #define MAX_POOL_ENTRIES 100
4724 #define MINIMUM_MORECORE_SIZE (64 * 1024)
4725 static int next_os_pool;
4726 void *our_os_pools[MAX_POOL_ENTRIES];
4727
4728 void *osMoreCore(int size)
4729 {
4730 void *ptr = 0;
4731 static void *sbrk_top = 0;
4732
4733 if (size > 0)
4734 {
4735 if (size < MINIMUM_MORECORE_SIZE)
4736 size = MINIMUM_MORECORE_SIZE;
4737 if (CurrentExecutionLevel() == kTaskLevel)
4738 ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0);
4739 if (ptr == 0)
4740 {
4741 return (void *) MORECORE_FAILURE;
4742 }
4743 // save ptrs so they can be freed during cleanup
4744 our_os_pools[next_os_pool] = ptr;
4745 next_os_pool++;
4746 ptr = (void *) ((((unsigned long) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK);
4747 sbrk_top = (char *) ptr + size;
4748 return ptr;
4749 }
4750 else if (size < 0)
4751 {
4752 // we don't currently support shrink behavior
4753 return (void *) MORECORE_FAILURE;
4754 }
4755 else
4756 {
4757 return sbrk_top;
4758 }
4759 }
4760
4761 // cleanup any allocated memory pools
4762 // called as last thing before shutting down driver
4763
4764 void osCleanupMem(void)
4765 {
4766 void **ptr;
4767
4768 for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++)
4769 if (*ptr)
4770 {
4771 PoolDeallocate(*ptr);
4772 *ptr = 0;
4773 }
4774 }
4775
4776 */
4777
4778
4779 /*
4780 --------------------------------------------------------------
4781
4782 Emulation of sbrk for win32.
4783 Donated by J. Walter <Walter@GeNeSys-e.de>.
4784 For additional information about this code, and malloc on Win32, see
4785 http://www.genesys-e.de/jwalter/
4786 */
4787
4788
4789 #ifdef WIN32
4790
4791 #ifdef _DEBUG
4792 /* #define TRACE */
4793 #endif
4794
4795 /* Support for USE_MALLOC_LOCK */
4796 #ifdef USE_MALLOC_LOCK
4797
4798 /* Wait for spin lock */
4799 static int slwait (int *sl) {
4800 while (InterlockedCompareExchange ((void **) sl, (void *) 1, (void *) 0) != 0)
4801 Sleep (0);
4802 return 0;
4803 }
4804
4805 /* Release spin lock */
4806 static int slrelease (int *sl) {
4807 InterlockedExchange (sl, 0);
4808 return 0;
4809 }
4810
4811 #ifdef NEEDED
4812 /* Spin lock for emulation code */
4813 static int g_sl;
4814 #endif
4815
4816 #endif /* USE_MALLOC_LOCK */
4817
4818 /* getpagesize for windows */
4819 static long getpagesize (void) {
4820 static long g_pagesize = 0;
4821 if (! g_pagesize) {
4822 SYSTEM_INFO system_info;
4823 GetSystemInfo (&system_info);
4824 g_pagesize = system_info.dwPageSize;
4825 }
4826 return g_pagesize;
4827 }
4828 static long getregionsize (void) {
4829 static long g_regionsize = 0;
4830 if (! g_regionsize) {
4831 SYSTEM_INFO system_info;
4832 GetSystemInfo (&system_info);
4833 g_regionsize = system_info.dwAllocationGranularity;
4834 }
4835 return g_regionsize;
4836 }
4837
4838 /* A region list entry */
4839 typedef struct _region_list_entry {
4840 void *top_allocated;
4841 void *top_committed;
4842 void *top_reserved;
4843 long reserve_size;
4844 struct _region_list_entry *previous;
4845 } region_list_entry;
4846
4847 /* Allocate and link a region entry in the region list */
4848 static int region_list_append (region_list_entry **last, void *base_reserved, long reserve_size) {
4849 region_list_entry *next = HeapAlloc (GetProcessHeap (), 0, sizeof (region_list_entry));
4850 if (! next)
4851 return FALSE;
4852 next->top_allocated = (char *) base_reserved;
4853 next->top_committed = (char *) base_reserved;
4854 next->top_reserved = (char *) base_reserved + reserve_size;
4855 next->reserve_size = reserve_size;
4856 next->previous = *last;
4857 *last = next;
4858 return TRUE;
4859 }
4860 /* Free and unlink the last region entry from the region list */
4861 static int region_list_remove (region_list_entry **last) {
4862 region_list_entry *previous = (*last)->previous;
4863 if (! HeapFree (GetProcessHeap (), sizeof (region_list_entry), *last))
4864 return FALSE;
4865 *last = previous;
4866 return TRUE;
4867 }
4868
4869 #define CEIL(size,to) (((size)+(to)-1)&~((to)-1))
4870 #define FLOOR(size,to) ((size)&~((to)-1))
4871
4872 #define SBRK_SCALE 0
4873 /* #define SBRK_SCALE 1 */
4874 /* #define SBRK_SCALE 2 */
4875 /* #define SBRK_SCALE 4 */
4876
4877 /* sbrk for windows */
4878 static void *sbrk (long size) {
4879 static long g_pagesize, g_my_pagesize;
4880 static long g_regionsize, g_my_regionsize;
4881 static region_list_entry *g_last;
4882 void *result = (void *) MORECORE_FAILURE;
4883 #ifdef TRACE
4884 printf ("sbrk %d\n", size);
4885 #endif
4886 #if defined (USE_MALLOC_LOCK) && defined (NEEDED)
4887 /* Wait for spin lock */
4888 slwait (&g_sl);
4889 #endif
4890 /* First time initialization */
4891 if (! g_pagesize) {
4892 g_pagesize = getpagesize ();
4893 g_my_pagesize = g_pagesize << SBRK_SCALE;
4894 }
4895 if (! g_regionsize) {
4896 g_regionsize = getregionsize ();
4897 g_my_regionsize = g_regionsize << SBRK_SCALE;
4898 }
4899 if (! g_last) {
4900 if (! region_list_append (&g_last, 0, 0))
4901 goto sbrk_exit;
4902 }
4903 /* Assert invariants */
4904 assert (g_last);
4905 assert ((char *) g_last->top_reserved - g_last->reserve_size <= (char *) g_last->top_allocated &&
4906 g_last->top_allocated <= g_last->top_committed);
4907 assert ((char *) g_last->top_reserved - g_last->reserve_size <= (char *) g_last->top_committed &&
4908 g_last->top_committed <= g_last->top_reserved &&
4909 (unsigned) g_last->top_committed % g_pagesize == 0);
4910 assert ((unsigned) g_last->top_reserved % g_regionsize == 0);
4911 assert ((unsigned) g_last->reserve_size % g_regionsize == 0);
4912 /* Allocation requested? */
4913 if (size >= 0) {
4914 /* Allocation size is the requested size */
4915 long allocate_size = size;
4916 /* Compute the size to commit */
4917 long to_commit = (char *) g_last->top_allocated + allocate_size - (char *) g_last->top_committed;
4918 /* Do we reach the commit limit? */
4919 if (to_commit > 0) {
4920 /* Round size to commit */
4921 long commit_size = CEIL (to_commit, g_my_pagesize);
4922 /* Compute the size to reserve */
4923 long to_reserve = (char *) g_last->top_committed + commit_size - (char *) g_last->top_reserved;
4924 /* Do we reach the reserve limit? */
4925 if (to_reserve > 0) {
4926 /* Compute the remaining size to commit in the current region */
4927 long remaining_commit_size = (char *) g_last->top_reserved - (char *) g_last->top_committed;
4928 if (remaining_commit_size > 0) {
4929 /* Assert preconditions */
4930 assert ((unsigned) g_last->top_committed % g_pagesize == 0);
4931 assert (0 < remaining_commit_size && remaining_commit_size % g_pagesize == 0); {
4932 /* Commit this */
4933 void *base_committed = VirtualAlloc (g_last->top_committed, remaining_commit_size,
4934 MEM_COMMIT, PAGE_READWRITE);
4935 /* Check returned pointer for consistency */
4936 if (base_committed != g_last->top_committed)
4937 goto sbrk_exit;
4938 /* Assert postconditions */
4939 assert ((unsigned) base_committed % g_pagesize == 0);
4940 #ifdef TRACE
4941 printf ("Commit %p %d\n", base_committed, remaining_commit_size);
4942 #endif
4943 /* Adjust the regions commit top */
4944 g_last->top_committed = (char *) base_committed + remaining_commit_size;
4945 }
4946 } {
4947 /* Now we are going to search and reserve. */
4948 int contiguous = -1;
4949 int found = FALSE;
4950 MEMORY_BASIC_INFORMATION memory_info;
4951 void *base_reserved;
4952 long reserve_size;
4953 do {
4954 /* Assume contiguous memory */
4955 contiguous = TRUE;
4956 /* Round size to reserve */
4957 reserve_size = CEIL (to_reserve, g_my_regionsize);
4958 /* Start with the current region's top */
4959 memory_info.BaseAddress = g_last->top_reserved;
4960 /* Assert preconditions */
4961 assert ((unsigned) memory_info.BaseAddress % g_pagesize == 0);
4962 assert (0 < reserve_size && reserve_size % g_regionsize == 0);
4963 while (VirtualQuery (memory_info.BaseAddress, &memory_info, sizeof (memory_info))) {
4964 /* Assert postconditions */
4965 assert ((unsigned) memory_info.BaseAddress % g_pagesize == 0);
4966 #ifdef TRACE
4967 printf ("Query %p %d %s\n", memory_info.BaseAddress, memory_info.RegionSize,
4968 memory_info.State == MEM_FREE ? "FREE":
4969 (memory_info.State == MEM_RESERVE ? "RESERVED":
4970 (memory_info.State == MEM_COMMIT ? "COMMITTED": "?")));
4971 #endif
4972 /* Region is free, well aligned and big enough: we are done */
4973 if (memory_info.State == MEM_FREE &&
4974 (unsigned) memory_info.BaseAddress % g_regionsize == 0 &&
4975 memory_info.RegionSize >= (unsigned) reserve_size) {
4976 found = TRUE;
4977 break;
4978 }
4979 /* From now on we can't get contiguous memory! */
4980 contiguous = FALSE;
4981 /* Recompute size to reserve */
4982 reserve_size = CEIL (allocate_size, g_my_regionsize);
4983 memory_info.BaseAddress = (char *) memory_info.BaseAddress + memory_info.RegionSize;
4984 /* Assert preconditions */
4985 assert ((unsigned) memory_info.BaseAddress % g_pagesize == 0);
4986 assert (0 < reserve_size && reserve_size % g_regionsize == 0);
4987 }
4988 /* Search failed? */
4989 if (! found)
4990 goto sbrk_exit;
4991 /* Assert preconditions */
4992 assert ((unsigned) memory_info.BaseAddress % g_regionsize == 0);
4993 assert (0 < reserve_size && reserve_size % g_regionsize == 0);
4994 /* Try to reserve this */
4995 base_reserved = VirtualAlloc (memory_info.BaseAddress, reserve_size,
4996 MEM_RESERVE, PAGE_NOACCESS);
4997 if (! base_reserved) {
4998 int rc = GetLastError ();
4999 if (rc != ERROR_INVALID_ADDRESS)
5000 goto sbrk_exit;
5001 }
5002 /* A null pointer signals (hopefully) a race condition with another thread. */
5003 /* In this case, we try again. */
5004 } while (! base_reserved);
5005 /* Check returned pointer for consistency */
5006 if (memory_info.BaseAddress && base_reserved != memory_info.BaseAddress)
5007 goto sbrk_exit;
5008 /* Assert postconditions */
5009 assert ((unsigned) base_reserved % g_regionsize == 0);
5010 #ifdef TRACE
5011 printf ("Reserve %p %d\n", base_reserved, reserve_size);
5012 #endif
5013 /* Did we get contiguous memory? */
5014 if (contiguous) {
5015 long start_size = (char *) g_last->top_committed - (char *) g_last->top_allocated;
5016 /* Adjust allocation size */
5017 allocate_size -= start_size;
5018 /* Adjust the regions allocation top */
5019 g_last->top_allocated = g_last->top_committed;
5020 /* Recompute the size to commit */
5021 to_commit = (char *) g_last->top_allocated + allocate_size - (char *) g_last->top_committed;
5022 /* Round size to commit */
5023 commit_size = CEIL (to_commit, g_my_pagesize);
5024 }
5025 /* Append the new region to the list */
5026 if (! region_list_append (&g_last, base_reserved, reserve_size))
5027 goto sbrk_exit;
5028 /* Didn't we get contiguous memory? */
5029 if (! contiguous) {
5030 /* Recompute the size to commit */
5031 to_commit = (char *) g_last->top_allocated + allocate_size - (char *) g_last->top_committed;
5032 /* Round size to commit */
5033 commit_size = CEIL (to_commit, g_my_pagesize);
5034 }
5035 }
5036 }
5037 /* Assert preconditions */
5038 assert ((unsigned) g_last->top_committed % g_pagesize == 0);
5039 assert (0 < commit_size && commit_size % g_pagesize == 0); {
5040 /* Commit this */
5041 void *base_committed = VirtualAlloc (g_last->top_committed, commit_size,
5042 MEM_COMMIT, PAGE_READWRITE);
5043 /* Check returned pointer for consistency */
5044 if (base_committed != g_last->top_committed)
5045 goto sbrk_exit;
5046 /* Assert postconditions */
5047 assert ((unsigned) base_committed % g_pagesize == 0);
5048 #ifdef TRACE
5049 printf ("Commit %p %d\n", base_committed, commit_size);
5050 #endif
5051 /* Adjust the regions commit top */
5052 g_last->top_committed = (char *) base_committed + commit_size;
5053 }
5054 }
5055 /* Adjust the regions allocation top */
5056 g_last->top_allocated = (char *) g_last->top_allocated + allocate_size;
5057 result = (char *) g_last->top_allocated - size;
5058 /* Deallocation requested? */
5059 } else if (size < 0) {
5060 long deallocate_size = - size;
5061 /* As long as we have a region to release */
5062 while ((char *) g_last->top_allocated - deallocate_size < (char *) g_last->top_reserved - g_last->reserve_size) {
5063 /* Get the size to release */
5064 long release_size = g_last->reserve_size;
5065 /* Get the base address */
5066 void *base_reserved = (char *) g_last->top_reserved - release_size;
5067 /* Assert preconditions */
5068 assert ((unsigned) base_reserved % g_regionsize == 0);
5069 assert (0 < release_size && release_size % g_regionsize == 0); {
5070 /* Release this */
5071 int rc = VirtualFree (base_reserved, 0,
5072 MEM_RELEASE);
5073 /* Check returned code for consistency */
5074 if (! rc)
5075 goto sbrk_exit;
5076 #ifdef TRACE
5077 printf ("Release %p %d\n", base_reserved, release_size);
5078 #endif
5079 }
5080 /* Adjust deallocation size */
5081 deallocate_size -= (char *) g_last->top_allocated - (char *) base_reserved;
5082 /* Remove the old region from the list */
5083 if (! region_list_remove (&g_last))
5084 goto sbrk_exit;
5085 } {
5086 /* Compute the size to decommit */
5087 long to_decommit = (char *) g_last->top_committed - ((char *) g_last->top_allocated - deallocate_size);
5088 if (to_decommit >= g_my_pagesize) {
5089 /* Compute the size to decommit */
5090 long decommit_size = FLOOR (to_decommit, g_my_pagesize);
5091 /* Compute the base address */
5092 void *base_committed = (char *) g_last->top_committed - decommit_size;
5093 /* Assert preconditions */
5094 assert ((unsigned) base_committed % g_pagesize == 0);
5095 assert (0 < decommit_size && decommit_size % g_pagesize == 0); {
5096 /* Decommit this */
5097 int rc = VirtualFree ((char *) base_committed, decommit_size,
5098 MEM_DECOMMIT);
5099 /* Check returned code for consistency */
5100 if (! rc)
5101 goto sbrk_exit;
5102 #ifdef TRACE
5103 printf ("Decommit %p %d\n", base_committed, decommit_size);
5104 #endif
5105 }
5106 /* Adjust deallocation size and regions commit and allocate top */
5107 deallocate_size -= (char *) g_last->top_allocated - (char *) base_committed;
5108 g_last->top_committed = base_committed;
5109 g_last->top_allocated = base_committed;
5110 }
5111 }
5112 /* Adjust regions allocate top */
5113 g_last->top_allocated = (char *) g_last->top_allocated - deallocate_size;
5114 /* Check for underflow */
5115 if ((char *) g_last->top_reserved - g_last->reserve_size > (char *) g_last->top_allocated ||
5116 g_last->top_allocated > g_last->top_committed) {
5117 /* Adjust regions allocate top */
5118 g_last->top_allocated = (char *) g_last->top_reserved - g_last->reserve_size;
5119 goto sbrk_exit;
5120 }
5121 result = g_last->top_allocated;
5122 }
5123 /* Assert invariants */
5124 assert (g_last);
5125 assert ((char *) g_last->top_reserved - g_last->reserve_size <= (char *) g_last->top_allocated &&
5126 g_last->top_allocated <= g_last->top_committed);
5127 assert ((char *) g_last->top_reserved - g_last->reserve_size <= (char *) g_last->top_committed &&
5128 g_last->top_committed <= g_last->top_reserved &&
5129 (unsigned) g_last->top_committed % g_pagesize == 0);
5130 assert ((unsigned) g_last->top_reserved % g_regionsize == 0);
5131 assert ((unsigned) g_last->reserve_size % g_regionsize == 0);
5132
5133 sbrk_exit:
5134 #if defined (USE_MALLOC_LOCK) && defined (NEEDED)
5135 /* Release spin lock */
5136 slrelease (&g_sl);
5137 #endif
5138 return result;
5139 }
5140
5141 /* mmap for windows */
5142 static void *mmap (void *ptr, long size, long prot, long type, long handle, long arg) {
5143 static long g_pagesize;
5144 static long g_regionsize;
5145 #ifdef TRACE
5146 printf ("mmap %d\n", size);
5147 #endif
5148 #if defined (USE_MALLOC_LOCK) && defined (NEEDED)
5149 /* Wait for spin lock */
5150 slwait (&g_sl);
5151 #endif
5152 /* First time initialization */
5153 if (! g_pagesize)
5154 g_pagesize = getpagesize ();
5155 if (! g_regionsize)
5156 g_regionsize = getregionsize ();
5157 /* Assert preconditions */
5158 assert ((unsigned) ptr % g_regionsize == 0);
5159 assert (size % g_pagesize == 0);
5160 /* Allocate this */
5161 ptr = VirtualAlloc (ptr, size,
5162 MEM_RESERVE | MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE);
5163 if (! ptr) {
5164 ptr = (void *) MORECORE_FAILURE;
5165 goto mmap_exit;
5166 }
5167 /* Assert postconditions */
5168 assert ((unsigned) ptr % g_regionsize == 0);
5169 #ifdef TRACE
5170 printf ("Commit %p %d\n", ptr, size);
5171 #endif
5172 mmap_exit:
5173 #if defined (USE_MALLOC_LOCK) && defined (NEEDED)
5174 /* Release spin lock */
5175 slrelease (&g_sl);
5176 #endif
5177 return ptr;
5178 }
5179
5180 /* munmap for windows */
5181 static long munmap (void *ptr, long size) {
5182 static long g_pagesize;
5183 static long g_regionsize;
5184 int rc = MUNMAP_FAILURE;
5185 #ifdef TRACE
5186 printf ("munmap %p %d\n", ptr, size);
5187 #endif
5188 #if defined (USE_MALLOC_LOCK) && defined (NEEDED)
5189 /* Wait for spin lock */
5190 slwait (&g_sl);
5191 #endif
5192 /* First time initialization */
5193 if (! g_pagesize)
5194 g_pagesize = getpagesize ();
5195 if (! g_regionsize)
5196 g_regionsize = getregionsize ();
5197 /* Assert preconditions */
5198 assert ((unsigned) ptr % g_regionsize == 0);
5199 assert (size % g_pagesize == 0);
5200 /* Free this */
5201 if (! VirtualFree (ptr, 0,
5202 MEM_RELEASE))
5203 goto munmap_exit;
5204 rc = 0;
5205 #ifdef TRACE
5206 printf ("Release %p %d\n", ptr, size);
5207 #endif
5208 munmap_exit:
5209 #if defined (USE_MALLOC_LOCK) && defined (NEEDED)
5210 /* Release spin lock */
5211 slrelease (&g_sl);
5212 #endif
5213 return rc;
5214 }
5215
5216 static void vminfo (unsigned long *free, unsigned long *reserved, unsigned long *committed) {
5217 MEMORY_BASIC_INFORMATION memory_info;
5218 memory_info.BaseAddress = 0;
5219 *free = *reserved = *committed = 0;
5220 while (VirtualQuery (memory_info.BaseAddress, &memory_info, sizeof (memory_info))) {
5221 switch (memory_info.State) {
5222 case MEM_FREE:
5223 *free += memory_info.RegionSize;
5224 break;
5225 case MEM_RESERVE:
5226 *reserved += memory_info.RegionSize;
5227 break;
5228 case MEM_COMMIT:
5229 *committed += memory_info.RegionSize;
5230 break;
5231 }
5232 memory_info.BaseAddress = (char *) memory_info.BaseAddress + memory_info.RegionSize;
5233 }
5234 }
5235
5236 static int cpuinfo (int whole, unsigned long *kernel, unsigned long *user) {
5237 if (whole) {
5238 __int64 creation64, exit64, kernel64, user64;
5239 int rc = GetProcessTimes (GetCurrentProcess (),
5240 (FILETIME *) &creation64,
5241 (FILETIME *) &exit64,
5242 (FILETIME *) &kernel64,
5243 (FILETIME *) &user64);
5244 if (! rc) {
5245 *kernel = 0;
5246 *user = 0;
5247 return FALSE;
5248 }
5249 *kernel = (unsigned long) (kernel64 / 10000);
5250 *user = (unsigned long) (user64 / 10000);
5251 return TRUE;
5252 } else {
5253 __int64 creation64, exit64, kernel64, user64;
5254 int rc = GetThreadTimes (GetCurrentThread (),
5255 (FILETIME *) &creation64,
5256 (FILETIME *) &exit64,
5257 (FILETIME *) &kernel64,
5258 (FILETIME *) &user64);
5259 if (! rc) {
5260 *kernel = 0;
5261 *user = 0;
5262 return FALSE;
5263 }
5264 *kernel = (unsigned long) (kernel64 / 10000);
5265 *user = (unsigned long) (user64 / 10000);
5266 return TRUE;
5267 }
5268 }
5269
5270 #endif /* WIN32 */
5271
5272 /* ------------------------------------------------------------
5273 History:
5274
5275 V2.7.0 Sun Mar 11 14:14:06 2001 Doug Lea (dl at gee)
5276 * Introduce independent_comalloc and independent_calloc.
5277 Thanks to Michael Pachos for motivation and help.
5278 * Make optional .h file available
5279 * Allow > 2GB requests on 32bit systems.
5280 * new WIN32 sbrk, mmap, munmap, lock code from <Walter@GeNeSys-e.de>.
5281 Thanks also to Andreas Mueller <a.mueller at paradatec.de>,
5282 and Anonymous.
5283 * Allow override of MALLOC_ALIGNMENT (Thanks to Ruud Waij for
5284 helping test this.)
5285 * memalign: check alignment arg
5286 * realloc: don't try to shift chunks backwards, since this
5287 leads to more fragmentation in some programs and doesn't
5288 seem to help in any others.
5289 * Collect all cases in malloc requiring system memory into sYSMALLOc
5290 * Use mmap as backup to sbrk
5291 * Place all internal state in malloc_state
5292 * Introduce fastbins (although similar to 2.5.1)
5293 * Many minor tunings and cosmetic improvements
5294 * Introduce USE_PUBLIC_MALLOC_WRAPPERS, USE_MALLOC_LOCK
5295 * Introduce MALLOC_FAILURE_ACTION, MORECORE_CONTIGUOUS
5296 Thanks to Tony E. Bennett <tbennett@nvidia.com> and others.
5297 * Include errno.h to support default failure action.
5298
5299 V2.6.6 Sun Dec 5 07:42:19 1999 Doug Lea (dl at gee)
5300 * return null for negative arguments
5301 * Added Several WIN32 cleanups from Martin C. Fong <mcfong at yahoo.com>
5302 * Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h'
5303 (e.g. WIN32 platforms)
5304 * Cleanup header file inclusion for WIN32 platforms
5305 * Cleanup code to avoid Microsoft Visual C++ compiler complaints
5306 * Add 'USE_DL_PREFIX' to quickly allow co-existence with existing
5307 memory allocation routines
5308 * Set 'malloc_getpagesize' for WIN32 platforms (needs more work)
5309 * Use 'assert' rather than 'ASSERT' in WIN32 code to conform to
5310 usage of 'assert' in non-WIN32 code
5311 * Improve WIN32 'sbrk()' emulation's 'findRegion()' routine to
5312 avoid infinite loop
5313 * Always call 'fREe()' rather than 'free()'
5314
5315 V2.6.5 Wed Jun 17 15:57:31 1998 Doug Lea (dl at gee)
5316 * Fixed ordering problem with boundary-stamping
5317
5318 V2.6.3 Sun May 19 08:17:58 1996 Doug Lea (dl at gee)
5319 * Added pvalloc, as recommended by H.J. Liu
5320 * Added 64bit pointer support mainly from Wolfram Gloger
5321 * Added anonymously donated WIN32 sbrk emulation
5322 * Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen
5323 * malloc_extend_top: fix mask error that caused wastage after
5324 foreign sbrks
5325 * Add linux mremap support code from HJ Liu
5326
5327 V2.6.2 Tue Dec 5 06:52:55 1995 Doug Lea (dl at gee)
5328 * Integrated most documentation with the code.
5329 * Add support for mmap, with help from
5330 Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
5331 * Use last_remainder in more cases.
5332 * Pack bins using idea from colin@nyx10.cs.du.edu
5333 * Use ordered bins instead of best-fit threshhold
5334 * Eliminate block-local decls to simplify tracing and debugging.
5335 * Support another case of realloc via move into top
5336 * Fix error occuring when initial sbrk_base not word-aligned.
5337 * Rely on page size for units instead of SBRK_UNIT to
5338 avoid surprises about sbrk alignment conventions.
5339 * Add mallinfo, mallopt. Thanks to Raymond Nijssen
5340 (raymond@es.ele.tue.nl) for the suggestion.
5341 * Add `pad' argument to malloc_trim and top_pad mallopt parameter.
5342 * More precautions for cases where other routines call sbrk,
5343 courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
5344 * Added macros etc., allowing use in linux libc from
5345 H.J. Lu (hjl@gnu.ai.mit.edu)
5346 * Inverted this history list
5347
5348 V2.6.1 Sat Dec 2 14:10:57 1995 Doug Lea (dl at gee)
5349 * Re-tuned and fixed to behave more nicely with V2.6.0 changes.
5350 * Removed all preallocation code since under current scheme
5351 the work required to undo bad preallocations exceeds
5352 the work saved in good cases for most test programs.
5353 * No longer use return list or unconsolidated bins since
5354 no scheme using them consistently outperforms those that don't
5355 given above changes.
5356 * Use best fit for very large chunks to prevent some worst-cases.
5357 * Added some support for debugging
5358
5359 V2.6.0 Sat Nov 4 07:05:23 1995 Doug Lea (dl at gee)
5360 * Removed footers when chunks are in use. Thanks to
5361 Paul Wilson (wilson@cs.texas.edu) for the suggestion.
5362
5363 V2.5.4 Wed Nov 1 07:54:51 1995 Doug Lea (dl at gee)
5364 * Added malloc_trim, with help from Wolfram Gloger
5365 (wmglo@Dent.MED.Uni-Muenchen.DE).
5366
5367 V2.5.3 Tue Apr 26 10:16:01 1994 Doug Lea (dl at g)
5368
5369 V2.5.2 Tue Apr 5 16:20:40 1994 Doug Lea (dl at g)
5370 * realloc: try to expand in both directions
5371 * malloc: swap order of clean-bin strategy;
5372 * realloc: only conditionally expand backwards
5373 * Try not to scavenge used bins
5374 * Use bin counts as a guide to preallocation
5375 * Occasionally bin return list chunks in first scan
5376 * Add a few optimizations from colin@nyx10.cs.du.edu
5377
5378 V2.5.1 Sat Aug 14 15:40:43 1993 Doug Lea (dl at g)
5379 * faster bin computation & slightly different binning
5380 * merged all consolidations to one part of malloc proper
5381 (eliminating old malloc_find_space & malloc_clean_bin)
5382 * Scan 2 returns chunks (not just 1)
5383 * Propagate failure in realloc if malloc returns 0
5384 * Add stuff to allow compilation on non-ANSI compilers
5385 from kpv@research.att.com
5386
5387 V2.5 Sat Aug 7 07:41:59 1993 Doug Lea (dl at g.oswego.edu)
5388 * removed potential for odd address access in prev_chunk
5389 * removed dependency on getpagesize.h
5390 * misc cosmetics and a bit more internal documentation
5391 * anticosmetics: mangled names in macros to evade debugger strangeness
5392 * tested on sparc, hp-700, dec-mips, rs6000
5393 with gcc & native cc (hp, dec only) allowing
5394 Detlefs & Zorn comparison study (in SIGPLAN Notices.)
5395
5396 Trial version Fri Aug 28 13:14:29 1992 Doug Lea (dl at g.oswego.edu)
5397 * Based loosely on libg++-1.2X malloc. (It retains some of the overall
5398 structure of old version, but most details differ.)
5399
5400 */