The R Project SVN R

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
10347 ripley 1
/* 27/03/2000 win32-api needs this for ANSI compliance */
2
#define NONAMELESSUNION
3
/* ---------- To make a malloc.h, start cutting here ------------ */
4
 
5
/*
6
  A version of malloc/free/realloc written by Doug Lea and released to the
7
  public domain.  Send questions/comments/complaints/performance data
8
  to dl@cs.oswego.edu
9
 
10425 ripley 10
* VERSION 2.6.6  Sun Mar  5 19:10:03 2000  Doug Lea  (dl at gee)
10347 ripley 11
 
12
   Note: There may be an updated version of this malloc obtainable at
13
           ftp://g.oswego.edu/pub/misc/malloc.c
14
         Check before installing!
15
 
16
* Why use this malloc?
17
 
18
  This is not the fastest, most space-conserving, most portable, or
19
  most tunable malloc ever written. However it is among the fastest
20
  while also being among the most space-conserving, portable and tunable.
21
  Consistent balance across these factors results in a good general-purpose
22
  allocator. For a high-level description, see
23
     http://g.oswego.edu/dl/html/malloc.html
24
 
25
* Synopsis of public routines
26
 
27
  (Much fuller descriptions are contained in the program documentation below.)
28
 
29
  malloc(size_t n);
30
     Return a pointer to a newly allocated chunk of at least n bytes, or null
31
     if no space is available.
32
  free(Void_t* p);
33
     Release the chunk of memory pointed to by p, or no effect if p is null.
34
  realloc(Void_t* p, size_t n);
35
     Return a pointer to a chunk of size n that contains the same data
36
     as does chunk p up to the minimum of (n, p's size) bytes, or null
37
     if no space is available. The returned pointer may or may not be
38
     the same as p. If p is null, equivalent to malloc.  Unless the
39
     #define REALLOC_ZERO_BYTES_FREES below is set, realloc with a
40
     size argument of zero (re)allocates a minimum-sized chunk.
41
  memalign(size_t alignment, size_t n);
42
     Return a pointer to a newly allocated chunk of n bytes, aligned
43
     in accord with the alignment argument, which must be a power of
44
     two.
45
  valloc(size_t n);
46
     Equivalent to memalign(pagesize, n), where pagesize is the page
47
     size of the system (or as near to this as can be figured out from
48
     all the includes/defines below.)
49
  pvalloc(size_t n);
50
     Equivalent to valloc(minimum-page-that-holds(n)), that is,
51
     round up n to nearest pagesize.
52
  calloc(size_t unit, size_t quantity);
53
     Returns a pointer to quantity * unit bytes, with all locations
54
     set to zero.
55
  cfree(Void_t* p);
56
     Equivalent to free(p).
57
  malloc_trim(size_t pad);
58
     Release all but pad bytes of freed top-most memory back
59
     to the system. Return 1 if successful, else 0.
60
  malloc_usable_size(Void_t* p);
61
     Report the number usable allocated bytes associated with allocated
62
     chunk p. This may or may not report more bytes than were requested,
63
     due to alignment and minimum size constraints.
64
  malloc_stats();
65
     Prints brief summary statistics on stderr.
66
  mallinfo()
67
     Returns (by copy) a struct containing various summary statistics.
68
  mallopt(int parameter_number, int parameter_value)
69
     Changes one of the tunable parameters described below. Returns
70
     1 if successful in changing the parameter, else 0.
71
 
72
* Vital statistics:
73
 
74
  Alignment:                            8-byte
75
       8 byte alignment is currently hardwired into the design.  This
76
       seems to suffice for all current machines and C compilers.
77
 
78
  Assumed pointer representation:       4 or 8 bytes
79
       Code for 8-byte pointers is untested by me but has worked
80
       reliably by Wolfram Gloger, who contributed most of the
81
       changes supporting this.
82
 
83
  Assumed size_t  representation:       4 or 8 bytes
84
       Note that size_t is allowed to be 4 bytes even if pointers are 8.
85
 
86
  Minimum overhead per allocated chunk: 4 or 8 bytes
87
       Each malloced chunk has a hidden overhead of 4 bytes holding size
88
       and status information.
89
 
90
  Minimum allocated size: 4-byte ptrs:  16 bytes    (including 4 overhead)
91
                          8-byte ptrs:  24/32 bytes (including, 4/8 overhead)
92
 
93
       When a chunk is freed, 12 (for 4byte ptrs) or 20 (for 8 byte
94
       ptrs but 4 byte size) or 24 (for 8/8) additional bytes are
95
       needed; 4 (8) for a trailing size field
96
       and 8 (16) bytes for free list pointers. Thus, the minimum
97
       allocatable size is 16/24/32 bytes.
98
 
99
       Even a request for zero bytes (i.e., malloc(0)) returns a
100
       pointer to something of the minimum allocatable size.
101
 
102
  Maximum allocated size: 4-byte size_t: 2^31 -  8 bytes
103
                          8-byte size_t: 2^63 - 16 bytes
104
 
105
       It is assumed that (possibly signed) size_t bit values suffice to
106
       represent chunk sizes. `Possibly signed' is due to the fact
107
       that `size_t' may be defined on a system as either a signed or
108
       an unsigned type. To be conservative, values that would appear
109
       as negative numbers are avoided.
10425 ripley 110
       Requests for sizes with a negative sign bit when the request
111
       size is treaded as a long will return null.
10347 ripley 112
 
113
  Maximum overhead wastage per allocated chunk: normally 15 bytes
114
 
115
       Alignnment demands, plus the minimum allocatable size restriction
116
       make the normal worst-case wastage 15 bytes (i.e., up to 15
117
       more bytes will be allocated than were requested in malloc), with
118
       two exceptions:
119
         1. Because requests for zero bytes allocate non-zero space,
120
            the worst case wastage for a request of zero bytes is 24 bytes.
121
         2. For requests >= mmap_threshold that are serviced via
122
            mmap(), the worst case wastage is 8 bytes plus the remainder
123
            from a system page (the minimal mmap unit); typically 4096 bytes.
124
 
125
* Limitations
126
 
127
    Here are some features that are NOT currently supported
128
 
129
    * No user-definable hooks for callbacks and the like.
130
    * No automated mechanism for fully checking that all accesses
131
      to malloced memory stay within their bounds.
132
    * No support for compaction.
133
 
134
* Synopsis of compile-time options:
135
 
136
    People have reported using previous versions of this malloc on all
137
    versions of Unix, sometimes by tweaking some of the defines
138
    below. It has been tested most extensively on Solaris and
139
    Linux. It is also reported to work on WIN32 platforms.
140
    People have also reported adapting this malloc for use in
141
    stand-alone embedded systems.
142
 
143
    The implementation is in straight, hand-tuned ANSI C.  Among other
144
    consequences, it uses a lot of macros.  Because of this, to be at
145
    all usable, this code should be compiled using an optimizing compiler
146
    (for example gcc -O2) that can simplify expressions and control
147
    paths.
148
 
149
  __STD_C                  (default: derived from C compiler defines)
150
     Nonzero if using ANSI-standard C compiler, a C++ compiler, or
151
     a C compiler sufficiently close to ANSI to get away with it.
152
  DEBUG                    (default: NOT defined)
153
     Define to enable debugging. Adds fairly extensive assertion-based
154
     checking to help track down memory errors, but noticeably slows down
155
     execution.
156
  REALLOC_ZERO_BYTES_FREES (default: NOT defined)
157
     Define this if you think that realloc(p, 0) should be equivalent
158
     to free(p). Otherwise, since malloc returns a unique pointer for
159
     malloc(0), so does realloc(p, 0).
160
  HAVE_MEMCPY               (default: defined)
161
     Define if you are not otherwise using ANSI STD C, but still
162
     have memcpy and memset in your C library and want to use them.
163
     Otherwise, simple internal versions are supplied.
164
  USE_MEMCPY               (default: 1 if HAVE_MEMCPY is defined, 0 otherwise)
165
     Define as 1 if you want the C library versions of memset and
166
     memcpy called in realloc and calloc (otherwise macro versions are used).
167
     At least on some platforms, the simple macro versions usually
168
     outperform libc versions.
169
  HAVE_MMAP                 (default: defined as 1)
170
     Define to non-zero to optionally make malloc() use mmap() to
171
     allocate very large blocks.
172
  HAVE_MREMAP                 (default: defined as 0 unless Linux libc set)
173
     Define to non-zero to optionally make realloc() use mremap() to
174
     reallocate very large blocks.
175
  malloc_getpagesize        (default: derived from system #includes)
176
     Either a constant or routine call returning the system page size.
177
  HAVE_USR_INCLUDE_MALLOC_H (default: NOT defined)
178
     Optionally define if you are on a system with a /usr/include/malloc.h
179
     that declares struct mallinfo. It is not at all necessary to
180
     define this even if you do, but will ensure consistency.
181
  INTERNAL_SIZE_T           (default: size_t)
182
     Define to a 32-bit type (probably `unsigned int') if you are on a
183
     64-bit machine, yet do not want or need to allow malloc requests of
184
     greater than 2^31 to be handled. This saves space, especially for
185
     very small chunks.
186
  INTERNAL_LINUX_C_LIB      (default: NOT defined)
187
     Defined only when compiled as part of Linux libc.
188
     Also note that there is some odd internal name-mangling via defines
189
     (for example, internally, `malloc' is named `mALLOc') needed
190
     when compiling in this case. These look funny but don't otherwise
191
     affect anything.
192
  WIN32                     (default: undefined)
193
     Define this on MS win (95, nt) platforms to compile in sbrk emulation.
10425 ripley 194
  LACKS_UNISTD_H            (default: undefined if not WIN32)
10347 ripley 195
     Define this if your system does not have a <unistd.h>.
10425 ripley 196
  LACKS_SYS_PARAM_H         (default: undefined if not WIN32)
197
     Define this if your system does not have a <sys/param.h>.
10347 ripley 198
  MORECORE                  (default: sbrk)
199
     The name of the routine to call to obtain more memory from the system.
200
  MORECORE_FAILURE          (default: -1)
201
     The value returned upon failure of MORECORE.
202
  MORECORE_CLEARS           (default 1)
203
     True (1) if the routine mapped to MORECORE zeroes out memory (which
204
     holds for sbrk).
205
  DEFAULT_TRIM_THRESHOLD
206
  DEFAULT_TOP_PAD
207
  DEFAULT_MMAP_THRESHOLD
208
  DEFAULT_MMAP_MAX
209
     Default values of tunable parameters (described in detail below)
210
     controlling interaction with host system routines (sbrk, mmap, etc).
211
     These values may also be changed dynamically via mallopt(). The
212
     preset defaults are those that give best performance for typical
213
     programs/systems.
10425 ripley 214
  USE_DL_PREFIX             (default: undefined)
215
     Prefix all public routines with the string 'dl'.  Useful to
216
     quickly avoid procedure declaration conflicts and linker symbol
217
     conflicts with existing memory allocation routines.
10347 ripley 218
 
219
 
220
*/
221
 
222
 
223
 
224
 
225
/* Preliminaries */
226
 
227
#ifndef __STD_C
228
#ifdef __STDC__
229
#define __STD_C     1
230
#else
231
#if __cplusplus
232
#define __STD_C     1
233
#else
234
#define __STD_C     0
235
#endif /*__cplusplus*/
236
#endif /*__STDC__*/
237
#endif /*__STD_C*/
238
 
239
#ifndef Void_t
10425 ripley 240
#if (__STD_C || defined(WIN32))
10347 ripley 241
#define Void_t      void
242
#else
243
#define Void_t      char
244
#endif
245
#endif /*Void_t*/
246
 
247
#if __STD_C
248
#include <stddef.h>   /* for size_t */
249
#else
250
#include <sys/types.h>
251
#endif
252
 
253
#ifdef __cplusplus
254
extern "C" {
255
#endif
256
 
257
#include <stdio.h>    /* needed for malloc_stats */
258
 
259
 
260
/*
261
  Compile-time options
262
*/
263
 
264
 
265
/*
266
    Debugging:
267
 
268
    Because freed chunks may be overwritten with link fields, this
269
    malloc will often die when freed memory is overwritten by user
270
    programs.  This can be very effective (albeit in an annoying way)
271
    in helping track down dangling pointers.
272
 
273
    If you compile with -DDEBUG, a number of assertion checks are
274
    enabled that will catch more memory errors. You probably won't be
275
    able to make much sense of the actual assertion errors, but they
276
    should help you locate incorrectly overwritten memory.  The
277
    checking is fairly extensive, and will slow down execution
278
    noticeably. Calling malloc_stats or mallinfo with DEBUG set will
279
    attempt to check every non-mmapped allocated and free chunk in the
280
    course of computing the summmaries. (By nature, mmapped regions
281
    cannot be checked very much automatically.)
282
 
283
    Setting DEBUG may also be helpful if you are trying to modify
284
    this code. The assertions in the check routines spell out in more
285
    detail the assumptions and invariants underlying the algorithms.
286
 
287
*/
288
 
289
#if DEBUG
290
#include <assert.h>
291
#else
292
#define assert(x) ((void)0)
293
#endif
294
 
295
 
296
/*
297
  INTERNAL_SIZE_T is the word-size used for internal bookkeeping
298
  of chunk sizes. On a 64-bit machine, you can reduce malloc
299
  overhead by defining INTERNAL_SIZE_T to be a 32 bit `unsigned int'
300
  at the expense of not being able to handle requests greater than
301
  2^31. This limitation is hardly ever a concern; you are encouraged
302
  to set this. However, the default version is the same as size_t.
303
*/
304
 
305
#ifndef INTERNAL_SIZE_T
306
#define INTERNAL_SIZE_T size_t
307
#endif
308
 
309
/*
310
  REALLOC_ZERO_BYTES_FREES should be set if a call to
311
  realloc with zero bytes should be the same as a call to free.
312
  Some people think it should. Otherwise, since this malloc
313
  returns a unique pointer for malloc(0), so does realloc(p, 0).
314
*/
315
 
316
 
317
/*   #define REALLOC_ZERO_BYTES_FREES */
318
 
319
 
320
/*
321
  WIN32 causes an emulation of sbrk to be compiled in
322
  mmap-based options are not currently supported in WIN32.
323
*/
324
 
325
/* #define WIN32 */
326
#ifdef WIN32
327
#define MORECORE wsbrk
328
#define HAVE_MMAP 0
10425 ripley 329
 
330
#define LACKS_UNISTD_H
331
#define LACKS_SYS_PARAM_H
332
 
333
/*
334
  Include 'windows.h' to get the necessary declarations for the
335
  Microsoft Visual C++ data structures and routines used in the 'sbrk'
336
  emulation.
337
 
338
  Define WIN32_LEAN_AND_MEAN so that only the essential Microsoft
339
  Visual C++ header files are included.
340
*/
341
#define WIN32_LEAN_AND_MEAN
342
#include <windows.h>
10347 ripley 343
#endif
344
 
345
 
346
/*
347
  HAVE_MEMCPY should be defined if you are not otherwise using
348
  ANSI STD C, but still have memcpy and memset in your C library
349
  and want to use them in calloc and realloc. Otherwise simple
350
  macro versions are defined here.
351
 
352
  USE_MEMCPY should be defined as 1 if you actually want to
353
  have memset and memcpy called. People report that the macro
354
  versions are often enough faster than libc versions on many
355
  systems that it is better to use them.
356
 
357
*/
358
 
359
#define HAVE_MEMCPY
360
 
361
#ifndef USE_MEMCPY
362
#ifdef HAVE_MEMCPY
363
#define USE_MEMCPY 1
364
#else
365
#define USE_MEMCPY 0
366
#endif
367
#endif
368
 
369
#if (__STD_C || defined(HAVE_MEMCPY))
370
 
371
#if __STD_C
372
void* memset(void*, int, size_t);
373
void* memcpy(void*, const void*, size_t);
374
#else
10425 ripley 375
#ifdef WIN32
376
// On Win32 platforms, 'memset()' and 'memcpy()' are already declared in
377
// 'windows.h'
378
#else
10347 ripley 379
Void_t* memset();
380
Void_t* memcpy();
381
#endif
382
#endif
10425 ripley 383
#endif
10347 ripley 384
 
385
#if USE_MEMCPY
386
 
387
/* The following macros are only invoked with (2n+1)-multiples of
388
   INTERNAL_SIZE_T units, with a positive integer n. This is exploited
389
   for fast inline execution when n is small. */
390
 
391
#define MALLOC_ZERO(charp, nbytes)                                            \
392
do {                                                                          \
393
  INTERNAL_SIZE_T mzsz = (nbytes);                                            \
394
  if(mzsz <= 9*sizeof(mzsz)) {                                                \
395
    INTERNAL_SIZE_T* mz = (INTERNAL_SIZE_T*) (charp);                         \
396
    if(mzsz >= 5*sizeof(mzsz)) {     *mz++ = 0;                               \
397
                                     *mz++ = 0;                               \
398
      if(mzsz >= 7*sizeof(mzsz)) {   *mz++ = 0;                               \
399
                                     *mz++ = 0;                               \
400
        if(mzsz >= 9*sizeof(mzsz)) { *mz++ = 0;                               \
401
                                     *mz++ = 0; }}}                           \
402
                                     *mz++ = 0;                               \
403
                                     *mz++ = 0;                               \
404
                                     *mz   = 0;                               \
405
  } else memset((charp), 0, mzsz);                                            \
406
} while(0)
407
 
408
#define MALLOC_COPY(dest,src,nbytes)                                          \
409
do {                                                                          \
410
  INTERNAL_SIZE_T mcsz = (nbytes);                                            \
411
  if(mcsz <= 9*sizeof(mcsz)) {                                                \
412
    INTERNAL_SIZE_T* mcsrc = (INTERNAL_SIZE_T*) (src);                        \
413
    INTERNAL_SIZE_T* mcdst = (INTERNAL_SIZE_T*) (dest);                       \
414
    if(mcsz >= 5*sizeof(mcsz)) {     *mcdst++ = *mcsrc++;                     \
415
                                     *mcdst++ = *mcsrc++;                     \
416
      if(mcsz >= 7*sizeof(mcsz)) {   *mcdst++ = *mcsrc++;                     \
417
                                     *mcdst++ = *mcsrc++;                     \
418
        if(mcsz >= 9*sizeof(mcsz)) { *mcdst++ = *mcsrc++;                     \
419
                                     *mcdst++ = *mcsrc++; }}}                 \
420
                                     *mcdst++ = *mcsrc++;                     \
421
                                     *mcdst++ = *mcsrc++;                     \
422
                                     *mcdst   = *mcsrc  ;                     \
423
  } else memcpy(dest, src, mcsz);                                             \
424
} while(0)
425
 
426
#else /* !USE_MEMCPY */
427
 
428
/* Use Duff's device for good zeroing/copying performance. */
429
 
430
#define MALLOC_ZERO(charp, nbytes)                                            \
431
do {                                                                          \
432
  INTERNAL_SIZE_T* mzp = (INTERNAL_SIZE_T*)(charp);                           \
433
  long mctmp = (nbytes)/sizeof(INTERNAL_SIZE_T), mcn;                         \
434
  if (mctmp < 8) mcn = 0; else { mcn = (mctmp-1)/8; mctmp %= 8; }             \
435
  switch (mctmp) {                                                            \
436
    case 0: for(;;) { *mzp++ = 0;                                             \
437
    case 7:           *mzp++ = 0;                                             \
438
    case 6:           *mzp++ = 0;                                             \
439
    case 5:           *mzp++ = 0;                                             \
440
    case 4:           *mzp++ = 0;                                             \
441
    case 3:           *mzp++ = 0;                                             \
442
    case 2:           *mzp++ = 0;                                             \
443
    case 1:           *mzp++ = 0; if(mcn <= 0) break; mcn--; }                \
444
  }                                                                           \
445
} while(0)
446
 
447
#define MALLOC_COPY(dest,src,nbytes)                                          \
448
do {                                                                          \
449
  INTERNAL_SIZE_T* mcsrc = (INTERNAL_SIZE_T*) src;                            \
450
  INTERNAL_SIZE_T* mcdst = (INTERNAL_SIZE_T*) dest;                           \
451
  long mctmp = (nbytes)/sizeof(INTERNAL_SIZE_T), mcn;                         \
452
  if (mctmp < 8) mcn = 0; else { mcn = (mctmp-1)/8; mctmp %= 8; }             \
453
  switch (mctmp) {                                                            \
454
    case 0: for(;;) { *mcdst++ = *mcsrc++;                                    \
455
    case 7:           *mcdst++ = *mcsrc++;                                    \
456
    case 6:           *mcdst++ = *mcsrc++;                                    \
457
    case 5:           *mcdst++ = *mcsrc++;                                    \
458
    case 4:           *mcdst++ = *mcsrc++;                                    \
459
    case 3:           *mcdst++ = *mcsrc++;                                    \
460
    case 2:           *mcdst++ = *mcsrc++;                                    \
461
    case 1:           *mcdst++ = *mcsrc++; if(mcn <= 0) break; mcn--; }       \
462
  }                                                                           \
463
} while(0)
464
 
465
#endif
466
 
467
 
468
/*
469
  Define HAVE_MMAP to optionally make malloc() use mmap() to
470
  allocate very large blocks.  These will be returned to the
471
  operating system immediately after a free().
472
*/
473
 
474
#ifndef HAVE_MMAP
475
#define HAVE_MMAP 1
476
#endif
477
 
478
/*
479
  Define HAVE_MREMAP to make realloc() use mremap() to re-allocate
480
  large blocks.  This is currently only possible on Linux with
481
  kernel versions newer than 1.3.77.
482
*/
483
 
484
#ifndef HAVE_MREMAP
485
#ifdef INTERNAL_LINUX_C_LIB
486
#define HAVE_MREMAP 1
487
#else
488
#define HAVE_MREMAP 0
489
#endif
490
#endif
491
 
492
#if HAVE_MMAP
493
 
494
#include <unistd.h>
495
#include <fcntl.h>
496
#include <sys/mman.h>
497
 
498
#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
499
#define MAP_ANONYMOUS MAP_ANON
500
#endif
501
 
502
#endif /* HAVE_MMAP */
503
 
504
/*
505
  Access to system page size. To the extent possible, this malloc
506
  manages memory from the system in page-size units.
507
 
508
  The following mechanics for getpagesize were adapted from
509
  bsd/gnu getpagesize.h
510
*/
511
 
512
#ifndef LACKS_UNISTD_H
513
#  include <unistd.h>
514
#endif
515
 
516
#ifndef malloc_getpagesize
517
#  ifdef _SC_PAGESIZE         /* some SVR4 systems omit an underscore */
518
#    ifndef _SC_PAGE_SIZE
519
#      define _SC_PAGE_SIZE _SC_PAGESIZE
520
#    endif
521
#  endif
522
#  ifdef _SC_PAGE_SIZE
523
#    define malloc_getpagesize sysconf(_SC_PAGE_SIZE)
524
#  else
525
#    if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE)
526
       extern size_t getpagesize();
527
#      define malloc_getpagesize getpagesize()
528
#    else
10425 ripley 529
#      ifdef WIN32
530
#        define malloc_getpagesize (4096) /* TBD: Use 'GetSystemInfo' instead */
10347 ripley 531
#      else
10425 ripley 532
#        ifndef LACKS_SYS_PARAM_H
533
#          include <sys/param.h>
534
#        endif
535
#        ifdef EXEC_PAGESIZE
536
#          define malloc_getpagesize EXEC_PAGESIZE
10347 ripley 537
#        else
10425 ripley 538
#          ifdef NBPG
539
#            ifndef CLSIZE
540
#              define malloc_getpagesize NBPG
541
#            else
542
#              define malloc_getpagesize (NBPG * CLSIZE)
543
#            endif
10347 ripley 544
#          else
10425 ripley 545
#            ifdef NBPC
546
#              define malloc_getpagesize NBPC
10347 ripley 547
#            else
10425 ripley 548
#              ifdef PAGESIZE
549
#                define malloc_getpagesize PAGESIZE
550
#              else
551
#                define malloc_getpagesize (4096) /* just guess */
552
#              endif
10347 ripley 553
#            endif
554
#          endif
555
#        endif
556
#      endif
557
#    endif
558
#  endif
559
#endif
560
 
561
 
562
 
563
/*
564
 
565
  This version of malloc supports the standard SVID/XPG mallinfo
566
  routine that returns a struct containing the same kind of
567
  information you can get from malloc_stats. It should work on
568
  any SVID/XPG compliant system that has a /usr/include/malloc.h
569
  defining struct mallinfo. (If you'd like to install such a thing
570
  yourself, cut out the preliminary declarations as described above
571
  and below and save them in a malloc.h file. But there's no
572
  compelling reason to bother to do this.)
573
 
574
  The main declaration needed is the mallinfo struct that is returned
575
  (by-copy) by mallinfo().  The SVID/XPG malloinfo struct contains a
576
  bunch of fields, most of which are not even meaningful in this
577
  version of malloc. Some of these fields are are instead filled by
578
  mallinfo() with other numbers that might possibly be of interest.
579
 
580
  HAVE_USR_INCLUDE_MALLOC_H should be set if you have a
581
  /usr/include/malloc.h file that includes a declaration of struct
582
  mallinfo.  If so, it is included; else an SVID2/XPG2 compliant
583
  version is declared below.  These must be precisely the same for
584
  mallinfo() to work.
585
 
586
*/
587
 
588
/* #define HAVE_USR_INCLUDE_MALLOC_H */
589
 
590
#if HAVE_USR_INCLUDE_MALLOC_H
591
#include "/usr/include/malloc.h"
592
#else
593
 
594
/* SVID2/XPG mallinfo structure */
595
 
596
struct mallinfo {
597
  int arena;    /* total space allocated from system */
598
  int ordblks;  /* number of non-inuse chunks */
599
  int smblks;   /* unused -- always zero */
600
  int hblks;    /* number of mmapped regions */
601
  int hblkhd;   /* total space in mmapped regions */
602
  int usmblks;  /* unused -- always zero */
603
  int fsmblks;  /* unused -- always zero */
604
  int uordblks; /* total allocated space */
605
  int fordblks; /* total non-inuse space */
606
  int keepcost; /* top-most, releasable (via malloc_trim) space */
607
};
608
 
609
/* SVID2/XPG mallopt options */
610
 
611
#define M_MXFAST  1    /* UNUSED in this malloc */
612
#define M_NLBLKS  2    /* UNUSED in this malloc */
613
#define M_GRAIN   3    /* UNUSED in this malloc */
614
#define M_KEEP    4    /* UNUSED in this malloc */
615
 
616
#endif
617
 
618
/* mallopt options that actually do something */
619
 
620
#define M_TRIM_THRESHOLD    -1
621
#define M_TOP_PAD           -2
622
#define M_MMAP_THRESHOLD    -3
623
#define M_MMAP_MAX          -4
624
 
625
 
626
 
627
#ifndef DEFAULT_TRIM_THRESHOLD
628
#define DEFAULT_TRIM_THRESHOLD (128 * 1024)
629
#endif
630
 
631
/*
632
    M_TRIM_THRESHOLD is the maximum amount of unused top-most memory
633
      to keep before releasing via malloc_trim in free().
634
 
635
      Automatic trimming is mainly useful in long-lived programs.
636
      Because trimming via sbrk can be slow on some systems, and can
637
      sometimes be wasteful (in cases where programs immediately
638
      afterward allocate more large chunks) the value should be high
639
      enough so that your overall system performance would improve by
640
      releasing.
641
 
642
      The trim threshold and the mmap control parameters (see below)
643
      can be traded off with one another. Trimming and mmapping are
644
      two different ways of releasing unused memory back to the
645
      system. Between these two, it is often possible to keep
646
      system-level demands of a long-lived program down to a bare
647
      minimum. For example, in one test suite of sessions measuring
648
      the XF86 X server on Linux, using a trim threshold of 128K and a
649
      mmap threshold of 192K led to near-minimal long term resource
650
      consumption.
651
 
652
      If you are using this malloc in a long-lived program, it should
653
      pay to experiment with these values.  As a rough guide, you
654
      might set to a value close to the average size of a process
655
      (program) running on your system.  Releasing this much memory
656
      would allow such a process to run in memory.  Generally, it's
657
      worth it to tune for trimming rather tham memory mapping when a
658
      program undergoes phases where several large chunks are
659
      allocated and released in ways that can reuse each other's
660
      storage, perhaps mixed with phases where there are no such
661
      chunks at all.  And in well-behaved long-lived programs,
662
      controlling release of large blocks via trimming versus mapping
663
      is usually faster.
664
 
665
      However, in most programs, these parameters serve mainly as
666
      protection against the system-level effects of carrying around
667
      massive amounts of unneeded memory. Since frequent calls to
668
      sbrk, mmap, and munmap otherwise degrade performance, the default
669
      parameters are set to relatively high values that serve only as
670
      safeguards.
671
 
672
      The default trim value is high enough to cause trimming only in
673
      fairly extreme (by current memory consumption standards) cases.
674
      It must be greater than page size to have any useful effect.  To
675
      disable trimming completely, you can set to (unsigned long)(-1);
676
 
677
 
678
*/
679
 
680
 
681
#ifndef DEFAULT_TOP_PAD
682
#define DEFAULT_TOP_PAD        (0)
683
#endif
684
 
685
/*
686
    M_TOP_PAD is the amount of extra `padding' space to allocate or
687
      retain whenever sbrk is called. It is used in two ways internally:
688
 
689
      * When sbrk is called to extend the top of the arena to satisfy
690
        a new malloc request, this much padding is added to the sbrk
691
        request.
692
 
693
      * When malloc_trim is called automatically from free(),
694
        it is used as the `pad' argument.
695
 
696
      In both cases, the actual amount of padding is rounded
697
      so that the end of the arena is always a system page boundary.
698
 
699
      The main reason for using padding is to avoid calling sbrk so
700
      often. Having even a small pad greatly reduces the likelihood
701
      that nearly every malloc request during program start-up (or
702
      after trimming) will invoke sbrk, which needlessly wastes
703
      time.
704
 
705
      Automatic rounding-up to page-size units is normally sufficient
706
      to avoid measurable overhead, so the default is 0.  However, in
707
      systems where sbrk is relatively slow, it can pay to increase
708
      this value, at the expense of carrying around more memory than
709
      the program needs.
710
 
711
*/
712
 
713
 
714
#ifndef DEFAULT_MMAP_THRESHOLD
715
#define DEFAULT_MMAP_THRESHOLD (128 * 1024)
716
#endif
717
 
718
/*
719
 
720
    M_MMAP_THRESHOLD is the request size threshold for using mmap()
721
      to service a request. Requests of at least this size that cannot
722
      be allocated using already-existing space will be serviced via mmap.
723
      (If enough normal freed space already exists it is used instead.)
724
 
725
      Using mmap segregates relatively large chunks of memory so that
726
      they can be individually obtained and released from the host
727
      system. A request serviced through mmap is never reused by any
728
      other request (at least not directly; the system may just so
729
      happen to remap successive requests to the same locations).
730
 
731
      Segregating space in this way has the benefit that mmapped space
732
      can ALWAYS be individually released back to the system, which
733
      helps keep the system level memory demands of a long-lived
734
      program low. Mapped memory can never become `locked' between
735
      other chunks, as can happen with normally allocated chunks, which
736
      menas that even trimming via malloc_trim would not release them.
737
 
738
      However, it has the disadvantages that:
739
 
740
         1. The space cannot be reclaimed, consolidated, and then
741
            used to service later requests, as happens with normal chunks.
742
         2. It can lead to more wastage because of mmap page alignment
743
            requirements
744
         3. It causes malloc performance to be more dependent on host
745
            system memory management support routines which may vary in
746
            implementation quality and may impose arbitrary
747
            limitations. Generally, servicing a request via normal
748
            malloc steps is faster than going through a system's mmap.
749
 
750
      All together, these considerations should lead you to use mmap
751
      only for relatively large requests.
752
 
753
 
754
*/
755
 
756
 
757
 
758
#ifndef DEFAULT_MMAP_MAX
759
#if HAVE_MMAP
760
#define DEFAULT_MMAP_MAX       (64)
761
#else
762
#define DEFAULT_MMAP_MAX       (0)
763
#endif
764
#endif
765
 
766
/*
767
    M_MMAP_MAX is the maximum number of requests to simultaneously
768
      service using mmap. This parameter exists because:
769
 
770
         1. Some systems have a limited number of internal tables for
771
            use by mmap.
772
         2. In most systems, overreliance on mmap can degrade overall
773
            performance.
774
         3. If a program allocates many large regions, it is probably
775
            better off using normal sbrk-based allocation routines that
776
            can reclaim and reallocate normal heap memory. Using a
777
            small value allows transition into this mode after the
778
            first few allocations.
779
 
780
      Setting to 0 disables all use of mmap.  If HAVE_MMAP is not set,
781
      the default value is 0, and attempts to set it to non-zero values
782
      in mallopt will fail.
783
*/
784
 
785
 
786
 
787
 
788
/*
10425 ripley 789
    USE_DL_PREFIX will prefix all public routines with the string 'dl'.
790
      Useful to quickly avoid procedure declaration conflicts and linker
791
      symbol conflicts with existing memory allocation routines.
10347 ripley 792
 
10425 ripley 793
*/
794
 
795
/* #define USE_DL_PREFIX */
796
 
797
 
798
 
799
 
800
/*
801
 
10347 ripley 802
  Special defines for linux libc
803
 
804
  Except when compiled using these special defines for Linux libc
805
  using weak aliases, this malloc is NOT designed to work in
806
  multithreaded applications.  No semaphores or other concurrency
807
  control are provided to ensure that multiple malloc or free calls
808
  don't run at the same time, which could be disasterous. A single
809
  semaphore could be used across malloc, realloc, and free (which is
810
  essentially the effect of the linux weak alias approach). It would
811
  be hard to obtain finer granularity.
812
 
813
*/
814
 
815
 
816
#ifdef INTERNAL_LINUX_C_LIB
817
 
818
#if __STD_C
819
 
820
Void_t * __default_morecore_init (ptrdiff_t);
821
Void_t *(*__morecore)(ptrdiff_t) = __default_morecore_init;
822
 
823
#else
824
 
825
Void_t * __default_morecore_init ();
826
Void_t *(*__morecore)() = __default_morecore_init;
827
 
828
#endif
829
 
830
#define MORECORE (*__morecore)
831
#define MORECORE_FAILURE 0
832
#define MORECORE_CLEARS 1
833
 
834
#else /* INTERNAL_LINUX_C_LIB */
835
 
836
#if __STD_C
837
extern Void_t*     sbrk(ptrdiff_t);
838
#else
839
extern Void_t*     sbrk();
840
#endif
841
 
842
#ifndef MORECORE
843
#define MORECORE sbrk
844
#endif
845
 
846
#ifndef MORECORE_FAILURE
847
#define MORECORE_FAILURE -1
848
#endif
849
 
850
#ifndef MORECORE_CLEARS
851
#define MORECORE_CLEARS 1
852
#endif
853
 
854
#endif /* INTERNAL_LINUX_C_LIB */
855
 
856
#if defined(INTERNAL_LINUX_C_LIB) && defined(__ELF__)
857
 
858
#define cALLOc		__libc_calloc
859
#define fREe		__libc_free
860
#define mALLOc		__libc_malloc
861
#define mEMALIGn	__libc_memalign
862
#define rEALLOc		__libc_realloc
863
#define vALLOc		__libc_valloc
864
#define pvALLOc		__libc_pvalloc
865
#define mALLINFo	__libc_mallinfo
866
#define mALLOPt		__libc_mallopt
867
 
868
#pragma weak calloc = __libc_calloc
869
#pragma weak free = __libc_free
870
#pragma weak cfree = __libc_free
871
#pragma weak malloc = __libc_malloc
872
#pragma weak memalign = __libc_memalign
873
#pragma weak realloc = __libc_realloc
874
#pragma weak valloc = __libc_valloc
875
#pragma weak pvalloc = __libc_pvalloc
876
#pragma weak mallinfo = __libc_mallinfo
877
#pragma weak mallopt = __libc_mallopt
878
 
879
#else
880
 
10425 ripley 881
#ifdef USE_DL_PREFIX
882
#define cALLOc		dlcalloc
883
#define fREe		dlfree
884
#define mALLOc		dlmalloc
885
#define mEMALIGn	dlmemalign
886
#define rEALLOc		dlrealloc
887
#define vALLOc		dlvalloc
888
#define pvALLOc		dlpvalloc
889
#define mALLINFo	dlmallinfo
890
#define mALLOPt		dlmallopt
891
#else /* USE_DL_PREFIX */
10347 ripley 892
#define cALLOc		calloc
893
#define fREe		free
894
#define mALLOc		malloc
895
#define mEMALIGn	memalign
896
#define rEALLOc		realloc
897
#define vALLOc		valloc
898
#define pvALLOc		pvalloc
899
#define mALLINFo	mallinfo
900
#define mALLOPt		mallopt
10425 ripley 901
#endif /* USE_DL_PREFIX */
10347 ripley 902
 
903
#endif
904
 
905
/* Public routines */
906
 
907
#if __STD_C
908
 
909
Void_t* mALLOc(size_t);
910
void    fREe(Void_t*);
911
Void_t* rEALLOc(Void_t*, size_t);
912
Void_t* mEMALIGn(size_t, size_t);
913
Void_t* vALLOc(size_t);
914
Void_t* pvALLOc(size_t);
915
Void_t* cALLOc(size_t, size_t);
916
void    cfree(Void_t*);
917
int     malloc_trim(size_t);
918
size_t  malloc_usable_size(Void_t*);
919
void    malloc_stats();
920
int     mALLOPt(int, int);
921
struct mallinfo mALLINFo(void);
922
#else
923
Void_t* mALLOc();
924
void    fREe();
925
Void_t* rEALLOc();
926
Void_t* mEMALIGn();
927
Void_t* vALLOc();
928
Void_t* pvALLOc();
929
Void_t* cALLOc();
930
void    cfree();
931
int     malloc_trim();
932
size_t  malloc_usable_size();
933
void    malloc_stats();
934
int     mALLOPt();
935
struct mallinfo mALLINFo();
936
#endif
937
 
938
 
939
#ifdef __cplusplus
940
};  /* end of extern "C" */
941
#endif
942
 
943
/* ---------- To make a malloc.h, end cutting here ------------ */
944
 
945
 
946
/*
947
  Emulation of sbrk for WIN32
948
  All code within the ifdef WIN32 is untested by me.
10425 ripley 949
 
950
  Thanks to Martin Fong and others for supplying this.
10347 ripley 951
*/
952
 
953
/*
954
  Quite heavily modified to make compile and remove redundant code,
955
  and to coalesce adjacent blocks.  This version does not always
956
  allocate contiguous space, and it cannot return space from other
11007 ripley 957
  than the current allocation block.
10347 ripley 958
 
959
  BDR 2000-8-20.
960
 */
961
 
962
#ifdef WIN32
963
#include <windows.h>
964
extern void R_Suicide(char *);
965
static int PageSize=0;
966
 
967
#define AlignPage(add) (((add) + (PageSize-1)) & ~(PageSize-1))
10425 ripley 968
#define AlignPage64K(add) (((add) + (0x10000 - 1)) & ~(0x10000 - 1))
10347 ripley 969
 
11100 ripley 970
/* reserve 256MB to ensure large contiguous space */
971
#define RESERVED_SIZE (256*1024*1024)
10347 ripley 972
#define NEXT_SIZE (8*1024*1024)
973
/* On most Windows systems, the bottom 2Gb of address space is
974
   user space (on a few it is 3Gb) */
975
#define TOP_MEMORY ((unsigned long)2*1024*1024*1024)
976
 
977
static unsigned int gNextAddress = 0;
978
static unsigned int gAddressBase = 0;
979
static unsigned int gReservedSize = 0;
11007 ripley 980
static unsigned int totalAllocated = 0;
981
extern unsigned int R_max_memory;
10347 ripley 982
 
983
static
984
int getpagesize(void)
985
{
986
    SYSTEM_INFO si;
987
    GetSystemInfo(&si);
988
    return (int)si.dwPageSize;
989
}
990
 
991
static
992
void *findRegion (void *start_address, unsigned long size)
993
{
994
    MEMORY_BASIC_INFORMATION info;
995
    while ((unsigned long)start_address < TOP_MEMORY)
996
    {
997
	VirtualQuery (start_address, &info, sizeof (info));
11091 ripley 998
	if (info.State == MEM_FREE && info.RegionSize >= size)
10347 ripley 999
	    return start_address;
10425 ripley 1000
	else {
11091 ripley 1001
/*	    Requested region is not available or not big enough 
1002
	    so see if the next region is available.  Set 'start_address'
10425 ripley 1003
	    to the next region and call 'VirtualQuery()' again. */
1004
 
10347 ripley 1005
	    start_address = (char*)info.BaseAddress + info.RegionSize;
10425 ripley 1006
 
1007
/*	    Make sure we start looking for the next region
1008
	    on the *next* 64K boundary.  Otherwise, even if
1009
	    the new region is free according to
1010
	    'VirtualQuery()', the subsequent call to
1011
	    'VirtualAlloc()' (which follows the call to
1012
	    this routine in 'wsbrk()') will round *down*
1013
	    the requested address to a 64K boundary which
1014
	    we already know is an address in the
1015
	    unavailable region.  Thus, the subsequent call
1016
	    to 'VirtualAlloc()' will fail and bring us back
1017
	    here, causing us to go into an infinite loop. */
1018
 
1019
	    start_address = 
1020
		(void *) AlignPage64K((unsigned long) start_address);
1021
	}
10347 ripley 1022
    }
1023
    return NULL;
1024
}
1025
 
11091 ripley 1026
/* BDR 2000-10-28: add loop count as this infinitely looped */
10347 ripley 1027
void *wsbrk (long size)
1028
{
1029
    void *tmp;
11091 ripley 1030
    int count = 0;
10347 ripley 1031
    if (PageSize == 0) PageSize = getpagesize();
1032
 
1033
    if (size > 0) {
11007 ripley 1034
	/* will this take us over the limit? */
1035
	if (totalAllocated + size > R_max_memory) 
1036
	    return (void*)-1;
1037
 
10347 ripley 1038
	/* first check if request fits in reserved space, and if not
1039
	   try to reserve the address space (never unreserved) */
1040
	if (gAddressBase == 0) {
11091 ripley 1041
	    gReservedSize = max (RESERVED_SIZE, AlignPage64K(size));
10347 ripley 1042
	    gNextAddress = gAddressBase =
1043
		(unsigned int)VirtualAlloc (NULL, gReservedSize,
1044
					    MEM_RESERVE, PAGE_NOACCESS);
1045
	    if(!gAddressBase)
1046
		R_Suicide("unable to reserve initial space in wsbrk");
1047
	} else if (AlignPage (gNextAddress + size) > (gAddressBase +
1048
						      gReservedSize)) {
11091 ripley 1049
	    long new_size = max (NEXT_SIZE, AlignPage64K(size));
10347 ripley 1050
	    void *new_address = (void*)(gAddressBase+gReservedSize);
1051
	    do {
11091 ripley 1052
		/* if we failed twice, try somewhat desparately */
1053
		if (count >= 2) 
1054
		    new_address = (void *)((unsigned int) new_address + new_size + NEXT_SIZE);
10347 ripley 1055
		new_address = findRegion (new_address, new_size);
1056
		if (new_address == 0) return (void *) -1;
1057
		gNextAddress =
1058
		    (unsigned int)VirtualAlloc (new_address, new_size,
1059
						MEM_RESERVE, PAGE_NOACCESS);
1060
				/* repeat in case of race condition
1061
				  The region that we found has been grabbed
1062
				  by another thread */
11091 ripley 1063
	    } while (gNextAddress == 0 && count++ < 10);
1064
	    if (gNextAddress == 0) return (void *) -1;
10347 ripley 1065
 
1066
	    if (new_address != (void*)gNextAddress)
1067
		R_Suicide("internal error in wsbrk");
1068
 
11091 ripley 1069
	    if (gNextAddress == gAddressBase + gReservedSize) {
10347 ripley 1070
		/* allocated a contiguous block */
1071
		gReservedSize += new_size;
1072
	    } else {
1073
		gAddressBase = gNextAddress;
1074
		gReservedSize = new_size;
1075
	    }
1076
	}
1077
 
1078
	/* Now actually allocate, if not already in an allocated page */
1079
	if ((size + gNextAddress) > AlignPage(gNextAddress)) {
1080
	    void* res;
1081
	    res = VirtualAlloc ((void*)AlignPage(gNextAddress),
1082
				(size + gNextAddress -
1083
				 AlignPage(gNextAddress)),
1084
				MEM_COMMIT, PAGE_READWRITE);
1085
	    if (res == 0)
1086
		return (void*)-1;
1087
	}
1088
	tmp = (void*)gNextAddress;
1089
	gNextAddress = (unsigned int)tmp + size;
11007 ripley 1090
	totalAllocated += size + gNextAddress - AlignPage(gNextAddress);
10347 ripley 1091
	return tmp;
1092
    } else if (size < 0) {
1093
	unsigned int alignedGoal = AlignPage(gNextAddress + size);
1094
	/* Trim by decommiting the virtual memory */
1095
	if (alignedGoal >= gAddressBase)
1096
	{
1097
	    VirtualFree ((void*)alignedGoal, gNextAddress - alignedGoal,
1098
			 MEM_DECOMMIT);
1099
	    gNextAddress = gNextAddress + size;
11007 ripley 1100
	    totalAllocated -= gNextAddress - alignedGoal;
10347 ripley 1101
	    return (void*)gNextAddress;
1102
	}
1103
	else /* requested release of more than we have in this block */
1104
	{
1105
	    VirtualFree ((void*)gAddressBase, gNextAddress - gAddressBase,
1106
			 MEM_DECOMMIT);
1107
	    gNextAddress = gAddressBase;
11007 ripley 1108
	    totalAllocated -= gNextAddress - gAddressBase;
10347 ripley 1109
	    return (void*)-1;
1110
	}
1111
    } else { /* size = 0 */
1112
	return (void*)gNextAddress;
1113
    }
1114
}
1115
#endif /* WIN32 */
1116
 
1117
 
1118
 
1119
/*
1120
  Type declarations
1121
*/
1122
 
1123
 
1124
struct malloc_chunk
1125
{
1126
  INTERNAL_SIZE_T prev_size; /* Size of previous chunk (if free). */
1127
  INTERNAL_SIZE_T size;      /* Size in bytes, including overhead. */
1128
  struct malloc_chunk* fd;   /* double links -- used only if free. */
1129
  struct malloc_chunk* bk;
1130
};
1131
 
1132
typedef struct malloc_chunk* mchunkptr;
1133
 
1134
/*
1135
 
1136
   malloc_chunk details:
1137
 
1138
    (The following includes lightly edited explanations by Colin Plumb.)
1139
 
1140
    Chunks of memory are maintained using a `boundary tag' method as
1141
    described in e.g., Knuth or Standish.  (See the paper by Paul
1142
    Wilson ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a
1143
    survey of such techniques.)  Sizes of free chunks are stored both
1144
    in the front of each chunk and at the end.  This makes
1145
    consolidating fragmented chunks into bigger chunks very fast.  The
1146
    size fields also hold bits representing whether chunks are free or
1147
    in use.
1148
 
1149
    An allocated chunk looks like this:
1150
 
1151
 
1152
    chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1153
            |             Size of previous chunk, if allocated            | |
1154
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1155
            |             Size of chunk, in bytes                         |P|
1156
      mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1157
            |             User data starts here...                          .
1158
            .                                                               .
1159
            .             (malloc_usable_space() bytes)                     .
1160
            .                                                               |
1161
nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1162
            |             Size of chunk                                     |
1163
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1164
 
1165
 
1166
    Where "chunk" is the front of the chunk for the purpose of most of
1167
    the malloc code, but "mem" is the pointer that is returned to the
1168
    user.  "Nextchunk" is the beginning of the next contiguous chunk.
1169
 
1170
    Chunks always begin on even word boundries, so the mem portion
1171
    (which is returned to the user) is also on an even word boundary, and
1172
    thus double-word aligned.
1173
 
1174
    Free chunks are stored in circular doubly-linked lists, and look like this:
1175
 
1176
    chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1177
            |             Size of previous chunk                            |
1178
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1179
    `head:' |             Size of chunk, in bytes                         |P|
1180
      mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1181
            |             Forward pointer to next chunk in list             |
1182
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1183
            |             Back pointer to previous chunk in list            |
1184
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1185
            |             Unused space (may be 0 bytes long)                .
1186
            .                                                               .
1187
            .                                                               |
1188
nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1189
    `foot:' |             Size of chunk, in bytes                           |
1190
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1191
 
1192
    The P (PREV_INUSE) bit, stored in the unused low-order bit of the
1193
    chunk size (which is always a multiple of two words), is an in-use
1194
    bit for the *previous* chunk.  If that bit is *clear*, then the
1195
    word before the current chunk size contains the previous chunk
1196
    size, and can be used to find the front of the previous chunk.
1197
    (The very first chunk allocated always has this bit set,
1198
    preventing access to non-existent (or non-owned) memory.)
1199
 
1200
    Note that the `foot' of the current chunk is actually represented
1201
    as the prev_size of the NEXT chunk. (This makes it easier to
1202
    deal with alignments etc).
1203
 
1204
    The two exceptions to all this are
1205
 
1206
     1. The special chunk `top', which doesn't bother using the
1207
        trailing size field since there is no
1208
        next contiguous chunk that would have to index off it. (After
1209
        initialization, `top' is forced to always exist.  If it would
1210
        become less than MINSIZE bytes long, it is replenished via
1211
        malloc_extend_top.)
1212
 
1213
     2. Chunks allocated via mmap, which have the second-lowest-order
1214
        bit (IS_MMAPPED) set in their size fields.  Because they are
1215
        never merged or traversed from any other chunk, they have no
1216
        foot size or inuse information.
1217
 
1218
    Available chunks are kept in any of several places (all declared below):
1219
 
1220
    * `av': An array of chunks serving as bin headers for consolidated
1221
       chunks. Each bin is doubly linked.  The bins are approximately
1222
       proportionally (log) spaced.  There are a lot of these bins
1223
       (128). This may look excessive, but works very well in
1224
       practice.  All procedures maintain the invariant that no
1225
       consolidated chunk physically borders another one. Chunks in
1226
       bins are kept in size order, with ties going to the
1227
       approximately least recently used chunk.
1228
 
1229
       The chunks in each bin are maintained in decreasing sorted order by
1230
       size.  This is irrelevant for the small bins, which all contain
1231
       the same-sized chunks, but facilitates best-fit allocation for
1232
       larger chunks. (These lists are just sequential. Keeping them in
1233
       order almost never requires enough traversal to warrant using
1234
       fancier ordered data structures.)  Chunks of the same size are
1235
       linked with the most recently freed at the front, and allocations
1236
       are taken from the back.  This results in LRU or FIFO allocation
1237
       order, which tends to give each chunk an equal opportunity to be
1238
       consolidated with adjacent freed chunks, resulting in larger free
1239
       chunks and less fragmentation.
1240
 
1241
    * `top': The top-most available chunk (i.e., the one bordering the
1242
       end of available memory) is treated specially. It is never
1243
       included in any bin, is used only if no other chunk is
1244
       available, and is released back to the system if it is very
1245
       large (see M_TRIM_THRESHOLD).
1246
 
1247
    * `last_remainder': A bin holding only the remainder of the
1248
       most recently split (non-top) chunk. This bin is checked
1249
       before other non-fitting chunks, so as to provide better
1250
       locality for runs of sequentially allocated chunks.
1251
 
1252
    *  Implicitly, through the host system's memory mapping tables.
1253
       If supported, requests greater than a threshold are usually
1254
       serviced via calls to mmap, and then later released via munmap.
1255
 
1256
*/
1257
 
1258
 
1259
 
1260
 
1261
 
1262
 
1263
/*  sizes, alignments */
1264
 
1265
#define SIZE_SZ                (sizeof(INTERNAL_SIZE_T))
1266
#define MALLOC_ALIGNMENT       (SIZE_SZ + SIZE_SZ)
1267
#define MALLOC_ALIGN_MASK      (MALLOC_ALIGNMENT - 1)
1268
#define MINSIZE                (sizeof(struct malloc_chunk))
1269
 
1270
/* conversion from malloc headers to user pointers, and back */
1271
 
1272
#define chunk2mem(p)   ((Void_t*)((char*)(p) + 2*SIZE_SZ))
1273
#define mem2chunk(mem) ((mchunkptr)((char*)(mem) - 2*SIZE_SZ))
1274
 
1275
/* pad request bytes into a usable size */
1276
 
1277
#define request2size(req) \
1278
 (((long)((req) + (SIZE_SZ + MALLOC_ALIGN_MASK)) < \
1279
  (long)(MINSIZE + MALLOC_ALIGN_MASK)) ? MINSIZE : \
1280
   (((req) + (SIZE_SZ + MALLOC_ALIGN_MASK)) & ~(MALLOC_ALIGN_MASK)))
1281
 
1282
/* Check if m has acceptable alignment */
1283
 
1284
#define aligned_OK(m)    (((unsigned long)((m)) & (MALLOC_ALIGN_MASK)) == 0)
1285
 
1286
 
1287
 
1288
 
1289
/*
1290
  Physical chunk operations
1291
*/
1292
 
1293
 
1294
/* size field is or'ed with PREV_INUSE when previous adjacent chunk in use */
1295
 
1296
#define PREV_INUSE 0x1
1297
 
1298
/* size field is or'ed with IS_MMAPPED if the chunk was obtained with mmap() */
1299
 
1300
#define IS_MMAPPED 0x2
1301
 
1302
/* Bits to mask off when extracting size */
1303
 
1304
#define SIZE_BITS (PREV_INUSE|IS_MMAPPED)
1305
 
1306
 
1307
/* Ptr to next physical malloc_chunk. */
1308
 
1309
#define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->size & ~PREV_INUSE) ))
1310
 
1311
/* Ptr to previous physical malloc_chunk */
1312
 
1313
#define prev_chunk(p)\
1314
   ((mchunkptr)( ((char*)(p)) - ((p)->prev_size) ))
1315
 
1316
 
1317
/* Treat space at ptr + offset as a chunk */
1318
 
1319
#define chunk_at_offset(p, s)  ((mchunkptr)(((char*)(p)) + (s)))
1320
 
1321
 
1322
 
1323
 
1324
/*
1325
  Dealing with use bits
1326
*/
1327
 
1328
/* extract p's inuse bit */
1329
 
1330
#define inuse(p)\
1331
((((mchunkptr)(((char*)(p))+((p)->size & ~PREV_INUSE)))->size) & PREV_INUSE)
1332
 
1333
/* extract inuse bit of previous chunk */
1334
 
1335
#define prev_inuse(p)  ((p)->size & PREV_INUSE)
1336
 
1337
/* check for mmap()'ed chunk */
1338
 
1339
#define chunk_is_mmapped(p) ((p)->size & IS_MMAPPED)
1340
 
1341
/* set/clear chunk as in use without otherwise disturbing */
1342
 
1343
#define set_inuse(p)\
1344
((mchunkptr)(((char*)(p)) + ((p)->size & ~PREV_INUSE)))->size |= PREV_INUSE
1345
 
1346
#define clear_inuse(p)\
1347
((mchunkptr)(((char*)(p)) + ((p)->size & ~PREV_INUSE)))->size &= ~(PREV_INUSE)
1348
 
1349
/* check/set/clear inuse bits in known places */
1350
 
1351
#define inuse_bit_at_offset(p, s)\
1352
 (((mchunkptr)(((char*)(p)) + (s)))->size & PREV_INUSE)
1353
 
1354
#define set_inuse_bit_at_offset(p, s)\
1355
 (((mchunkptr)(((char*)(p)) + (s)))->size |= PREV_INUSE)
1356
 
1357
#define clear_inuse_bit_at_offset(p, s)\
1358
 (((mchunkptr)(((char*)(p)) + (s)))->size &= ~(PREV_INUSE))
1359
 
1360
 
1361
 
1362
 
1363
/*
1364
  Dealing with size fields
1365
*/
1366
 
1367
/* Get size, ignoring use bits */
1368
 
1369
#define chunksize(p)          ((p)->size & ~(SIZE_BITS))
1370
 
1371
/* Set size at head, without disturbing its use bit */
1372
 
1373
#define set_head_size(p, s)   ((p)->size = (((p)->size & PREV_INUSE) | (s)))
1374
 
1375
/* Set size/use ignoring previous bits in header */
1376
 
1377
#define set_head(p, s)        ((p)->size = (s))
1378
 
1379
/* Set size at footer (only when chunk is not in use) */
1380
 
1381
#define set_foot(p, s)   (((mchunkptr)((char*)(p) + (s)))->prev_size = (s))
1382
 
1383
 
1384
 
1385
 
1386
 
1387
/*
1388
   Bins
1389
 
1390
    The bins, `av_' are an array of pairs of pointers serving as the
1391
    heads of (initially empty) doubly-linked lists of chunks, laid out
1392
    in a way so that each pair can be treated as if it were in a
1393
    malloc_chunk. (This way, the fd/bk offsets for linking bin heads
1394
    and chunks are the same).
1395
 
1396
    Bins for sizes < 512 bytes contain chunks of all the same size, spaced
1397
    8 bytes apart. Larger bins are approximately logarithmically
1398
    spaced. (See the table below.) The `av_' array is never mentioned
1399
    directly in the code, but instead via bin access macros.
1400
 
1401
    Bin layout:
1402
 
1403
    64 bins of size       8
1404
    32 bins of size      64
1405
    16 bins of size     512
1406
     8 bins of size    4096
1407
     4 bins of size   32768
1408
     2 bins of size  262144
1409
     1 bin  of size what's left
1410
 
1411
    There is actually a little bit of slop in the numbers in bin_index
1412
    for the sake of speed. This makes no difference elsewhere.
1413
 
1414
    The special chunks `top' and `last_remainder' get their own bins,
1415
    (this is implemented via yet more trickery with the av_ array),
1416
    although `top' is never properly linked to its bin since it is
1417
    always handled specially.
1418
 
1419
*/
1420
 
1421
#define NAV             128   /* number of bins */
1422
 
1423
typedef struct malloc_chunk* mbinptr;
1424
 
1425
/* access macros */
1426
 
1427
#define bin_at(i)      ((mbinptr)((char*)&(av_[2*(i) + 2]) - 2*SIZE_SZ))
1428
#define next_bin(b)    ((mbinptr)((char*)(b) + 2 * sizeof(mbinptr)))
1429
#define prev_bin(b)    ((mbinptr)((char*)(b) - 2 * sizeof(mbinptr)))
1430
 
1431
/*
1432
   The first 2 bins are never indexed. The corresponding av_ cells are instead
1433
   used for bookkeeping. This is not to save space, but to simplify
1434
   indexing, maintain locality, and avoid some initialization tests.
1435
*/
1436
 
1437
#define top            (bin_at(0)->fd)   /* The topmost chunk */
1438
#define last_remainder (bin_at(1))       /* remainder from last split */
1439
 
1440
 
1441
/*
1442
   Because top initially points to its own bin with initial
1443
   zero size, thus forcing extension on the first malloc request,
1444
   we avoid having any special code in malloc to check whether
1445
   it even exists yet. But we still need to in malloc_extend_top.
1446
*/
1447
 
1448
#define initial_top    ((mchunkptr)(bin_at(0)))
1449
 
1450
/* Helper macro to initialize bins */
1451
 
1452
#define IAV(i)  bin_at(i), bin_at(i)
1453
 
1454
static mbinptr av_[NAV * 2 + 2] = {
1455
 0, 0,
1456
 IAV(0),   IAV(1),   IAV(2),   IAV(3),   IAV(4),   IAV(5),   IAV(6),   IAV(7),
1457
 IAV(8),   IAV(9),   IAV(10),  IAV(11),  IAV(12),  IAV(13),  IAV(14),  IAV(15),
1458
 IAV(16),  IAV(17),  IAV(18),  IAV(19),  IAV(20),  IAV(21),  IAV(22),  IAV(23),
1459
 IAV(24),  IAV(25),  IAV(26),  IAV(27),  IAV(28),  IAV(29),  IAV(30),  IAV(31),
1460
 IAV(32),  IAV(33),  IAV(34),  IAV(35),  IAV(36),  IAV(37),  IAV(38),  IAV(39),
1461
 IAV(40),  IAV(41),  IAV(42),  IAV(43),  IAV(44),  IAV(45),  IAV(46),  IAV(47),
1462
 IAV(48),  IAV(49),  IAV(50),  IAV(51),  IAV(52),  IAV(53),  IAV(54),  IAV(55),
1463
 IAV(56),  IAV(57),  IAV(58),  IAV(59),  IAV(60),  IAV(61),  IAV(62),  IAV(63),
1464
 IAV(64),  IAV(65),  IAV(66),  IAV(67),  IAV(68),  IAV(69),  IAV(70),  IAV(71),
1465
 IAV(72),  IAV(73),  IAV(74),  IAV(75),  IAV(76),  IAV(77),  IAV(78),  IAV(79),
1466
 IAV(80),  IAV(81),  IAV(82),  IAV(83),  IAV(84),  IAV(85),  IAV(86),  IAV(87),
1467
 IAV(88),  IAV(89),  IAV(90),  IAV(91),  IAV(92),  IAV(93),  IAV(94),  IAV(95),
1468
 IAV(96),  IAV(97),  IAV(98),  IAV(99),  IAV(100), IAV(101), IAV(102), IAV(103),
1469
 IAV(104), IAV(105), IAV(106), IAV(107), IAV(108), IAV(109), IAV(110), IAV(111),
1470
 IAV(112), IAV(113), IAV(114), IAV(115), IAV(116), IAV(117), IAV(118), IAV(119),
1471
 IAV(120), IAV(121), IAV(122), IAV(123), IAV(124), IAV(125), IAV(126), IAV(127)
1472
};
1473
 
1474
 
1475
 
1476
/* field-extraction macros */
1477
 
1478
#define first(b) ((b)->fd)
1479
#define last(b)  ((b)->bk)
1480
 
1481
/*
1482
  Indexing into bins
1483
*/
1484
 
1485
#define bin_index(sz)                                                          \
1486
(((((unsigned long)(sz)) >> 9) ==    0) ?       (((unsigned long)(sz)) >>  3): \
1487
 ((((unsigned long)(sz)) >> 9) <=    4) ?  56 + (((unsigned long)(sz)) >>  6): \
1488
 ((((unsigned long)(sz)) >> 9) <=   20) ?  91 + (((unsigned long)(sz)) >>  9): \
1489
 ((((unsigned long)(sz)) >> 9) <=   84) ? 110 + (((unsigned long)(sz)) >> 12): \
1490
 ((((unsigned long)(sz)) >> 9) <=  340) ? 119 + (((unsigned long)(sz)) >> 15): \
1491
 ((((unsigned long)(sz)) >> 9) <= 1364) ? 124 + (((unsigned long)(sz)) >> 18): \
1492
                                          126)
1493
/*
1494
  bins for chunks < 512 are all spaced 8 bytes apart, and hold
1495
  identically sized chunks. This is exploited in malloc.
1496
*/
1497
 
1498
#define MAX_SMALLBIN         63
1499
#define MAX_SMALLBIN_SIZE   512
1500
#define SMALLBIN_WIDTH        8
1501
 
1502
#define smallbin_index(sz)  (((unsigned long)(sz)) >> 3)
1503
 
1504
/*
1505
   Requests are `small' if both the corresponding and the next bin are small
1506
*/
1507
 
1508
#define is_small_request(nb) (nb < MAX_SMALLBIN_SIZE - SMALLBIN_WIDTH)
1509
 
1510
 
1511
 
1512
/*
1513
    To help compensate for the large number of bins, a one-level index
1514
    structure is used for bin-by-bin searching.  `binblocks' is a
1515
    one-word bitvector recording whether groups of BINBLOCKWIDTH bins
1516
    have any (possibly) non-empty bins, so they can be skipped over
1517
    all at once during during traversals. The bits are NOT always
1518
    cleared as soon as all bins in a block are empty, but instead only
1519
    when all are noticed to be empty during traversal in malloc.
1520
*/
1521
 
1522
#define BINBLOCKWIDTH     4   /* bins per block */
1523
 
1524
#define binblocks      (bin_at(0)->size) /* bitvector of nonempty blocks */
1525
 
1526
/* bin<->block macros */
1527
 
1528
#define idx2binblock(ix)    ((unsigned)1 << (ix / BINBLOCKWIDTH))
1529
#define mark_binblock(ii)   (binblocks |= idx2binblock(ii))
1530
#define clear_binblock(ii)  (binblocks &= ~(idx2binblock(ii)))
1531
 
1532
 
1533
 
1534
 
1535
 
1536
/*  Other static bookkeeping data */
1537
 
1538
/* variables holding tunable values */
1539
 
1540
static unsigned long trim_threshold   = DEFAULT_TRIM_THRESHOLD;
1541
static unsigned long top_pad          = DEFAULT_TOP_PAD;
1542
static unsigned int  n_mmaps_max      = DEFAULT_MMAP_MAX;
1543
static unsigned long mmap_threshold   = DEFAULT_MMAP_THRESHOLD;
1544
 
1545
/* The first value returned from sbrk */
1546
static char* sbrk_base = (char*)(-1);
1547
 
1548
/* The maximum memory obtained from system via sbrk */
1549
static unsigned long max_sbrked_mem = 0;
1550
 
1551
/* The maximum via either sbrk or mmap */
10365 ripley 1552
unsigned long max_total_mem = 0;
10347 ripley 1553
 
1554
/* internal working copy of mallinfo */
1555
static struct mallinfo current_mallinfo = {  0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
1556
 
1557
/* The total memory obtained from system via sbrk */
1558
#define sbrked_mem  (current_mallinfo.arena)
1559
 
1560
/* Tracking mmaps */
1561
 
1562
static unsigned int n_mmaps = 0;
1563
static unsigned long mmapped_mem = 0;
1564
#ifndef WIN32
1565
static unsigned int max_n_mmaps = 0;
1566
static unsigned long max_mmapped_mem = 0;
1567
#endif
1568
 
1569
 
1570
 
1571
/*
1572
  Debugging support
1573
*/
1574
 
1575
#if DEBUG
1576
 
1577
 
1578
/*
1579
  These routines make a number of assertions about the states
1580
  of data structures that should be true at all times. If any
1581
  are not true, it's very likely that a user program has somehow
1582
  trashed memory. (It's also possible that there is a coding error
1583
  in malloc. In which case, please report it!)
1584
*/
1585
 
1586
#if __STD_C
1587
static void do_check_chunk(mchunkptr p)
1588
#else
1589
static void do_check_chunk(p) mchunkptr p;
1590
#endif
1591
{
1592
  INTERNAL_SIZE_T sz = p->size & ~PREV_INUSE;
1593
 
1594
  /* No checkable chunk is mmapped */
1595
  assert(!chunk_is_mmapped(p));
1596
 
1597
  /* Check for legal address ... */
1598
  assert((char*)p >= sbrk_base);
1599
  if (p != top)
1600
    assert((char*)p + sz <= (char*)top);
1601
  else
1602
    assert((char*)p + sz <= sbrk_base + sbrked_mem);
1603
 
1604
}
1605
 
1606
 
1607
#if __STD_C
1608
static void do_check_free_chunk(mchunkptr p)
1609
#else
1610
static void do_check_free_chunk(p) mchunkptr p;
1611
#endif
1612
{
1613
  INTERNAL_SIZE_T sz = p->size & ~PREV_INUSE;
1614
  mchunkptr next = chunk_at_offset(p, sz);
1615
 
1616
  do_check_chunk(p);
1617
 
1618
  /* Check whether it claims to be free ... */
1619
  assert(!inuse(p));
1620
 
1621
  /* Unless a special marker, must have OK fields */
1622
  if ((long)sz >= (long)MINSIZE)
1623
  {
1624
    assert((sz & MALLOC_ALIGN_MASK) == 0);
1625
    assert(aligned_OK(chunk2mem(p)));
1626
    /* ... matching footer field */
1627
    assert(next->prev_size == sz);
1628
    /* ... and is fully consolidated */
1629
    assert(prev_inuse(p));
1630
    assert (next == top || inuse(next));
1631
 
1632
    /* ... and has minimally sane links */
1633
    assert(p->fd->bk == p);
1634
    assert(p->bk->fd == p);
1635
  }
1636
  else /* markers are always of size SIZE_SZ */
1637
    assert(sz == SIZE_SZ);
1638
}
1639
 
1640
#if __STD_C
1641
static void do_check_inuse_chunk(mchunkptr p)
1642
#else
1643
static void do_check_inuse_chunk(p) mchunkptr p;
1644
#endif
1645
{
1646
  mchunkptr next = next_chunk(p);
1647
  do_check_chunk(p);
1648
 
1649
  /* Check whether it claims to be in use ... */
1650
  assert(inuse(p));
1651
 
1652
  /* ... and is surrounded by OK chunks.
1653
    Since more things can be checked with free chunks than inuse ones,
1654
    if an inuse chunk borders them and debug is on, it's worth doing them.
1655
  */
1656
  if (!prev_inuse(p))
1657
  {
1658
    mchunkptr prv = prev_chunk(p);
1659
    assert(next_chunk(prv) == p);
1660
    do_check_free_chunk(prv);
1661
  }
1662
  if (next == top)
1663
  {
1664
    assert(prev_inuse(next));
1665
    assert(chunksize(next) >= MINSIZE);
1666
  }
1667
  else if (!inuse(next))
1668
    do_check_free_chunk(next);
1669
 
1670
}
1671
 
1672
#if __STD_C
1673
static void do_check_malloced_chunk(mchunkptr p, INTERNAL_SIZE_T s)
1674
#else
1675
static void do_check_malloced_chunk(p, s) mchunkptr p; INTERNAL_SIZE_T s;
1676
#endif
1677
{
1678
  INTERNAL_SIZE_T sz = p->size & ~PREV_INUSE;
1679
  long room = sz - s;
1680
 
1681
  do_check_inuse_chunk(p);
1682
 
1683
  /* Legal size ... */
1684
  assert((long)sz >= (long)MINSIZE);
1685
  assert((sz & MALLOC_ALIGN_MASK) == 0);
1686
  assert(room >= 0);
1687
  assert(room < (long)MINSIZE);
1688
 
1689
  /* ... and alignment */
1690
  assert(aligned_OK(chunk2mem(p)));
1691
 
1692
 
1693
  /* ... and was allocated at front of an available chunk */
1694
  assert(prev_inuse(p));
1695
 
1696
}
1697
 
1698
 
1699
#define check_free_chunk(P)  do_check_free_chunk(P)
1700
#define check_inuse_chunk(P) do_check_inuse_chunk(P)
1701
#define check_chunk(P) do_check_chunk(P)
1702
#define check_malloced_chunk(P,N) do_check_malloced_chunk(P,N)
1703
#else
1704
#define check_free_chunk(P)
1705
#define check_inuse_chunk(P)
1706
#define check_chunk(P)
1707
#define check_malloced_chunk(P,N)
1708
#endif
1709
 
1710
 
1711
 
1712
/*
1713
  Macro-based internal utilities
1714
*/
1715
 
1716
 
1717
/*
1718
  Linking chunks in bin lists.
1719
  Call these only with variables, not arbitrary expressions, as arguments.
1720
*/
1721
 
1722
/*
1723
  Place chunk p of size s in its bin, in size order,
1724
  putting it ahead of others of same size.
1725
*/
1726
 
1727
 
1728
#define frontlink(P, S, IDX, BK, FD)                                          \
1729
{                                                                             \
1730
  if (S < MAX_SMALLBIN_SIZE)                                                  \
1731
  {                                                                           \
1732
    IDX = smallbin_index(S);                                                  \
1733
    mark_binblock(IDX);                                                       \
1734
    BK = bin_at(IDX);                                                         \
1735
    FD = BK->fd;                                                              \
1736
    P->bk = BK;                                                               \
1737
    P->fd = FD;                                                               \
1738
    FD->bk = BK->fd = P;                                                      \
1739
  }                                                                           \
1740
  else                                                                        \
1741
  {                                                                           \
1742
    IDX = bin_index(S);                                                       \
1743
    BK = bin_at(IDX);                                                         \
1744
    FD = BK->fd;                                                              \
1745
    if (FD == BK) mark_binblock(IDX);                                         \
1746
    else                                                                      \
1747
    {                                                                         \
1748
      while (FD != BK && S < chunksize(FD)) FD = FD->fd;                      \
1749
      BK = FD->bk;                                                            \
1750
    }                                                                         \
1751
    P->bk = BK;                                                               \
1752
    P->fd = FD;                                                               \
1753
    FD->bk = BK->fd = P;                                                      \
1754
  }                                                                           \
1755
}
1756
 
1757
 
1758
/* take a chunk off a list */
1759
 
1760
#define unlink(P, BK, FD)                                                     \
1761
{                                                                             \
1762
  BK = P->bk;                                                                 \
1763
  FD = P->fd;                                                                 \
1764
  FD->bk = BK;                                                                \
1765
  BK->fd = FD;                                                                \
1766
}                                                                             \
1767
 
1768
/* Place p as the last remainder */
1769
 
1770
#define link_last_remainder(P)                                                \
1771
{                                                                             \
1772
  last_remainder->fd = last_remainder->bk =  P;                               \
1773
  P->fd = P->bk = last_remainder;                                             \
1774
}
1775
 
1776
/* Clear the last_remainder bin */
1777
 
1778
#define clear_last_remainder \
1779
  (last_remainder->fd = last_remainder->bk = last_remainder)
1780
 
1781
 
1782
 
1783
 
1784
 
1785
 
1786
/* Routines dealing with mmap(). */
1787
 
1788
#if HAVE_MMAP
1789
 
1790
#if __STD_C
1791
static mchunkptr mmap_chunk(size_t size)
1792
#else
1793
static mchunkptr mmap_chunk(size) size_t size;
1794
#endif
1795
{
1796
  size_t page_mask = malloc_getpagesize - 1;
1797
  mchunkptr p;
1798
 
1799
#ifndef MAP_ANONYMOUS
1800
  static int fd = -1;
1801
#endif
1802
 
1803
  if(n_mmaps >= n_mmaps_max) return 0; /* too many regions */
1804
 
1805
  /* For mmapped chunks, the overhead is one SIZE_SZ unit larger, because
1806
   * there is no following chunk whose prev_size field could be used.
1807
   */
1808
  size = (size + SIZE_SZ + page_mask) & ~page_mask;
1809
 
1810
#ifdef MAP_ANONYMOUS
1811
  p = (mchunkptr)mmap(0, size, PROT_READ|PROT_WRITE,
1812
		      MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
1813
#else /* !MAP_ANONYMOUS */
1814
  if (fd < 0)
1815
  {
1816
    fd = open("/dev/zero", O_RDWR);
1817
    if(fd < 0) return 0;
1818
  }
1819
  p = (mchunkptr)mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
1820
#endif
1821
 
1822
  if(p == (mchunkptr)-1) return 0;
1823
 
1824
  n_mmaps++;
1825
  if (n_mmaps > max_n_mmaps) max_n_mmaps = n_mmaps;
1826
 
1827
  /* We demand that eight bytes into a page must be 8-byte aligned. */
1828
  assert(aligned_OK(chunk2mem(p)));
1829
 
1830
  /* The offset to the start of the mmapped region is stored
1831
   * in the prev_size field of the chunk; normally it is zero,
1832
   * but that can be changed in memalign().
1833
   */
1834
  p->prev_size = 0;
1835
  set_head(p, size|IS_MMAPPED);
1836
 
1837
  mmapped_mem += size;
1838
  if ((unsigned long)mmapped_mem > (unsigned long)max_mmapped_mem)
1839
    max_mmapped_mem = mmapped_mem;
1840
  if ((unsigned long)(mmapped_mem + sbrked_mem) > (unsigned long)max_total_mem)
1841
    max_total_mem = mmapped_mem + sbrked_mem;
1842
  return p;
1843
}
1844
 
1845
#if __STD_C
1846
static void munmap_chunk(mchunkptr p)
1847
#else
1848
static void munmap_chunk(p) mchunkptr p;
1849
#endif
1850
{
1851
  INTERNAL_SIZE_T size = chunksize(p);
1852
  int ret;
1853
 
1854
  assert (chunk_is_mmapped(p));
1855
  assert(! ((char*)p >= sbrk_base && (char*)p < sbrk_base + sbrked_mem));
1856
  assert((n_mmaps > 0));
1857
  assert(((p->prev_size + size) & (malloc_getpagesize-1)) == 0);
1858
 
1859
  n_mmaps--;
1860
  mmapped_mem -= (size + p->prev_size);
1861
 
1862
  ret = munmap((char *)p - p->prev_size, size + p->prev_size);
1863
 
1864
  /* munmap returns non-zero on failure */
1865
  assert(ret == 0);
1866
}
1867
 
1868
#if HAVE_MREMAP
1869
 
1870
#if __STD_C
1871
static mchunkptr mremap_chunk(mchunkptr p, size_t new_size)
1872
#else
1873
static mchunkptr mremap_chunk(p, new_size) mchunkptr p; size_t new_size;
1874
#endif
1875
{
1876
  size_t page_mask = malloc_getpagesize - 1;
1877
  INTERNAL_SIZE_T offset = p->prev_size;
1878
  INTERNAL_SIZE_T size = chunksize(p);
1879
  char *cp;
1880
 
1881
  assert (chunk_is_mmapped(p));
1882
  assert(! ((char*)p >= sbrk_base && (char*)p < sbrk_base + sbrked_mem));
1883
  assert((n_mmaps > 0));
1884
  assert(((size + offset) & (malloc_getpagesize-1)) == 0);
1885
 
1886
  /* Note the extra SIZE_SZ overhead as in mmap_chunk(). */
1887
  new_size = (new_size + offset + SIZE_SZ + page_mask) & ~page_mask;
1888
 
1889
  cp = (char *)mremap((char *)p - offset, size + offset, new_size, 1);
1890
 
1891
  if (cp == (char *)-1) return 0;
1892
 
1893
  p = (mchunkptr)(cp + offset);
1894
 
1895
  assert(aligned_OK(chunk2mem(p)));
1896
 
1897
  assert((p->prev_size == offset));
1898
  set_head(p, (new_size - offset)|IS_MMAPPED);
1899
 
1900
  mmapped_mem -= size + offset;
1901
  mmapped_mem += new_size;
1902
  if ((unsigned long)mmapped_mem > (unsigned long)max_mmapped_mem)
1903
    max_mmapped_mem = mmapped_mem;
1904
  if ((unsigned long)(mmapped_mem + sbrked_mem) > (unsigned long)max_total_mem)
1905
    max_total_mem = mmapped_mem + sbrked_mem;
1906
  return p;
1907
}
1908
 
1909
#endif /* HAVE_MREMAP */
1910
 
1911
#endif /* HAVE_MMAP */
1912
 
1913
 
1914
 
1915
 
1916
/*
1917
  Extend the top-most chunk by obtaining memory from system.
1918
  Main interface to sbrk (but see also malloc_trim).
1919
*/
1920
 
1921
#if __STD_C
1922
static void malloc_extend_top(INTERNAL_SIZE_T nb)
1923
#else
1924
static void malloc_extend_top(nb) INTERNAL_SIZE_T nb;
1925
#endif
1926
{
1927
  char*     brk;                  /* return value from sbrk */
1928
  INTERNAL_SIZE_T front_misalign; /* unusable bytes at front of sbrked space */
1929
  INTERNAL_SIZE_T correction;     /* bytes for 2nd sbrk call */
1930
  char*     new_brk;              /* return of 2nd sbrk call */
1931
  INTERNAL_SIZE_T top_size;       /* new size of top chunk */
1932
 
1933
  mchunkptr old_top     = top;  /* Record state of old top */
1934
  INTERNAL_SIZE_T old_top_size = chunksize(old_top);
1935
  char*     old_end      = (char*)(chunk_at_offset(old_top, old_top_size));
1936
 
1937
  /* Pad request with top_pad plus minimal overhead */
1938
 
1939
  INTERNAL_SIZE_T    sbrk_size     = nb + top_pad + MINSIZE;
1940
  unsigned long pagesz    = malloc_getpagesize;
1941
 
1942
  /* If not the first time through, round to preserve page boundary */
1943
  /* Otherwise, we need to correct to a page size below anyway. */
1944
  /* (We also correct below if an intervening foreign sbrk call.) */
1945
 
1946
  if (sbrk_base != (char*)(-1))
1947
    sbrk_size = (sbrk_size + (pagesz - 1)) & ~(pagesz - 1);
1948
 
1949
  brk = (char*)(MORECORE (sbrk_size));
1950
 
1951
  /* Fail if sbrk failed or if a foreign sbrk call killed our space */
1952
  if (brk == (char*)(MORECORE_FAILURE) ||
1953
      (brk < old_end && old_top != initial_top))
1954
    return;
1955
 
1956
  sbrked_mem += sbrk_size;
1957
 
1958
  if (brk == old_end) /* can just add bytes to current top */
1959
  {
1960
    top_size = sbrk_size + old_top_size;
1961
    set_head(top, top_size | PREV_INUSE);
1962
  }
1963
  else
1964
  {
1965
    if (sbrk_base == (char*)(-1))  /* First time through. Record base */
1966
      sbrk_base = brk;
1967
    else  /* Someone else called sbrk().  Count those bytes as sbrked_mem. */
1968
      sbrked_mem += brk - (char*)old_end;
1969
 
1970
    /* Guarantee alignment of first new chunk made from this space */
1971
    front_misalign = (unsigned long)chunk2mem(brk) & MALLOC_ALIGN_MASK;
1972
    if (front_misalign > 0)
1973
    {
1974
      correction = (MALLOC_ALIGNMENT) - front_misalign;
1975
      brk += correction;
1976
    }
1977
    else
1978
      correction = 0;
1979
 
1980
    /* Guarantee the next brk will be at a page boundary */
1981
 
10425 ripley 1982
    correction += ((((unsigned long)(brk + sbrk_size))+(pagesz-1)) &
1983
                   ~(pagesz - 1)) - ((unsigned long)(brk + sbrk_size));
1984
 
10347 ripley 1985
    /* Allocate correction */
1986
    new_brk = (char*)(MORECORE (correction));
1987
    if (new_brk == (char*)(MORECORE_FAILURE)) return;
1988
 
1989
    sbrked_mem += correction;
1990
 
1991
    top = (mchunkptr)brk;
1992
    top_size = new_brk - brk + correction;
1993
    set_head(top, top_size | PREV_INUSE);
1994
 
1995
    if (old_top != initial_top)
1996
    {
1997
 
1998
      /* There must have been an intervening foreign sbrk call. */
1999
      /* A double fencepost is necessary to prevent consolidation */
2000
 
2001
      /* If not enough space to do this, then user did something very wrong */
2002
      if (old_top_size < MINSIZE)
2003
      {
2004
        set_head(top, PREV_INUSE); /* will force null return from malloc */
2005
        return;
2006
      }
2007
 
2008
      /* Also keep size a multiple of MALLOC_ALIGNMENT */
2009
      old_top_size = (old_top_size - 3*SIZE_SZ) & ~MALLOC_ALIGN_MASK;
2010
      set_head_size(old_top, old_top_size);
2011
      chunk_at_offset(old_top, old_top_size          )->size =
2012
        SIZE_SZ|PREV_INUSE;
2013
      chunk_at_offset(old_top, old_top_size + SIZE_SZ)->size =
2014
        SIZE_SZ|PREV_INUSE;
2015
      /* If possible, release the rest. */
2016
      if (old_top_size >= MINSIZE)
2017
        fREe(chunk2mem(old_top));
2018
    }
2019
  }
2020
 
2021
  if ((unsigned long)sbrked_mem > (unsigned long)max_sbrked_mem)
2022
    max_sbrked_mem = sbrked_mem;
2023
  if ((unsigned long)(mmapped_mem + sbrked_mem) > (unsigned long)max_total_mem)
2024
    max_total_mem = mmapped_mem + sbrked_mem;
2025
 
2026
  /* We always land on a page boundary */
2027
  assert(((unsigned long)((char*)top + top_size) & (pagesz - 1)) == 0);
2028
}
2029
 
2030
 
2031
 
2032
 
2033
/* Main public routines */
2034
 
2035
 
2036
/*
2037
  Malloc Algorthim:
2038
 
2039
    The requested size is first converted into a usable form, `nb'.
2040
    This currently means to add 4 bytes overhead plus possibly more to
2041
    obtain 8-byte alignment and/or to obtain a size of at least
2042
    MINSIZE (currently 16 bytes), the smallest allocatable size.
2043
    (All fits are considered `exact' if they are within MINSIZE bytes.)
2044
 
2045
    From there, the first successful of the following steps is taken:
2046
 
2047
      1. The bin corresponding to the request size is scanned, and if
2048
         a chunk of exactly the right size is found, it is taken.
2049
 
2050
      2. The most recently remaindered chunk is used if it is big
2051
         enough.  This is a form of (roving) first fit, used only in
2052
         the absence of exact fits. Runs of consecutive requests use
2053
         the remainder of the chunk used for the previous such request
2054
         whenever possible. This limited use of a first-fit style
2055
         allocation strategy tends to give contiguous chunks
2056
         coextensive lifetimes, which improves locality and can reduce
2057
         fragmentation in the long run.
2058
 
2059
      3. Other bins are scanned in increasing size order, using a
2060
         chunk big enough to fulfill the request, and splitting off
2061
         any remainder.  This search is strictly by best-fit; i.e.,
2062
         the smallest (with ties going to approximately the least
2063
         recently used) chunk that fits is selected.
2064
 
2065
      4. If large enough, the chunk bordering the end of memory
2066
         (`top') is split off. (This use of `top' is in accord with
2067
         the best-fit search rule.  In effect, `top' is treated as
2068
         larger (and thus less well fitting) than any other available
2069
         chunk since it can be extended to be as large as necessary
2070
         (up to system limitations).
2071
 
2072
      5. If the request size meets the mmap threshold and the
2073
         system supports mmap, and there are few enough currently
2074
         allocated mmapped regions, and a call to mmap succeeds,
2075
         the request is allocated via direct memory mapping.
2076
 
2077
      6. Otherwise, the top of memory is extended by
2078
         obtaining more space from the system (normally using sbrk,
2079
         but definable to anything else via the MORECORE macro).
2080
         Memory is gathered from the system (in system page-sized
2081
         units) in a way that allows chunks obtained across different
2082
         sbrk calls to be consolidated, but does not require
2083
         contiguous memory. Thus, it should be safe to intersperse
2084
         mallocs with other sbrk calls.
2085
 
2086
 
2087
      All allocations are made from the the `lowest' part of any found
2088
      chunk. (The implementation invariant is that prev_inuse is
2089
      always true of any allocated chunk; i.e., that each allocated
2090
      chunk borders either a previously allocated and still in-use chunk,
2091
      or the base of its memory arena.)
2092
 
2093
*/
2094
 
2095
#if __STD_C
2096
Void_t* mALLOc(size_t bytes)
2097
#else
2098
Void_t* mALLOc(bytes) size_t bytes;
2099
#endif
2100
{
2101
  mchunkptr victim;                  /* inspected/selected chunk */
2102
  INTERNAL_SIZE_T victim_size;       /* its size */
2103
  int       idx;                     /* index for bin traversal */
2104
  mbinptr   bin;                     /* associated bin */
2105
  mchunkptr remainder;               /* remainder from a split */
2106
  long      remainder_size;          /* its size */
2107
  int       remainder_index;         /* its bin index */
2108
  unsigned long block;               /* block traverser bit */
2109
  int       startidx;                /* first bin of a traversed block */
2110
  mchunkptr fwd;                     /* misc temp for linking */
2111
  mchunkptr bck;                     /* misc temp for linking */
2112
  mbinptr q;                         /* misc temp */
2113
 
10425 ripley 2114
  INTERNAL_SIZE_T nb;
10347 ripley 2115
 
10425 ripley 2116
  if ((long)bytes < 0) return 0;
2117
 
2118
  nb = request2size(bytes);  /* padded request size; */
2119
 
10347 ripley 2120
  /* Check for exact match in a bin */
2121
 
2122
  if (is_small_request(nb))  /* Faster version for small requests */
2123
  {
2124
    idx = smallbin_index(nb);
2125
 
2126
    /* No traversal or size check necessary for small bins.  */
2127
 
2128
    q = bin_at(idx);
2129
    victim = last(q);
2130
 
2131
    /* Also scan the next one, since it would have a remainder < MINSIZE */
2132
    if (victim == q)
2133
    {
2134
      q = next_bin(q);
2135
      victim = last(q);
2136
    }
2137
    if (victim != q)
2138
    {
2139
      victim_size = chunksize(victim);
2140
      unlink(victim, bck, fwd);
2141
      set_inuse_bit_at_offset(victim, victim_size);
2142
      check_malloced_chunk(victim, nb);
2143
      return chunk2mem(victim);
2144
    }
2145
 
2146
    idx += 2; /* Set for bin scan below. We've already scanned 2 bins. */
2147
 
2148
  }
2149
  else
2150
  {
2151
    idx = bin_index(nb);
2152
    bin = bin_at(idx);
2153
 
2154
    for (victim = last(bin); victim != bin; victim = victim->bk)
2155
    {
2156
      victim_size = chunksize(victim);
2157
      remainder_size = victim_size - nb;
2158
 
2159
      if (remainder_size >= (long)MINSIZE) /* too big */
2160
      {
2161
        --idx; /* adjust to rescan below after checking last remainder */
2162
        break;
2163
      }
2164
 
2165
      else if (remainder_size >= 0) /* exact fit */
2166
      {
2167
        unlink(victim, bck, fwd);
2168
        set_inuse_bit_at_offset(victim, victim_size);
2169
        check_malloced_chunk(victim, nb);
2170
        return chunk2mem(victim);
2171
      }
2172
    }
2173
 
2174
    ++idx;
2175
 
2176
  }
2177
 
2178
  /* Try to use the last split-off remainder */
2179
 
2180
  if ( (victim = last_remainder->fd) != last_remainder)
2181
  {
2182
    victim_size = chunksize(victim);
2183
    remainder_size = victim_size - nb;
2184
 
2185
    if (remainder_size >= (long)MINSIZE) /* re-split */
2186
    {
2187
      remainder = chunk_at_offset(victim, nb);
2188
      set_head(victim, nb | PREV_INUSE);
2189
      link_last_remainder(remainder);
2190
      set_head(remainder, remainder_size | PREV_INUSE);
2191
      set_foot(remainder, remainder_size);
2192
      check_malloced_chunk(victim, nb);
2193
      return chunk2mem(victim);
2194
    }
2195
 
2196
    clear_last_remainder;
2197
 
2198
    if (remainder_size >= 0)  /* exhaust */
2199
    {
2200
      set_inuse_bit_at_offset(victim, victim_size);
2201
      check_malloced_chunk(victim, nb);
2202
      return chunk2mem(victim);
2203
    }
2204
 
2205
    /* Else place in bin */
2206
 
2207
    frontlink(victim, victim_size, remainder_index, bck, fwd);
2208
  }
2209
 
2210
  /*
2211
     If there are any possibly nonempty big-enough blocks,
2212
     search for best fitting chunk by scanning bins in blockwidth units.
2213
  */
2214
 
2215
  if ( (block = idx2binblock(idx)) <= binblocks)
2216
  {
2217
 
2218
    /* Get to the first marked block */
2219
 
2220
    if ( (block & binblocks) == 0)
2221
    {
2222
      /* force to an even block boundary */
2223
      idx = (idx & ~(BINBLOCKWIDTH - 1)) + BINBLOCKWIDTH;
2224
      block <<= 1;
2225
      while ((block & binblocks) == 0)
2226
      {
2227
        idx += BINBLOCKWIDTH;
2228
        block <<= 1;
2229
      }
2230
    }
2231
 
2232
    /* For each possibly nonempty block ... */
2233
    for (;;)
2234
    {
2235
      startidx = idx;          /* (track incomplete blocks) */
2236
      q = bin = bin_at(idx);
2237
 
2238
      /* For each bin in this block ... */
2239
      do
2240
      {
2241
        /* Find and use first big enough chunk ... */
2242
 
2243
        for (victim = last(bin); victim != bin; victim = victim->bk)
2244
        {
2245
          victim_size = chunksize(victim);
2246
          remainder_size = victim_size - nb;
2247
 
2248
          if (remainder_size >= (long)MINSIZE) /* split */
2249
          {
2250
            remainder = chunk_at_offset(victim, nb);
2251
            set_head(victim, nb | PREV_INUSE);
2252
            unlink(victim, bck, fwd);
2253
            link_last_remainder(remainder);
2254
            set_head(remainder, remainder_size | PREV_INUSE);
2255
            set_foot(remainder, remainder_size);
2256
            check_malloced_chunk(victim, nb);
2257
            return chunk2mem(victim);
2258
          }
2259
 
2260
          else if (remainder_size >= 0)  /* take */
2261
          {
2262
            set_inuse_bit_at_offset(victim, victim_size);
2263
            unlink(victim, bck, fwd);
2264
            check_malloced_chunk(victim, nb);
2265
            return chunk2mem(victim);
2266
          }
2267
 
2268
        }
2269
 
2270
       bin = next_bin(bin);
2271
 
2272
      } while ((++idx & (BINBLOCKWIDTH - 1)) != 0);
2273
 
2274
      /* Clear out the block bit. */
2275
 
2276
      do   /* Possibly backtrack to try to clear a partial block */
2277
      {
2278
        if ((startidx & (BINBLOCKWIDTH - 1)) == 0)
2279
        {
2280
          binblocks &= ~block;
2281
          break;
2282
        }
2283
        --startidx;
2284
       q = prev_bin(q);
2285
      } while (first(q) == q);
2286
 
2287
      /* Get to the next possibly nonempty block */
2288
 
2289
      if ( (block <<= 1) <= binblocks && (block != 0) )
2290
      {
2291
        while ((block & binblocks) == 0)
2292
        {
2293
          idx += BINBLOCKWIDTH;
2294
          block <<= 1;
2295
        }
2296
      }
2297
      else
2298
        break;
2299
    }
2300
  }
2301
 
2302
 
2303
  /* Try to use top chunk */
2304
 
2305
  /* Require that there be a remainder, ensuring top always exists  */
2306
  if ( (remainder_size = chunksize(top) - nb) < (long)MINSIZE)
2307
  {
2308
 
2309
#if HAVE_MMAP
2310
    /* If big and would otherwise need to extend, try to use mmap instead */
2311
    if ((unsigned long)nb >= (unsigned long)mmap_threshold &&
2312
        (victim = mmap_chunk(nb)) != 0)
2313
      return chunk2mem(victim);
2314
#endif
2315
 
2316
    /* Try to extend */
2317
    malloc_extend_top(nb);
2318
    if ( (remainder_size = chunksize(top) - nb) < (long)MINSIZE)
2319
      return 0; /* propagate failure */
2320
  }
2321
 
2322
  victim = top;
2323
  set_head(victim, nb | PREV_INUSE);
2324
  top = chunk_at_offset(victim, nb);
2325
  set_head(top, remainder_size | PREV_INUSE);
2326
  check_malloced_chunk(victim, nb);
2327
  return chunk2mem(victim);
2328
 
2329
}
2330
 
2331
 
2332
 
2333
 
2334
/*
2335
 
2336
  free() algorithm :
2337
 
2338
    cases:
2339
 
2340
       1. free(0) has no effect.
2341
 
2342
       2. If the chunk was allocated via mmap, it is release via munmap().
2343
 
2344
       3. If a returned chunk borders the current high end of memory,
2345
          it is consolidated into the top, and if the total unused
2346
          topmost memory exceeds the trim threshold, malloc_trim is
2347
          called.
2348
 
2349
       4. Other chunks are consolidated as they arrive, and
2350
          placed in corresponding bins. (This includes the case of
2351
          consolidating with the current `last_remainder').
2352
 
2353
*/
2354
 
2355
 
2356
#if __STD_C
2357
void fREe(Void_t* mem)
2358
#else
2359
void fREe(mem) Void_t* mem;
2360
#endif
2361
{
2362
  mchunkptr p;         /* chunk corresponding to mem */
2363
  INTERNAL_SIZE_T hd;  /* its head field */
2364
  INTERNAL_SIZE_T sz;  /* its size */
2365
  int       idx;       /* its bin index */
2366
  mchunkptr next;      /* next contiguous chunk */
2367
  INTERNAL_SIZE_T nextsz; /* its size */
2368
  INTERNAL_SIZE_T prevsz; /* size of previous contiguous chunk */
2369
  mchunkptr bck;       /* misc temp for linking */
2370
  mchunkptr fwd;       /* misc temp for linking */
2371
  int       islr;      /* track whether merging with last_remainder */
2372
 
2373
  if (mem == 0)                              /* free(0) has no effect */
2374
    return;
2375
 
2376
  p = mem2chunk(mem);
2377
  hd = p->size;
2378
 
2379
#if HAVE_MMAP
2380
  if (hd & IS_MMAPPED)                       /* release mmapped memory. */
2381
  {
2382
    munmap_chunk(p);
2383
    return;
2384
  }
2385
#endif
2386
 
2387
  check_inuse_chunk(p);
2388
 
2389
  sz = hd & ~PREV_INUSE;
2390
  next = chunk_at_offset(p, sz);
2391
  nextsz = chunksize(next);
2392
 
2393
  if (next == top)                            /* merge with top */
2394
  {
2395
    sz += nextsz;
2396
 
2397
    if (!(hd & PREV_INUSE))                    /* consolidate backward */
2398
    {
2399
      prevsz = p->prev_size;
10425 ripley 2400
      p = chunk_at_offset(p, -((long) prevsz));
10347 ripley 2401
      sz += prevsz;
2402
      unlink(p, bck, fwd);
2403
    }
2404
 
2405
    set_head(p, sz | PREV_INUSE);
2406
    top = p;
2407
    if ((unsigned long)(sz) >= (unsigned long)trim_threshold)
2408
      malloc_trim(top_pad);
2409
    return;
2410
  }
2411
 
2412
  set_head(next, nextsz);                    /* clear inuse bit */
2413
 
2414
  islr = 0;
2415
 
2416
  if (!(hd & PREV_INUSE))                    /* consolidate backward */
2417
  {
2418
    prevsz = p->prev_size;
10425 ripley 2419
    p = chunk_at_offset(p, -((long) prevsz));
10347 ripley 2420
    sz += prevsz;
2421
 
2422
    if (p->fd == last_remainder)             /* keep as last_remainder */
2423
      islr = 1;
2424
    else
2425
      unlink(p, bck, fwd);
2426
  }
2427
 
2428
  if (!(inuse_bit_at_offset(next, nextsz)))   /* consolidate forward */
2429
  {
2430
    sz += nextsz;
2431
 
2432
    if (!islr && next->fd == last_remainder)  /* re-insert last_remainder */
2433
    {
2434
      islr = 1;
2435
      link_last_remainder(p);
2436
    }
2437
    else
2438
      unlink(next, bck, fwd);
2439
  }
2440
 
2441
 
2442
  set_head(p, sz | PREV_INUSE);
2443
  set_foot(p, sz);
2444
  if (!islr)
2445
    frontlink(p, sz, idx, bck, fwd);
2446
}
2447
 
2448
 
2449
 
2450
 
2451
 
2452
/*
2453
 
2454
  Realloc algorithm:
2455
 
2456
    Chunks that were obtained via mmap cannot be extended or shrunk
2457
    unless HAVE_MREMAP is defined, in which case mremap is used.
2458
    Otherwise, if their reallocation is for additional space, they are
2459
    copied.  If for less, they are just left alone.
2460
 
2461
    Otherwise, if the reallocation is for additional space, and the
2462
    chunk can be extended, it is, else a malloc-copy-free sequence is
2463
    taken.  There are several different ways that a chunk could be
2464
    extended. All are tried:
2465
 
2466
       * Extending forward into following adjacent free chunk.
2467
       * Shifting backwards, joining preceding adjacent space
2468
       * Both shifting backwards and extending forward.
2469
       * Extending into newly sbrked space
2470
 
2471
    Unless the #define REALLOC_ZERO_BYTES_FREES is set, realloc with a
2472
    size argument of zero (re)allocates a minimum-sized chunk.
2473
 
2474
    If the reallocation is for less space, and the new request is for
2475
    a `small' (<512 bytes) size, then the newly unused space is lopped
2476
    off and freed.
2477
 
2478
    The old unix realloc convention of allowing the last-free'd chunk
2479
    to be used as an argument to realloc is no longer supported.
2480
    I don't know of any programs still relying on this feature,
2481
    and allowing it would also allow too many other incorrect
2482
    usages of realloc to be sensible.
2483
 
2484
 
2485
*/
2486
 
2487
 
2488
#if __STD_C
2489
Void_t* rEALLOc(Void_t* oldmem, size_t bytes)
2490
#else
2491
Void_t* rEALLOc(oldmem, bytes) Void_t* oldmem; size_t bytes;
2492
#endif
2493
{
2494
  INTERNAL_SIZE_T    nb;      /* padded request size */
2495
 
2496
  mchunkptr oldp;             /* chunk corresponding to oldmem */
2497
  INTERNAL_SIZE_T    oldsize; /* its size */
2498
 
2499
  mchunkptr newp;             /* chunk to return */
2500
  INTERNAL_SIZE_T    newsize; /* its size */
2501
  Void_t*   newmem;           /* corresponding user mem */
2502
 
2503
  mchunkptr next;             /* next contiguous chunk after oldp */
2504
  INTERNAL_SIZE_T  nextsize;  /* its size */
2505
 
2506
  mchunkptr prev;             /* previous contiguous chunk before oldp */
2507
  INTERNAL_SIZE_T  prevsize;  /* its size */
2508
 
2509
  mchunkptr remainder;        /* holds split off extra space from newp */
2510
  INTERNAL_SIZE_T  remainder_size;   /* its size */
2511
 
2512
  mchunkptr bck;              /* misc temp for linking */
2513
  mchunkptr fwd;              /* misc temp for linking */
2514
 
2515
#ifdef REALLOC_ZERO_BYTES_FREES
2516
  if (bytes == 0) { fREe(oldmem); return 0; }
2517
#endif
2518
 
10425 ripley 2519
  if ((long)bytes < 0) return 0;
10347 ripley 2520
 
2521
  /* realloc of null is supposed to be same as malloc */
2522
  if (oldmem == 0) return mALLOc(bytes);
2523
 
2524
  newp    = oldp    = mem2chunk(oldmem);
2525
  newsize = oldsize = chunksize(oldp);
2526
 
2527
 
2528
  nb = request2size(bytes);
2529
 
2530
#if HAVE_MMAP
2531
  if (chunk_is_mmapped(oldp))
2532
  {
2533
#if HAVE_MREMAP
2534
    newp = mremap_chunk(oldp, nb);
2535
    if(newp) return chunk2mem(newp);
2536
#endif
2537
    /* Note the extra SIZE_SZ overhead. */
2538
    if(oldsize - SIZE_SZ >= nb) return oldmem; /* do nothing */
2539
    /* Must alloc, copy, free. */
2540
    newmem = mALLOc(bytes);
2541
    if (newmem == 0) return 0; /* propagate failure */
2542
    MALLOC_COPY(newmem, oldmem, oldsize - 2*SIZE_SZ);
2543
    munmap_chunk(oldp);
2544
    return newmem;
2545
  }
2546
#endif
2547
 
2548
  check_inuse_chunk(oldp);
2549
 
2550
  if ((long)(oldsize) < (long)(nb))
2551
  {
2552
 
2553
    /* Try expanding forward */
2554
 
2555
    next = chunk_at_offset(oldp, oldsize);
2556
    if (next == top || !inuse(next))
2557
    {
2558
      nextsize = chunksize(next);
2559
 
2560
      /* Forward into top only if a remainder */
2561
      if (next == top)
2562
      {
2563
        if ((long)(nextsize + newsize) >= (long)(nb + MINSIZE))
2564
        {
2565
          newsize += nextsize;
2566
          top = chunk_at_offset(oldp, nb);
2567
          set_head(top, (newsize - nb) | PREV_INUSE);
2568
          set_head_size(oldp, nb);
2569
          return chunk2mem(oldp);
2570
        }
2571
      }
2572
 
2573
      /* Forward into next chunk */
2574
      else if (((long)(nextsize + newsize) >= (long)(nb)))
2575
      {
2576
        unlink(next, bck, fwd);
2577
        newsize  += nextsize;
2578
        goto split;
2579
      }
2580
    }
2581
    else
2582
    {
2583
      next = 0;
2584
      nextsize = 0;
2585
    }
2586
 
2587
    /* Try shifting backwards. */
2588
 
2589
    if (!prev_inuse(oldp))
2590
    {
2591
      prev = prev_chunk(oldp);
2592
      prevsize = chunksize(prev);
2593
 
2594
      /* try forward + backward first to save a later consolidation */
2595
 
2596
      if (next != 0)
2597
      {
2598
        /* into top */
2599
        if (next == top)
2600
        {
2601
          if ((long)(nextsize + prevsize + newsize) >= (long)(nb + MINSIZE))
2602
          {
2603
            unlink(prev, bck, fwd);
2604
            newp = prev;
2605
            newsize += prevsize + nextsize;
2606
            newmem = chunk2mem(newp);
2607
            MALLOC_COPY(newmem, oldmem, oldsize - SIZE_SZ);
2608
            top = chunk_at_offset(newp, nb);
2609
            set_head(top, (newsize - nb) | PREV_INUSE);
2610
            set_head_size(newp, nb);
2611
            return newmem;
2612
          }
2613
        }
2614
 
2615
        /* into next chunk */
2616
        else if (((long)(nextsize + prevsize + newsize) >= (long)(nb)))
2617
        {
2618
          unlink(next, bck, fwd);
2619
          unlink(prev, bck, fwd);
2620
          newp = prev;
2621
          newsize += nextsize + prevsize;
2622
          newmem = chunk2mem(newp);
2623
          MALLOC_COPY(newmem, oldmem, oldsize - SIZE_SZ);
2624
          goto split;
2625
        }
2626
      }
2627
 
2628
      /* backward only */
2629
      if (prev != 0 && (long)(prevsize + newsize) >= (long)nb)
2630
      {
2631
        unlink(prev, bck, fwd);
2632
        newp = prev;
2633
        newsize += prevsize;
2634
        newmem = chunk2mem(newp);
2635
        MALLOC_COPY(newmem, oldmem, oldsize - SIZE_SZ);
2636
        goto split;
2637
      }
2638
    }
2639
 
2640
    /* Must allocate */
2641
 
2642
    newmem = mALLOc (bytes);
2643
 
2644
    if (newmem == 0)  /* propagate failure */
2645
      return 0;
2646
 
2647
    /* Avoid copy if newp is next chunk after oldp. */
2648
    /* (This can only happen when new chunk is sbrk'ed.) */
2649
 
2650
    if ( (newp = mem2chunk(newmem)) == next_chunk(oldp))
2651
    {
2652
      newsize += chunksize(newp);
2653
      newp = oldp;
2654
      goto split;
2655
    }
2656
 
2657
    /* Otherwise copy, free, and exit */
2658
    MALLOC_COPY(newmem, oldmem, oldsize - SIZE_SZ);
2659
    fREe(oldmem);
2660
    return newmem;
2661
  }
2662
 
2663
 
2664
 split:  /* split off extra room in old or expanded chunk */
2665
 
2666
  if (newsize - nb >= MINSIZE) /* split off remainder */
2667
  {
2668
    remainder = chunk_at_offset(newp, nb);
2669
    remainder_size = newsize - nb;
2670
    set_head_size(newp, nb);
2671
    set_head(remainder, remainder_size | PREV_INUSE);
2672
    set_inuse_bit_at_offset(remainder, remainder_size);
2673
    fREe(chunk2mem(remainder)); /* let free() deal with it */
2674
  }
2675
  else
2676
  {
2677
    set_head_size(newp, newsize);
2678
    set_inuse_bit_at_offset(newp, newsize);
2679
  }
2680
 
2681
  check_inuse_chunk(newp);
2682
  return chunk2mem(newp);
2683
}
2684
 
2685
 
2686
 
2687
 
2688
/*
2689
 
2690
  memalign algorithm:
2691
 
2692
    memalign requests more than enough space from malloc, finds a spot
2693
    within that chunk that meets the alignment request, and then
2694
    possibly frees the leading and trailing space.
2695
 
2696
    The alignment argument must be a power of two. This property is not
2697
    checked by memalign, so misuse may result in random runtime errors.
2698
 
2699
    8-byte alignment is guaranteed by normal malloc calls, so don't
2700
    bother calling memalign with an argument of 8 or less.
2701
 
2702
    Overreliance on memalign is a sure way to fragment space.
2703
 
2704
*/
2705
 
2706
 
2707
#if __STD_C
2708
Void_t* mEMALIGn(size_t alignment, size_t bytes)
2709
#else
2710
Void_t* mEMALIGn(alignment, bytes) size_t alignment; size_t bytes;
2711
#endif
2712
{
2713
  INTERNAL_SIZE_T    nb;      /* padded  request size */
2714
  char*     m;                /* memory returned by malloc call */
2715
  mchunkptr p;                /* corresponding chunk */
2716
  char*     brk;              /* alignment point within p */
2717
  mchunkptr newp;             /* chunk to return */
2718
  INTERNAL_SIZE_T  newsize;   /* its size */
2719
  INTERNAL_SIZE_T  leadsize;  /* leading space befor alignment point */
2720
  mchunkptr remainder;        /* spare room at end to split off */
2721
  long      remainder_size;   /* its size */
2722
 
10425 ripley 2723
  if ((long)bytes < 0) return 0;
2724
 
10347 ripley 2725
  /* If need less alignment than we give anyway, just relay to malloc */
2726
 
2727
  if (alignment <= MALLOC_ALIGNMENT) return mALLOc(bytes);
2728
 
2729
  /* Otherwise, ensure that it is at least a minimum chunk size */
2730
 
2731
  if (alignment <  MINSIZE) alignment = MINSIZE;
2732
 
2733
  /* Call malloc with worst case padding to hit alignment. */
2734
 
2735
  nb = request2size(bytes);
2736
  m  = (char*)(mALLOc(nb + alignment + MINSIZE));
2737
 
2738
  if (m == 0) return 0; /* propagate failure */
2739
 
2740
  p = mem2chunk(m);
2741
 
2742
  if ((((unsigned long)(m)) % alignment) == 0) /* aligned */
2743
  {
2744
#if HAVE_MMAP
2745
    if(chunk_is_mmapped(p))
2746
      return chunk2mem(p); /* nothing more to do */
2747
#endif
2748
  }
2749
  else /* misaligned */
2750
  {
2751
    /*
2752
      Find an aligned spot inside chunk.
2753
      Since we need to give back leading space in a chunk of at
2754
      least MINSIZE, if the first calculation places us at
2755
      a spot with less than MINSIZE leader, we can move to the
2756
      next aligned spot -- we've allocated enough total room so that
2757
      this is always possible.
2758
    */
2759
 
10425 ripley 2760
    brk = (char*)mem2chunk(((unsigned long)(m + alignment - 1)) & -((signed) alignment));
10347 ripley 2761
    if ((long)(brk - (char*)(p)) < MINSIZE) brk = brk + alignment;
2762
 
2763
    newp = (mchunkptr)brk;
2764
    leadsize = brk - (char*)(p);
2765
    newsize = chunksize(p) - leadsize;
2766
 
2767
#if HAVE_MMAP
2768
    if(chunk_is_mmapped(p))
2769
    {
2770
      newp->prev_size = p->prev_size + leadsize;
2771
      set_head(newp, newsize|IS_MMAPPED);
2772
      return chunk2mem(newp);
2773
    }
2774
#endif
2775
 
2776
    /* give back leader, use the rest */
2777
 
2778
    set_head(newp, newsize | PREV_INUSE);
2779
    set_inuse_bit_at_offset(newp, newsize);
2780
    set_head_size(p, leadsize);
2781
    fREe(chunk2mem(p));
2782
    p = newp;
2783
 
2784
    assert (newsize >= nb && (((unsigned long)(chunk2mem(p))) % alignment) == 0);
2785
  }
2786
 
2787
  /* Also give back spare room at the end */
2788
 
2789
  remainder_size = chunksize(p) - nb;
2790
 
2791
  if (remainder_size >= (long)MINSIZE)
2792
  {
2793
    remainder = chunk_at_offset(p, nb);
2794
    set_head(remainder, remainder_size | PREV_INUSE);
2795
    set_head_size(p, nb);
2796
    fREe(chunk2mem(remainder));
2797
  }
2798
 
2799
  check_inuse_chunk(p);
2800
  return chunk2mem(p);
2801
 
2802
}
2803
 
2804
 
2805
 
2806
 
2807
/*
2808
    valloc just invokes memalign with alignment argument equal
2809
    to the page size of the system (or as near to this as can
2810
    be figured out from all the includes/defines above.)
2811
*/
2812
 
2813
#if __STD_C
2814
Void_t* vALLOc(size_t bytes)
2815
#else
2816
Void_t* vALLOc(bytes) size_t bytes;
2817
#endif
2818
{
2819
  return mEMALIGn (malloc_getpagesize, bytes);
2820
}
2821
 
2822
/*
2823
  pvalloc just invokes valloc for the nearest pagesize
2824
  that will accommodate request
2825
*/
2826
 
2827
 
2828
#if __STD_C
2829
Void_t* pvALLOc(size_t bytes)
2830
#else
2831
Void_t* pvALLOc(bytes) size_t bytes;
2832
#endif
2833
{
2834
  size_t pagesize = malloc_getpagesize;
2835
  return mEMALIGn (pagesize, (bytes + pagesize - 1) & ~(pagesize - 1));
2836
}
2837
 
2838
/*
2839
 
2840
  calloc calls malloc, then zeroes out the allocated chunk.
2841
 
2842
*/
2843
 
2844
#if __STD_C
2845
Void_t* cALLOc(size_t n, size_t elem_size)
2846
#else
2847
Void_t* cALLOc(n, elem_size) size_t n; size_t elem_size;
2848
#endif
2849
{
2850
  mchunkptr p;
2851
  INTERNAL_SIZE_T csz;
2852
 
2853
  INTERNAL_SIZE_T sz = n * elem_size;
2854
 
10425 ripley 2855
 
10347 ripley 2856
  /* check if expand_top called, in which case don't need to clear */
2857
#if MORECORE_CLEARS
2858
  mchunkptr oldtop = top;
2859
  INTERNAL_SIZE_T oldtopsize = chunksize(top);
2860
#endif
2861
  Void_t* mem = mALLOc (sz);
2862
 
10425 ripley 2863
  if ((long)n < 0) return 0;
2864
 
10347 ripley 2865
  if (mem == 0)
2866
    return 0;
2867
  else
2868
  {
2869
    p = mem2chunk(mem);
2870
 
2871
    /* Two optional cases in which clearing not necessary */
2872
 
2873
 
2874
#if HAVE_MMAP
2875
    if (chunk_is_mmapped(p)) return mem;
2876
#endif
2877
 
2878
    csz = chunksize(p);
2879
 
2880
#if MORECORE_CLEARS
2881
    if (p == oldtop && csz > oldtopsize)
2882
    {
2883
      /* clear only the bytes from non-freshly-sbrked memory */
2884
      csz = oldtopsize;
2885
    }
2886
#endif
2887
 
2888
    MALLOC_ZERO(mem, csz - SIZE_SZ);
2889
    return mem;
2890
  }
2891
}
2892
 
2893
/*
2894
 
2895
  cfree just calls free. It is needed/defined on some systems
2896
  that pair it with calloc, presumably for odd historical reasons.
2897
 
2898
*/
2899
 
2900
#if !defined(INTERNAL_LINUX_C_LIB) || !defined(__ELF__)
2901
#if __STD_C
2902
void cfree(Void_t *mem)
2903
#else
2904
void cfree(mem) Void_t *mem;
2905
#endif
2906
{
10425 ripley 2907
  fREe(mem);
10347 ripley 2908
}
2909
#endif
2910
 
2911
 
2912
 
2913
/*
2914
 
2915
    Malloc_trim gives memory back to the system (via negative
2916
    arguments to sbrk) if there is unused memory at the `high' end of
2917
    the malloc pool. You can call this after freeing large blocks of
2918
    memory to potentially reduce the system-level memory requirements
2919
    of a program. However, it cannot guarantee to reduce memory. Under
2920
    some allocation patterns, some large free blocks of memory will be
2921
    locked between two used chunks, so they cannot be given back to
2922
    the system.
2923
 
2924
    The `pad' argument to malloc_trim represents the amount of free
2925
    trailing space to leave untrimmed. If this argument is zero,
2926
    only the minimum amount of memory to maintain internal data
2927
    structures will be left (one page or less). Non-zero arguments
2928
    can be supplied to maintain enough trailing space to service
2929
    future expected allocations without having to re-obtain memory
2930
    from the system.
2931
 
2932
    Malloc_trim returns 1 if it actually released any memory, else 0.
2933
 
2934
*/
2935
 
2936
#if __STD_C
2937
int malloc_trim(size_t pad)
2938
#else
2939
int malloc_trim(pad) size_t pad;
2940
#endif
2941
{
2942
  long  top_size;        /* Amount of top-most memory */
2943
  long  extra;           /* Amount to release */
2944
  char* current_brk;     /* address returned by pre-check sbrk call */
2945
  char* new_brk;         /* address returned by negative sbrk call */
2946
 
2947
  unsigned long pagesz = malloc_getpagesize;
2948
 
2949
  top_size = chunksize(top);
2950
  extra = ((top_size - pad - MINSIZE + (pagesz-1)) / pagesz - 1) * pagesz;
2951
 
2952
  if (extra < (long)pagesz)  /* Not enough memory to release */
2953
    return 0;
2954
 
2955
  else
2956
  {
2957
    /* Test to make sure no one else called sbrk */
2958
    current_brk = (char*)(MORECORE (0));
2959
    if (current_brk != (char*)(top) + top_size)
2960
      return 0;     /* Apparently we don't own memory; must fail */
2961
 
2962
    else
2963
    {
2964
      new_brk = (char*)(MORECORE (-extra));
2965
 
2966
      if (new_brk == (char*)(MORECORE_FAILURE)) /* sbrk failed? */
2967
      {
2968
        /* Try to figure out what we have */
2969
        current_brk = (char*)(MORECORE (0));
2970
        top_size = current_brk - (char*)top;
2971
        if (top_size >= (long)MINSIZE) /* if not, we are very very dead! */
2972
        {
2973
          sbrked_mem = current_brk - sbrk_base;
2974
          set_head(top, top_size | PREV_INUSE);
2975
        }
2976
        check_chunk(top);
2977
        return 0;
2978
      }
2979
 
2980
      else
2981
      {
2982
        /* Success. Adjust top accordingly. */
2983
        set_head(top, (top_size - extra) | PREV_INUSE);
2984
        sbrked_mem -= extra;
2985
        check_chunk(top);
2986
        return 1;
2987
      }
2988
    }
2989
  }
2990
}
2991
 
2992
 
2993
 
2994
/*
2995
  malloc_usable_size:
2996
 
2997
    This routine tells you how many bytes you can actually use in an
2998
    allocated chunk, which may be more than you requested (although
2999
    often not). You can use this many bytes without worrying about
3000
    overwriting other allocated objects. Not a particularly great
3001
    programming practice, but still sometimes useful.
3002
 
3003
*/
3004
 
3005
#if __STD_C
3006
size_t malloc_usable_size(Void_t* mem)
3007
#else
3008
size_t malloc_usable_size(mem) Void_t* mem;
3009
#endif
3010
{
3011
  mchunkptr p;
3012
  if (mem == 0)
3013
    return 0;
3014
  else
3015
  {
3016
    p = mem2chunk(mem);
3017
    if(!chunk_is_mmapped(p))
3018
    {
3019
      if (!inuse(p)) return 0;
3020
      check_inuse_chunk(p);
3021
      return chunksize(p) - SIZE_SZ;
3022
    }
3023
    return chunksize(p) - 2*SIZE_SZ;
3024
  }
3025
}
3026
 
3027
 
3028
 
3029
 
3030
/* Utility to update current_mallinfo for malloc_stats and mallinfo() */
3031
 
3032
static void malloc_update_mallinfo()
3033
{
3034
  int i;
3035
  mbinptr b;
3036
  mchunkptr p;
3037
#if DEBUG
3038
  mchunkptr q;
3039
#endif
3040
 
3041
  INTERNAL_SIZE_T avail = chunksize(top);
3042
  int   navail = ((long)(avail) >= (long)MINSIZE)? 1 : 0;
3043
 
3044
  for (i = 1; i < NAV; ++i)
3045
  {
3046
    b = bin_at(i);
3047
    for (p = last(b); p != b; p = p->bk)
3048
    {
3049
#if DEBUG
3050
      check_free_chunk(p);
3051
      for (q = next_chunk(p);
3052
           q < top && inuse(q) && (long)(chunksize(q)) >= (long)MINSIZE;
3053
           q = next_chunk(q))
3054
        check_inuse_chunk(q);
3055
#endif
3056
      avail += chunksize(p);
3057
      navail++;
3058
    }
3059
  }
3060
 
3061
  current_mallinfo.ordblks = navail;
3062
  current_mallinfo.uordblks = sbrked_mem - avail;
3063
  current_mallinfo.fordblks = avail;
3064
  current_mallinfo.hblks = n_mmaps;
3065
  current_mallinfo.hblkhd = mmapped_mem;
3066
  current_mallinfo.keepcost = chunksize(top);
3067
 
3068
}
3069
 
3070
 
3071
 
3072
/*
3073
 
3074
  malloc_stats:
3075
 
3076
    Prints on stderr the amount of space obtain from the system (both
3077
    via sbrk and mmap), the maximum amount (which may be more than
3078
    current if malloc_trim and/or munmap got called), the maximum
3079
    number of simultaneous mmap regions used, and the current number
3080
    of bytes allocated via malloc (or realloc, etc) but not yet
3081
    freed. (Note that this is the number of bytes allocated, not the
3082
    number requested. It will be larger than the number requested
3083
    because of alignment and bookkeeping overhead.)
3084
 
3085
*/
3086
 
3087
void malloc_stats()
3088
{
3089
  malloc_update_mallinfo();
3090
  fprintf(stderr, "max system bytes = %10u\n",
3091
          (unsigned int)(max_total_mem));
3092
  fprintf(stderr, "system bytes     = %10u\n",
3093
          (unsigned int)(sbrked_mem + mmapped_mem));
3094
  fprintf(stderr, "in use bytes     = %10u\n",
3095
          (unsigned int)(current_mallinfo.uordblks + mmapped_mem));
3096
#if HAVE_MMAP
3097
  fprintf(stderr, "max mmap regions = %10u\n",
3098
          (unsigned int)max_n_mmaps);
3099
#endif
3100
}
3101
 
3102
/*
3103
  mallinfo returns a copy of updated current mallinfo.
3104
*/
3105
 
3106
struct mallinfo mALLINFo()
3107
{
3108
  malloc_update_mallinfo();
3109
  return current_mallinfo;
3110
}
3111
 
3112
 
3113
 
3114
 
3115
/*
3116
  mallopt:
3117
 
3118
    mallopt is the general SVID/XPG interface to tunable parameters.
3119
    The format is to provide a (parameter-number, parameter-value) pair.
3120
    mallopt then sets the corresponding parameter to the argument
3121
    value if it can (i.e., so long as the value is meaningful),
3122
    and returns 1 if successful else 0.
3123
 
3124
    See descriptions of tunable parameters above.
3125
 
3126
*/
3127
 
3128
#if __STD_C
3129
int mALLOPt(int param_number, int value)
3130
#else
3131
int mALLOPt(param_number, value) int param_number; int value;
3132
#endif
3133
{
3134
  switch(param_number)
3135
  {
3136
    case M_TRIM_THRESHOLD:
3137
      trim_threshold = value; return 1;
3138
    case M_TOP_PAD:
3139
      top_pad = value; return 1;
3140
    case M_MMAP_THRESHOLD:
3141
      mmap_threshold = value; return 1;
3142
    case M_MMAP_MAX:
3143
#if HAVE_MMAP
3144
      n_mmaps_max = value; return 1;
3145
#else
3146
      if (value != 0) return 0; else  n_mmaps_max = value; return 1;
3147
#endif
3148
 
3149
    default:
3150
      return 0;
3151
  }
3152
}
3153
 
3154
/*
3155
 
3156
History:
3157
 
10425 ripley 3158
    V2.6.6 Sun Dec  5 07:42:19 1999  Doug Lea  (dl at gee)
3159
      * return null for negative arguments
3160
      * Added Several WIN32 cleanups from Martin C. Fong <mcfong@yahoo.com>
3161
         * Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h'
3162
          (e.g. WIN32 platforms)
3163
         * Cleanup up header file inclusion for WIN32 platforms
3164
         * Cleanup code to avoid Microsoft Visual C++ compiler complaints
3165
         * Add 'USE_DL_PREFIX' to quickly allow co-existence with existing
3166
           memory allocation routines
3167
         * Set 'malloc_getpagesize' for WIN32 platforms (needs more work)
3168
         * Use 'assert' rather than 'ASSERT' in WIN32 code to conform to
3169
	   usage of 'assert' in non-WIN32 code
3170
         * Improve WIN32 'sbrk()' emulation's 'findRegion()' routine to
3171
           avoid infinite loop
3172
      * Always call 'fREe()' rather than 'free()'
3173
 
10347 ripley 3174
    V2.6.5 Wed Jun 17 15:57:31 1998  Doug Lea  (dl at gee)
3175
      * Fixed ordering problem with boundary-stamping
3176
 
3177
    V2.6.3 Sun May 19 08:17:58 1996  Doug Lea  (dl at gee)
3178
      * Added pvalloc, as recommended by H.J. Liu
3179
      * Added 64bit pointer support mainly from Wolfram Gloger
3180
      * Added anonymously donated WIN32 sbrk emulation
3181
      * Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen
3182
      * malloc_extend_top: fix mask error that caused wastage after
3183
        foreign sbrks
3184
      * Add linux mremap support code from HJ Liu
3185
 
3186
    V2.6.2 Tue Dec  5 06:52:55 1995  Doug Lea  (dl at gee)
3187
      * Integrated most documentation with the code.
3188
      * Add support for mmap, with help from
3189
        Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
3190
      * Use last_remainder in more cases.
3191
      * Pack bins using idea from  colin@nyx10.cs.du.edu
3192
      * Use ordered bins instead of best-fit threshhold
3193
      * Eliminate block-local decls to simplify tracing and debugging.
3194
      * Support another case of realloc via move into top
3195
      * Fix error occuring when initial sbrk_base not word-aligned.
3196
      * Rely on page size for units instead of SBRK_UNIT to
3197
        avoid surprises about sbrk alignment conventions.
3198
      * Add mallinfo, mallopt. Thanks to Raymond Nijssen
3199
        (raymond@es.ele.tue.nl) for the suggestion.
3200
      * Add `pad' argument to malloc_trim and top_pad mallopt parameter.
3201
      * More precautions for cases where other routines call sbrk,
3202
        courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
3203
      * Added macros etc., allowing use in linux libc from
3204
        H.J. Lu (hjl@gnu.ai.mit.edu)
3205
      * Inverted this history list
3206
 
3207
    V2.6.1 Sat Dec  2 14:10:57 1995  Doug Lea  (dl at gee)
3208
      * Re-tuned and fixed to behave more nicely with V2.6.0 changes.
3209
      * Removed all preallocation code since under current scheme
3210
        the work required to undo bad preallocations exceeds
3211
        the work saved in good cases for most test programs.
3212
      * No longer use return list or unconsolidated bins since
3213
        no scheme using them consistently outperforms those that don't
3214
        given above changes.
3215
      * Use best fit for very large chunks to prevent some worst-cases.
3216
      * Added some support for debugging
3217
 
3218
    V2.6.0 Sat Nov  4 07:05:23 1995  Doug Lea  (dl at gee)
3219
      * Removed footers when chunks are in use. Thanks to
3220
        Paul Wilson (wilson@cs.texas.edu) for the suggestion.
3221
 
3222
    V2.5.4 Wed Nov  1 07:54:51 1995  Doug Lea  (dl at gee)
3223
      * Added malloc_trim, with help from Wolfram Gloger
3224
        (wmglo@Dent.MED.Uni-Muenchen.DE).
3225
 
3226
    V2.5.3 Tue Apr 26 10:16:01 1994  Doug Lea  (dl at g)
3227
 
3228
    V2.5.2 Tue Apr  5 16:20:40 1994  Doug Lea  (dl at g)
3229
      * realloc: try to expand in both directions
3230
      * malloc: swap order of clean-bin strategy;
3231
      * realloc: only conditionally expand backwards
3232
      * Try not to scavenge used bins
3233
      * Use bin counts as a guide to preallocation
3234
      * Occasionally bin return list chunks in first scan
3235
      * Add a few optimizations from colin@nyx10.cs.du.edu
3236
 
3237
    V2.5.1 Sat Aug 14 15:40:43 1993  Doug Lea  (dl at g)
3238
      * faster bin computation & slightly different binning
3239
      * merged all consolidations to one part of malloc proper
3240
         (eliminating old malloc_find_space & malloc_clean_bin)
3241
      * Scan 2 returns chunks (not just 1)
3242
      * Propagate failure in realloc if malloc returns 0
3243
      * Add stuff to allow compilation on non-ANSI compilers
3244
          from kpv@research.att.com
3245
 
3246
    V2.5 Sat Aug  7 07:41:59 1993  Doug Lea  (dl at g.oswego.edu)
3247
      * removed potential for odd address access in prev_chunk
3248
      * removed dependency on getpagesize.h
3249
      * misc cosmetics and a bit more internal documentation
3250
      * anticosmetics: mangled names in macros to evade debugger strangeness
3251
      * tested on sparc, hp-700, dec-mips, rs6000
3252
          with gcc & native cc (hp, dec only) allowing
3253
          Detlefs & Zorn comparison study (in SIGPLAN Notices.)
3254
 
3255
    Trial version Fri Aug 28 13:14:29 1992  Doug Lea  (dl at g.oswego.edu)
3256
      * Based loosely on libg++-1.2X malloc. (It retains some of the overall
3257
         structure of old version,  but most details differ.)
3258
 
3259
*/
3260
 
3261