t/io/crlf.t failed with miniperl.
[p5sagit/p5-mst-13.2.git] / malloc.c
1 /*    malloc.c
2  *
3  */
4
5 /*
6  * "'The Chamber of Records,' said Gimli. 'I guess that is where we now stand.'"
7  */
8
9 /*
10   Here are some notes on configuring Perl's malloc.  (For non-perl
11   usage see below.)
12  
13   There are two macros which serve as bulk disablers of advanced
14   features of this malloc: NO_FANCY_MALLOC, PLAIN_MALLOC (undef by
15   default).  Look in the list of default values below to understand
16   their exact effect.  Defining NO_FANCY_MALLOC returns malloc.c to the
17   state of the malloc in Perl 5.004.  Additionally defining PLAIN_MALLOC
18   returns it to the state as of Perl 5.000.
19
20   Note that some of the settings below may be ignored in the code based
21   on values of other macros.  The PERL_CORE symbol is only defined when
22   perl itself is being compiled (so malloc can make some assumptions
23   about perl's facilities being available to it).
24
25   Each config option has a short description, followed by its name,
26   default value, and a comment about the default (if applicable).  Some
27   options take a precise value, while the others are just boolean.
28   The boolean ones are listed first.
29
30     # Enable code for an emergency memory pool in $^M.  See perlvar.pod
31     # for a description of $^M.
32     PERL_EMERGENCY_SBRK         (!PLAIN_MALLOC && PERL_CORE)
33
34     # Enable code for printing memory statistics.
35     DEBUGGING_MSTATS            (!PLAIN_MALLOC && PERL_CORE)
36
37     # Move allocation info for small buckets into separate areas.
38     # Memory optimization (especially for small allocations, of the
39     # less than 64 bytes).  Since perl usually makes a large number
40     # of small allocations, this is usually a win.
41     PACK_MALLOC                 (!PLAIN_MALLOC && !RCHECK)
42
43     # Add one page to big powers of two when calculating bucket size.
44     # This is targeted at big allocations, as are common in image
45     # processing.
46     TWO_POT_OPTIMIZE            !PLAIN_MALLOC
47  
48     # Use intermediate bucket sizes between powers-of-two.  This is
49     # generally a memory optimization, and a (small) speed pessimization.
50     BUCKETS_ROOT2               !NO_FANCY_MALLOC
51
52     # Do not check small deallocations for bad free().  Memory
53     # and speed optimization, error reporting pessimization.
54     IGNORE_SMALL_BAD_FREE       (!NO_FANCY_MALLOC && !RCHECK)
55
56     # Use table lookup to decide in which bucket a given allocation will go.
57     SMALL_BUCKET_VIA_TABLE      !NO_FANCY_MALLOC
58
59     # Use a perl-defined sbrk() instead of the (presumably broken or
60     # missing) system-supplied sbrk().
61     USE_PERL_SBRK               undef
62
63     # Use system malloc() (or calloc() etc.) to emulate sbrk(). Normally
64     # only used with broken sbrk()s.
65     PERL_SBRK_VIA_MALLOC        undef
66
67     # Which allocator to use if PERL_SBRK_VIA_MALLOC
68     SYSTEM_ALLOC(a)             malloc(a)
69
70     # Minimal alignment (in bytes, should be a power of 2) of SYSTEM_ALLOC
71     SYSTEM_ALLOC_ALIGNMENT      MEM_ALIGNBYTES
72
73     # Disable memory overwrite checking with DEBUGGING.  Memory and speed
74     # optimization, error reporting pessimization.
75     NO_RCHECK                   undef
76
77     # Enable memory overwrite checking with DEBUGGING.  Memory and speed
78     # pessimization, error reporting optimization
79     RCHECK                      (DEBUGGING && !NO_RCHECK)
80
81     # Failed allocations bigger than this size croak (if
82     # PERL_EMERGENCY_SBRK is enabled) without touching $^M.  See
83     # perlvar.pod for a description of $^M.
84     BIG_SIZE                     (1<<16)        # 64K
85
86     # Starting from this power of two, add an extra page to the
87     # size of the bucket. This enables optimized allocations of sizes
88     # close to powers of 2.  Note that the value is indexed at 0.
89     FIRST_BIG_POW2              15              # 32K, 16K is used too often
90
91     # Estimate of minimal memory footprint.  malloc uses this value to
92     # request the most reasonable largest blocks of memory from the system.
93     FIRST_SBRK                  (48*1024)
94
95     # Round up sbrk()s to multiples of this.
96     MIN_SBRK                    2048
97
98     # Round up sbrk()s to multiples of this percent of footprint.
99     MIN_SBRK_FRAC               3
100
101     # Add this much memory to big powers of two to get the bucket size.
102     PERL_PAGESIZE               4096
103
104     # This many sbrk() discontinuities should be tolerated even
105     # from the start without deciding that sbrk() is usually
106     # discontinuous.
107     SBRK_ALLOW_FAILURES         3
108
109     # This many continuous sbrk()s compensate for one discontinuous one.
110     SBRK_FAILURE_PRICE          50
111
112     # Some configurations may ask for 12-byte-or-so allocations which
113     # require 8-byte alignment (?!).  In such situation one needs to
114     # define this to disable 12-byte bucket (will increase memory footprint)
115     STRICT_ALIGNMENT            undef
116
117   This implementation assumes that calling PerlIO_printf() does not
118   result in any memory allocation calls (used during a panic).
119
120  */
121
122 /*
123    If used outside of Perl environment, it may be useful to redefine
124    the following macros (listed below with defaults):
125
126      # Type of address returned by allocation functions
127      Malloc_t                           void *
128
129      # Type of size argument for allocation functions
130      MEM_SIZE                           unsigned long
131
132      # size of void*
133      PTRSIZE                            4
134
135      # Maximal value in LONG
136      LONG_MAX                           0x7FFFFFFF
137
138      # Unsigned integer type big enough to keep a pointer
139      UV                                 unsigned long
140
141      # Type of pointer with 1-byte granularity
142      caddr_t                            char *
143
144      # Type returned by free()
145      Free_t                             void
146
147      # Very fatal condition reporting function (cannot call any )
148      fatalcroak(arg)                    write(2,arg,strlen(arg)) + exit(2)
149   
150      # Fatal error reporting function
151      croak(format, arg)                 warn(idem) + exit(1)
152   
153      # Fatal error reporting function
154      croak2(format, arg1, arg2)         warn2(idem) + exit(1)
155   
156      # Error reporting function
157      warn(format, arg)                  fprintf(stderr, idem)
158
159      # Error reporting function
160      warn2(format, arg1, arg2)          fprintf(stderr, idem)
161
162      # Locking/unlocking for MT operation
163      MALLOC_LOCK                        MUTEX_LOCK(&PL_malloc_mutex)
164      MALLOC_UNLOCK                      MUTEX_UNLOCK(&PL_malloc_mutex)
165
166      # Locking/unlocking mutex for MT operation
167      MUTEX_LOCK(l)                      void
168      MUTEX_UNLOCK(l)                    void
169  */
170
171 #ifndef NO_FANCY_MALLOC
172 #  ifndef SMALL_BUCKET_VIA_TABLE
173 #    define SMALL_BUCKET_VIA_TABLE
174 #  endif 
175 #  ifndef BUCKETS_ROOT2
176 #    define BUCKETS_ROOT2
177 #  endif 
178 #  ifndef IGNORE_SMALL_BAD_FREE
179 #    define IGNORE_SMALL_BAD_FREE
180 #  endif 
181 #endif 
182
183 #ifndef PLAIN_MALLOC                    /* Bulk enable features */
184 #  ifndef PACK_MALLOC
185 #      define PACK_MALLOC
186 #  endif 
187 #  ifndef TWO_POT_OPTIMIZE
188 #    define TWO_POT_OPTIMIZE
189 #  endif 
190 #  if defined(PERL_CORE) && !defined(PERL_EMERGENCY_SBRK)
191 #    define PERL_EMERGENCY_SBRK
192 #  endif 
193 #  if defined(PERL_CORE) && !defined(DEBUGGING_MSTATS)
194 #    define DEBUGGING_MSTATS
195 #  endif 
196 #endif
197
198 #define MIN_BUC_POW2 (sizeof(void*) > 4 ? 3 : 2) /* Allow for 4-byte arena. */
199 #define MIN_BUCKET (MIN_BUC_POW2 * BUCKETS_PER_POW2)
200
201 #if !(defined(I286) || defined(atarist) || defined(__MINT__))
202         /* take 2k unless the block is bigger than that */
203 #  define LOG_OF_MIN_ARENA 11
204 #else
205         /* take 16k unless the block is bigger than that 
206            (80286s like large segments!), probably good on the atari too */
207 #  define LOG_OF_MIN_ARENA 14
208 #endif
209
210 #ifndef lint
211 #  if defined(DEBUGGING) && !defined(NO_RCHECK)
212 #    define RCHECK
213 #  endif
214 #  if defined(RCHECK) && defined(IGNORE_SMALL_BAD_FREE)
215 #    undef IGNORE_SMALL_BAD_FREE
216 #  endif 
217 /*
218  * malloc.c (Caltech) 2/21/82
219  * Chris Kingsley, kingsley@cit-20.
220  *
221  * This is a very fast storage allocator.  It allocates blocks of a small 
222  * number of different sizes, and keeps free lists of each size.  Blocks that
223  * don't exactly fit are passed up to the next larger size.  In this 
224  * implementation, the available sizes are 2^n-4 (or 2^n-12) bytes long.
225  * If PACK_MALLOC is defined, small blocks are 2^n bytes long.
226  * This is designed for use in a program that uses vast quantities of memory,
227  * but bombs when it runs out.
228  * 
229  * Modifications Copyright Ilya Zakharevich 1996-99.
230  * 
231  * Still very quick, but much more thrifty.  (Std config is 10% slower
232  * than it was, and takes 67% of old heap size for typical usage.)
233  *
234  * Allocations of small blocks are now table-driven to many different
235  * buckets.  Sizes of really big buckets are increased to accomodata
236  * common size=power-of-2 blocks.  Running-out-of-memory is made into
237  * an exception.  Deeply configurable and thread-safe.
238  * 
239  */
240
241 #ifdef PERL_CORE
242 #  include "EXTERN.h"
243 #  define PERL_IN_MALLOC_C
244 #  include "perl.h"
245 #  if defined(PERL_IMPLICIT_CONTEXT)
246 #    define croak       Perl_croak_nocontext
247 #    define croak2      Perl_croak_nocontext
248 #    define warn        Perl_warn_nocontext
249 #    define warn2       Perl_warn_nocontext
250 #  else
251 #    define croak2      croak
252 #    define warn2       warn
253 #  endif
254 #else
255 #  ifdef PERL_FOR_X2P
256 #    include "../EXTERN.h"
257 #    include "../perl.h"
258 #  else
259 #    include <stdlib.h>
260 #    include <stdio.h>
261 #    include <memory.h>
262 #    ifndef Malloc_t
263 #      define Malloc_t void *
264 #    endif
265 #    ifndef PTRSIZE
266 #      define PTRSIZE 4
267 #    endif
268 #    ifndef MEM_SIZE
269 #      define MEM_SIZE unsigned long
270 #    endif
271 #    ifndef LONG_MAX
272 #      define LONG_MAX 0x7FFFFFFF
273 #    endif
274 #    ifndef UV
275 #      define UV unsigned long
276 #    endif
277 #    ifndef caddr_t
278 #      define caddr_t char *
279 #    endif
280 #    ifndef Free_t
281 #      define Free_t void
282 #    endif
283 #    define Copy(s,d,n,t) (void)memcpy((char*)(d),(char*)(s), (n) * sizeof(t))
284 #    define PerlEnv_getenv getenv
285 #    define PerlIO_printf fprintf
286 #    define PerlIO_stderr() stderr
287 #  endif
288 #  ifndef croak                         /* make depend */
289 #    define croak(mess, arg) (warn((mess), (arg)), exit(1))
290 #  endif 
291 #  ifndef croak2                        /* make depend */
292 #    define croak2(mess, arg1, arg2) (warn2((mess), (arg1), (arg2)), exit(1))
293 #  endif 
294 #  ifndef warn
295 #    define warn(mess, arg) fprintf(stderr, (mess), (arg))
296 #  endif 
297 #  ifndef warn2
298 #    define warn2(mess, arg1) fprintf(stderr, (mess), (arg1), (arg2))
299 #  endif 
300 #  ifdef DEBUG_m
301 #    undef DEBUG_m
302 #  endif 
303 #  define DEBUG_m(a)
304 #  ifdef DEBUGGING
305 #     undef DEBUGGING
306 #  endif
307 #  ifndef pTHX
308 #     define pTHX               void
309 #     define pTHX_
310 #     ifdef HASATTRIBUTE
311 #        define dTHX            extern int Perl___notused PERL_UNUSED_DECL
312 #     else
313 #        define dTHX            extern int Perl___notused
314 #     endif
315 #     define WITH_THX(s)        s
316 #  endif
317 #  ifndef PERL_GET_INTERP
318 #     define PERL_GET_INTERP    PL_curinterp
319 #  endif
320 #  ifndef Perl_malloc
321 #     define Perl_malloc malloc
322 #  endif
323 #  ifndef Perl_mfree
324 #     define Perl_mfree free
325 #  endif
326 #  ifndef Perl_realloc
327 #     define Perl_realloc realloc
328 #  endif
329 #  ifndef Perl_calloc
330 #     define Perl_calloc calloc
331 #  endif
332 #  ifndef Perl_strdup
333 #     define Perl_strdup strdup
334 #  endif
335 #endif
336
337 #ifndef MUTEX_LOCK
338 #  define MUTEX_LOCK(l)
339 #endif 
340
341 #ifndef MUTEX_UNLOCK
342 #  define MUTEX_UNLOCK(l)
343 #endif 
344
345 #ifndef MALLOC_LOCK
346 #  define MALLOC_LOCK           MUTEX_LOCK(&PL_malloc_mutex)
347 #endif 
348
349 #ifndef MALLOC_UNLOCK
350 #  define MALLOC_UNLOCK         MUTEX_UNLOCK(&PL_malloc_mutex)
351 #endif 
352
353 #  ifndef fatalcroak                            /* make depend */
354 #    define fatalcroak(mess)    (write(2, (mess), strlen(mess)), exit(2))
355 #  endif 
356
357 #ifdef DEBUGGING
358 #  undef DEBUG_m
359 #  define DEBUG_m(a)                                                    \
360     STMT_START {                                                        \
361         if (PERL_GET_INTERP) {                                          \
362             dTHX;                                                       \
363             if (DEBUG_m_TEST) {                                         \
364                 PL_debug &= ~DEBUG_m_FLAG;                              \
365                 a;                                                      \
366                 PL_debug |= DEBUG_m_FLAG;                               \
367             }                                                           \
368         }                                                               \
369     } STMT_END
370 #endif
371
372 #ifdef PERL_IMPLICIT_CONTEXT
373 #  define PERL_IS_ALIVE         aTHX
374 #else
375 #  define PERL_IS_ALIVE         TRUE
376 #endif
377     
378
379 /*
380  * Layout of memory:
381  * ~~~~~~~~~~~~~~~~
382  * The memory is broken into "blocks" which occupy multiples of 2K (and
383  * generally speaking, have size "close" to a power of 2).  The addresses
384  * of such *unused* blocks are kept in nextf[i] with big enough i.  (nextf
385  * is an array of linked lists.)  (Addresses of used blocks are not known.)
386  * 
387  * Moreover, since the algorithm may try to "bite" smaller blocks out
388  * of unused bigger ones, there are also regions of "irregular" size,
389  * managed separately, by a linked list chunk_chain.
390  * 
391  * The third type of storage is the sbrk()ed-but-not-yet-used space, its
392  * end and size are kept in last_sbrk_top and sbrked_remains.
393  * 
394  * Growing blocks "in place":
395  * ~~~~~~~~~~~~~~~~~~~~~~~~~
396  * The address of the block with the greatest address is kept in last_op
397  * (if not known, last_op is 0).  If it is known that the memory above
398  * last_op is not continuous, or contains a chunk from chunk_chain,
399  * last_op is set to 0.
400  * 
401  * The chunk with address last_op may be grown by expanding into
402  * sbrk()ed-but-not-yet-used space, or trying to sbrk() more continuous
403  * memory.
404  * 
405  * Management of last_op:
406  * ~~~~~~~~~~~~~~~~~~~~~
407  * 
408  * free() never changes the boundaries of blocks, so is not relevant.
409  * 
410  * The only way realloc() may change the boundaries of blocks is if it
411  * grows a block "in place".  However, in the case of success such a
412  * chunk is automatically last_op, and it remains last_op.  In the case
413  * of failure getpages_adjacent() clears last_op.
414  * 
415  * malloc() may change blocks by calling morecore() only.
416  * 
417  * morecore() may create new blocks by:
418  *   a) biting pieces from chunk_chain (cannot create one above last_op);
419  *   b) biting a piece from an unused block (if block was last_op, this
420  *      may create a chunk from chain above last_op, thus last_op is
421  *      invalidated in such a case).
422  *   c) biting of sbrk()ed-but-not-yet-used space.  This creates 
423  *      a block which is last_op.
424  *   d) Allocating new pages by calling getpages();
425  * 
426  * getpages() creates a new block.  It marks last_op at the bottom of
427  * the chunk of memory it returns.
428  * 
429  * Active pages footprint:
430  * ~~~~~~~~~~~~~~~~~~~~~~
431  * Note that we do not need to traverse the lists in nextf[i], just take
432  * the first element of this list.  However, we *need* to traverse the
433  * list in chunk_chain, but most the time it should be a very short one,
434  * so we do not step on a lot of pages we are not going to use.
435  * 
436  * Flaws:
437  * ~~~~~
438  * get_from_bigger_buckets(): forget to increment price => Quite
439  * aggressive.
440  */
441
442 /* I don't much care whether these are defined in sys/types.h--LAW */
443
444 #define u_char unsigned char
445 #define u_int unsigned int
446 /* 
447  * I removed the definition of u_bigint which appeared to be u_bigint = UV
448  * u_bigint was only used in TWOK_MASKED and TWOK_SHIFT 
449  * where I have used PTR2UV.  RMB
450  */
451 #define u_short unsigned short
452
453 /* 286 and atarist like big chunks, which gives too much overhead. */
454 #if (defined(RCHECK) || defined(I286) || defined(atarist) || defined(__MINT__)) && defined(PACK_MALLOC)
455 #  undef PACK_MALLOC
456 #endif 
457
458 /*
459  * The description below is applicable if PACK_MALLOC is not defined.
460  *
461  * The overhead on a block is at least 4 bytes.  When free, this space
462  * contains a pointer to the next free block, and the bottom two bits must
463  * be zero.  When in use, the first byte is set to MAGIC, and the second
464  * byte is the size index.  The remaining bytes are for alignment.
465  * If range checking is enabled and the size of the block fits
466  * in two bytes, then the top two bytes hold the size of the requested block
467  * plus the range checking words, and the header word MINUS ONE.
468  */
469 union   overhead {
470         union   overhead *ov_next;      /* when free */
471 #if MEM_ALIGNBYTES > 4
472         double  strut;                  /* alignment problems */
473 #endif
474         struct {
475 /*
476  * Keep the ovu_index and ovu_magic in this order, having a char
477  * field first gives alignment indigestion in some systems, such as
478  * MachTen.
479  */
480                 u_char  ovu_index;      /* bucket # */
481                 u_char  ovu_magic;      /* magic number */
482 #ifdef RCHECK
483                 u_short ovu_size;       /* actual block size */
484                 u_int   ovu_rmagic;     /* range magic number */
485 #endif
486         } ovu;
487 #define ov_magic        ovu.ovu_magic
488 #define ov_index        ovu.ovu_index
489 #define ov_size         ovu.ovu_size
490 #define ov_rmagic       ovu.ovu_rmagic
491 };
492
493 #define MAGIC           0xff            /* magic # on accounting info */
494 #define RMAGIC          0x55555555      /* magic # on range info */
495 #define RMAGIC_C        0x55            /* magic # on range info */
496
497 #ifdef RCHECK
498 #  define       RSLOP           sizeof (u_int)
499 #  ifdef TWO_POT_OPTIMIZE
500 #    define MAX_SHORT_BUCKET (12 * BUCKETS_PER_POW2)
501 #  else
502 #    define MAX_SHORT_BUCKET (13 * BUCKETS_PER_POW2)
503 #  endif 
504 #else
505 #  define       RSLOP           0
506 #endif
507
508 #if !defined(PACK_MALLOC) && defined(BUCKETS_ROOT2)
509 #  undef BUCKETS_ROOT2
510 #endif 
511
512 #ifdef BUCKETS_ROOT2
513 #  define BUCKET_TABLE_SHIFT 2
514 #  define BUCKET_POW2_SHIFT 1
515 #  define BUCKETS_PER_POW2 2
516 #else
517 #  define BUCKET_TABLE_SHIFT MIN_BUC_POW2
518 #  define BUCKET_POW2_SHIFT 0
519 #  define BUCKETS_PER_POW2 1
520 #endif 
521
522 #if !defined(MEM_ALIGNBYTES) || ((MEM_ALIGNBYTES > 4) && !defined(STRICT_ALIGNMENT))
523 /* Figure out the alignment of void*. */
524 struct aligner {
525   char c;
526   void *p;
527 };
528 #  define ALIGN_SMALL ((int)((caddr_t)&(((struct aligner*)0)->p)))
529 #else
530 #  define ALIGN_SMALL MEM_ALIGNBYTES
531 #endif
532
533 #define IF_ALIGN_8(yes,no)      ((ALIGN_SMALL>4) ? (yes) : (no))
534
535 #ifdef BUCKETS_ROOT2
536 #  define MAX_BUCKET_BY_TABLE 13
537 static u_short buck_size[MAX_BUCKET_BY_TABLE + 1] = 
538   { 
539       0, 0, 0, 0, 4, 4, 8, 12, 16, 24, 32, 48, 64, 80,
540   };
541 #  define BUCKET_SIZE(i) ((i) % 2 ? buck_size[i] : (1 << ((i) >> BUCKET_POW2_SHIFT)))
542 #  define BUCKET_SIZE_REAL(i) ((i) <= MAX_BUCKET_BY_TABLE               \
543                                ? buck_size[i]                           \
544                                : ((1 << ((i) >> BUCKET_POW2_SHIFT))     \
545                                   - MEM_OVERHEAD(i)                     \
546                                   + POW2_OPTIMIZE_SURPLUS(i)))
547 #else
548 #  define BUCKET_SIZE(i) (1 << ((i) >> BUCKET_POW2_SHIFT))
549 #  define BUCKET_SIZE_REAL(i) (BUCKET_SIZE(i) - MEM_OVERHEAD(i) + POW2_OPTIMIZE_SURPLUS(i))
550 #endif 
551
552
553 #ifdef PACK_MALLOC
554 /* In this case there are several possible layout of arenas depending
555  * on the size.  Arenas are of sizes multiple to 2K, 2K-aligned, and
556  * have a size close to a power of 2.
557  *
558  * Arenas of the size >= 4K keep one chunk only.  Arenas of size 2K
559  * may keep one chunk or multiple chunks.  Here are the possible
560  * layouts of arenas:
561  *
562  *      # One chunk only, chunksize 2^k + SOMETHING - ALIGN, k >= 11
563  *
564  * INDEX MAGIC1 UNUSED CHUNK1
565  *
566  *      # Multichunk with sanity checking and chunksize 2^k-ALIGN, k>7
567  *
568  * INDEX MAGIC1 MAGIC2 MAGIC3 UNUSED CHUNK1 CHUNK2 CHUNK3 ...
569  *
570  *      # Multichunk with sanity checking and size 2^k-ALIGN, k=7
571  *
572  * INDEX MAGIC1 MAGIC2 MAGIC3 UNUSED CHUNK1 UNUSED CHUNK2 CHUNK3 ...
573  *
574  *      # Multichunk with sanity checking and size up to 80
575  *
576  * INDEX UNUSED MAGIC1 UNUSED MAGIC2 UNUSED ... CHUNK1 CHUNK2 CHUNK3 ...
577  *
578  *      # No sanity check (usually up to 48=byte-long buckets)
579  * INDEX UNUSED CHUNK1 CHUNK2 ...
580  *
581  * Above INDEX and MAGIC are one-byte-long.  Sizes of UNUSED are
582  * appropriate to keep algorithms simple and memory aligned.  INDEX
583  * encodes the size of the chunk, while MAGICn encodes state (used,
584  * free or non-managed-by-us-so-it-indicates-a-bug) of CHUNKn.  MAGIC
585  * is used for sanity checking purposes only.  SOMETHING is 0 or 4K
586  * (to make size of big CHUNK accomodate allocations for powers of two
587  * better).
588  *
589  * [There is no need to alignment between chunks, since C rules ensure
590  *  that structs which need 2^k alignment have sizeof which is
591  *  divisible by 2^k.  Thus as far as the last chunk is aligned at the
592  *  end of the arena, and 2K-alignment does not contradict things,
593  *  everything is going to be OK for sizes of chunks 2^n and 2^n +
594  *  2^k.  Say, 80-bit buckets will be 16-bit aligned, and as far as we
595  *  put allocations for requests in 65..80 range, all is fine.
596  *
597  *  Note, however, that standard malloc() puts more strict
598  *  requirements than the above C rules.  Moreover, our algorithms of
599  *  realloc() may break this idyll, but we suppose that realloc() does
600  *  need not change alignment.]
601  *
602  * Is very important to make calculation of the offset of MAGICm as
603  * quick as possible, since it is done on each malloc()/free().  In
604  * fact it is so quick that it has quite little effect on the speed of
605  * doing malloc()/free().  [By default] We forego such calculations
606  * for small chunks, but only to save extra 3% of memory, not because
607  * of speed considerations.
608  *
609  * Here is the algorithm [which is the same for all the allocations
610  * schemes above], see OV_MAGIC(block,bucket).  Let OFFSETm be the
611  * offset of the CHUNKm from the start of ARENA.  Then offset of
612  * MAGICm is (OFFSET1 >> SHIFT) + ADDOFFSET.  Here SHIFT and ADDOFFSET
613  * are numbers which depend on the size of the chunks only.
614  *
615  * Let as check some sanity conditions.  Numbers OFFSETm>>SHIFT are
616  * different for all the chunks in the arena if 2^SHIFT is not greater
617  * than size of the chunks in the arena.  MAGIC1 will not overwrite
618  * INDEX provided ADDOFFSET is >0 if OFFSET1 < 2^SHIFT.  MAGIClast
619  * will not overwrite CHUNK1 if OFFSET1 > (OFFSETlast >> SHIFT) +
620  * ADDOFFSET.
621  * 
622  * Make SHIFT the maximal possible (there is no point in making it
623  * smaller).  Since OFFSETlast is 2K - CHUNKSIZE, above restrictions
624  * give restrictions on OFFSET1 and on ADDOFFSET.
625  * 
626  * In particular, for chunks of size 2^k with k>=6 we can put
627  * ADDOFFSET to be from 0 to 2^k - 2^(11-k), and have
628  * OFFSET1==chunksize.  For chunks of size 80 OFFSET1 of 2K%80=48 is
629  * large enough to have ADDOFFSET between 1 and 16 (similarly for 96,
630  * when ADDOFFSET should be 1).  In particular, keeping MAGICs for
631  * these sizes gives no additional size penalty.
632  * 
633  * However, for chunks of size 2^k with k<=5 this gives OFFSET1 >=
634  * ADDOFSET + 2^(11-k).  Keeping ADDOFFSET 0 allows for 2^(11-k)-2^(11-2k)
635  * chunks per arena.  This is smaller than 2^(11-k) - 1 which are
636  * needed if no MAGIC is kept.  [In fact, having a negative ADDOFFSET
637  * would allow for slightly more buckets per arena for k=2,3.]
638  * 
639  * Similarly, for chunks of size 3/2*2^k with k<=5 MAGICs would span
640  * the area up to 2^(11-k)+ADDOFFSET.  For k=4 this give optimal
641  * ADDOFFSET as -7..0.  For k=3 ADDOFFSET can go up to 4 (with tiny
642  * savings for negative ADDOFFSET).  For k=5 ADDOFFSET can go -1..16
643  * (with no savings for negative values).
644  *
645  * In particular, keeping ADDOFFSET 0 for sizes of chunks up to 2^6
646  * leads to tiny pessimizations in case of sizes 4, 8, 12, 24, and
647  * leads to no contradictions except for size=80 (or 96.)
648  *
649  * However, it also makes sense to keep no magic for sizes 48 or less.
650  * This is what we do.  In this case one needs ADDOFFSET>=1 also for
651  * chunksizes 12, 24, and 48, unless one gets one less chunk per
652  * arena.
653  *  
654  * The algo of OV_MAGIC(block,bucket) keeps ADDOFFSET 0 until
655  * chunksize of 64, then makes it 1. 
656  *
657  * This allows for an additional optimization: the above scheme leads
658  * to giant overheads for sizes 128 or more (one whole chunk needs to
659  * be sacrifised to keep INDEX).  Instead we use chunks not of size
660  * 2^k, but of size 2^k-ALIGN.  If we pack these chunks at the end of
661  * the arena, then the beginnings are still in different 2^k-long
662  * sections of the arena if k>=7 for ALIGN==4, and k>=8 if ALIGN=8.
663  * Thus for k>7 the above algo of calculating the offset of the magic
664  * will still give different answers for different chunks.  And to
665  * avoid the overrun of MAGIC1 into INDEX, one needs ADDOFFSET of >=1.
666  * In the case k=7 we just move the first chunk an extra ALIGN
667  * backward inside the ARENA (this is done once per arena lifetime,
668  * thus is not a big overhead).  */
669 #  define MAX_PACKED_POW2 6
670 #  define MAX_PACKED (MAX_PACKED_POW2 * BUCKETS_PER_POW2 + BUCKET_POW2_SHIFT)
671 #  define MAX_POW2_ALGO ((1<<(MAX_PACKED_POW2 + 1)) - M_OVERHEAD)
672 #  define TWOK_MASK ((1<<LOG_OF_MIN_ARENA) - 1)
673 #  define TWOK_MASKED(x) (PTR2UV(x) & ~TWOK_MASK)
674 #  define TWOK_SHIFT(x) (PTR2UV(x) & TWOK_MASK)
675 #  define OV_INDEXp(block) (INT2PTR(u_char*,TWOK_MASKED(block)))
676 #  define OV_INDEX(block) (*OV_INDEXp(block))
677 #  define OV_MAGIC(block,bucket) (*(OV_INDEXp(block) +                  \
678                                     (TWOK_SHIFT(block)>>                \
679                                      (bucket>>BUCKET_POW2_SHIFT)) +     \
680                                     (bucket >= MIN_NEEDS_SHIFT ? 1 : 0)))
681     /* A bucket can have a shift smaller than it size, we need to
682        shift its magic number so it will not overwrite index: */
683 #  ifdef BUCKETS_ROOT2
684 #    define MIN_NEEDS_SHIFT (7*BUCKETS_PER_POW2 - 1) /* Shift 80 greater than chunk 64. */
685 #  else
686 #    define MIN_NEEDS_SHIFT (7*BUCKETS_PER_POW2) /* Shift 128 greater than chunk 32. */
687 #  endif 
688 #  define CHUNK_SHIFT 0
689
690 /* Number of active buckets of given ordinal. */
691 #ifdef IGNORE_SMALL_BAD_FREE
692 #define FIRST_BUCKET_WITH_CHECK (6 * BUCKETS_PER_POW2) /* 64 */
693 #  define N_BLKS(bucket) ( (bucket) < FIRST_BUCKET_WITH_CHECK           \
694                          ? ((1<<LOG_OF_MIN_ARENA) - 1)/BUCKET_SIZE(bucket) \
695                          : n_blks[bucket] )
696 #else
697 #  define N_BLKS(bucket) n_blks[bucket]
698 #endif 
699
700 static u_short n_blks[LOG_OF_MIN_ARENA * BUCKETS_PER_POW2] = 
701   {
702 #  if BUCKETS_PER_POW2==1
703       0, 0,
704       (MIN_BUC_POW2==2 ? 384 : 0),
705       224, 120, 62, 31, 16, 8, 4, 2
706 #  else
707       0, 0, 0, 0,
708       (MIN_BUC_POW2==2 ? 384 : 0), (MIN_BUC_POW2==2 ? 384 : 0), /* 4, 4 */
709       224, 149, 120, 80, 62, 41, 31, 25, 16, 16, 8, 8, 4, 4, 2, 2
710 #  endif
711   };
712
713 /* Shift of the first bucket with the given ordinal inside 2K chunk. */
714 #ifdef IGNORE_SMALL_BAD_FREE
715 #  define BLK_SHIFT(bucket) ( (bucket) < FIRST_BUCKET_WITH_CHECK        \
716                               ? ((1<<LOG_OF_MIN_ARENA)                  \
717                                  - BUCKET_SIZE(bucket) * N_BLKS(bucket)) \
718                               : blk_shift[bucket])
719 #else
720 #  define BLK_SHIFT(bucket) blk_shift[bucket]
721 #endif 
722
723 static u_short blk_shift[LOG_OF_MIN_ARENA * BUCKETS_PER_POW2] = 
724   { 
725 #  if BUCKETS_PER_POW2==1
726       0, 0,
727       (MIN_BUC_POW2==2 ? 512 : 0),
728       256, 128, 64, 64,                 /* 8 to 64 */
729       16*sizeof(union overhead), 
730       8*sizeof(union overhead), 
731       4*sizeof(union overhead), 
732       2*sizeof(union overhead), 
733 #  else
734       0, 0, 0, 0,
735       (MIN_BUC_POW2==2 ? 512 : 0), (MIN_BUC_POW2==2 ? 512 : 0),
736       256, 260, 128, 128, 64, 80, 64, 48, /* 8 to 96 */
737       16*sizeof(union overhead), 16*sizeof(union overhead), 
738       8*sizeof(union overhead), 8*sizeof(union overhead), 
739       4*sizeof(union overhead), 4*sizeof(union overhead), 
740       2*sizeof(union overhead), 2*sizeof(union overhead), 
741 #  endif 
742   };
743
744 #  define NEEDED_ALIGNMENT 0x800        /* 2k boundaries */
745 #  define WANTED_ALIGNMENT 0x800        /* 2k boundaries */
746
747 #else  /* !PACK_MALLOC */
748
749 #  define OV_MAGIC(block,bucket) (block)->ov_magic
750 #  define OV_INDEX(block) (block)->ov_index
751 #  define CHUNK_SHIFT 1
752 #  define MAX_PACKED -1
753 #  define NEEDED_ALIGNMENT MEM_ALIGNBYTES
754 #  define WANTED_ALIGNMENT 0x400        /* 1k boundaries */
755
756 #endif /* !PACK_MALLOC */
757
758 #define M_OVERHEAD (sizeof(union overhead) + RSLOP)
759
760 #ifdef PACK_MALLOC
761 #  define MEM_OVERHEAD(bucket) \
762   (bucket <= MAX_PACKED ? 0 : M_OVERHEAD)
763 #  ifdef SMALL_BUCKET_VIA_TABLE
764 #    define START_SHIFTS_BUCKET ((MAX_PACKED_POW2 + 1) * BUCKETS_PER_POW2)
765 #    define START_SHIFT MAX_PACKED_POW2
766 #    ifdef BUCKETS_ROOT2                /* Chunks of size 3*2^n. */
767 #      define SIZE_TABLE_MAX 80
768 #    else
769 #      define SIZE_TABLE_MAX 64
770 #    endif 
771 static char bucket_of[] =
772   {
773 #    ifdef BUCKETS_ROOT2                /* Chunks of size 3*2^n. */
774       /* 0 to 15 in 4-byte increments. */
775       (sizeof(void*) > 4 ? 6 : 5),      /* 4/8, 5-th bucket for better reports */
776       6,                                /* 8 */
777       IF_ALIGN_8(8,7), 8,               /* 16/12, 16 */
778       9, 9, 10, 10,                     /* 24, 32 */
779       11, 11, 11, 11,                   /* 48 */
780       12, 12, 12, 12,                   /* 64 */
781       13, 13, 13, 13,                   /* 80 */
782       13, 13, 13, 13                    /* 80 */
783 #    else /* !BUCKETS_ROOT2 */
784       /* 0 to 15 in 4-byte increments. */
785       (sizeof(void*) > 4 ? 3 : 2),
786       3, 
787       4, 4, 
788       5, 5, 5, 5,
789       6, 6, 6, 6,
790       6, 6, 6, 6
791 #    endif /* !BUCKETS_ROOT2 */
792   };
793 #  else  /* !SMALL_BUCKET_VIA_TABLE */
794 #    define START_SHIFTS_BUCKET MIN_BUCKET
795 #    define START_SHIFT (MIN_BUC_POW2 - 1)
796 #  endif /* !SMALL_BUCKET_VIA_TABLE */
797 #else  /* !PACK_MALLOC */
798 #  define MEM_OVERHEAD(bucket) M_OVERHEAD
799 #  ifdef SMALL_BUCKET_VIA_TABLE
800 #    undef SMALL_BUCKET_VIA_TABLE
801 #  endif 
802 #  define START_SHIFTS_BUCKET MIN_BUCKET
803 #  define START_SHIFT (MIN_BUC_POW2 - 1)
804 #endif /* !PACK_MALLOC */
805
806 /*
807  * Big allocations are often of the size 2^n bytes. To make them a
808  * little bit better, make blocks of size 2^n+pagesize for big n.
809  */
810
811 #ifdef TWO_POT_OPTIMIZE
812
813 #  ifndef PERL_PAGESIZE
814 #    define PERL_PAGESIZE 4096
815 #  endif 
816 #  ifndef FIRST_BIG_POW2
817 #    define FIRST_BIG_POW2 15   /* 32K, 16K is used too often. */
818 #  endif
819 #  define FIRST_BIG_BLOCK (1<<FIRST_BIG_POW2)
820 /* If this value or more, check against bigger blocks. */
821 #  define FIRST_BIG_BOUND (FIRST_BIG_BLOCK - M_OVERHEAD)
822 /* If less than this value, goes into 2^n-overhead-block. */
823 #  define LAST_SMALL_BOUND ((FIRST_BIG_BLOCK>>1) - M_OVERHEAD)
824
825 #  define POW2_OPTIMIZE_ADJUST(nbytes)                          \
826    ((nbytes >= FIRST_BIG_BOUND) ? nbytes -= PERL_PAGESIZE : 0)
827 #  define POW2_OPTIMIZE_SURPLUS(bucket)                         \
828    ((bucket >= FIRST_BIG_POW2 * BUCKETS_PER_POW2) ? PERL_PAGESIZE : 0)
829
830 #else  /* !TWO_POT_OPTIMIZE */
831 #  define POW2_OPTIMIZE_ADJUST(nbytes)
832 #  define POW2_OPTIMIZE_SURPLUS(bucket) 0
833 #endif /* !TWO_POT_OPTIMIZE */
834
835 #if defined(HAS_64K_LIMIT) && defined(PERL_CORE)
836 #  define BARK_64K_LIMIT(what,nbytes,size)                              \
837         if (nbytes > 0xffff) {                                          \
838                 PerlIO_printf(PerlIO_stderr(),                          \
839                               "%s too large: %lx\n", what, size);       \
840                 my_exit(1);                                             \
841         }
842 #else /* !HAS_64K_LIMIT || !PERL_CORE */
843 #  define BARK_64K_LIMIT(what,nbytes,size)
844 #endif /* !HAS_64K_LIMIT || !PERL_CORE */
845
846 #ifndef MIN_SBRK
847 #  define MIN_SBRK 2048
848 #endif 
849
850 #ifndef FIRST_SBRK
851 #  define FIRST_SBRK (48*1024)
852 #endif 
853
854 /* Minimal sbrk in percents of what is already alloced. */
855 #ifndef MIN_SBRK_FRAC
856 #  define MIN_SBRK_FRAC 3
857 #endif 
858
859 #ifndef SBRK_ALLOW_FAILURES
860 #  define SBRK_ALLOW_FAILURES 3
861 #endif 
862
863 #ifndef SBRK_FAILURE_PRICE
864 #  define SBRK_FAILURE_PRICE 50
865 #endif 
866
867 static void     morecore        (register int bucket);
868 #  if defined(DEBUGGING)
869 static void     botch           (char *diag, char *s);
870 #  endif
871 static void     add_to_chain    (void *p, MEM_SIZE size, MEM_SIZE chip);
872 static void*    get_from_chain  (MEM_SIZE size);
873 static void*    get_from_bigger_buckets(int bucket, MEM_SIZE size);
874 static union overhead *getpages (MEM_SIZE needed, int *nblksp, int bucket);
875 static int      getpages_adjacent(MEM_SIZE require);
876
877 #ifdef PERL_CORE
878
879 #ifdef I_MACH_CTHREADS
880 #  undef  MUTEX_LOCK
881 #  define MUTEX_LOCK(m)   STMT_START { if (*m) mutex_lock(*m);   } STMT_END
882 #  undef  MUTEX_UNLOCK
883 #  define MUTEX_UNLOCK(m) STMT_START { if (*m) mutex_unlock(*m); } STMT_END
884 #endif
885
886 #ifndef BITS_IN_PTR
887 #  define BITS_IN_PTR (8*PTRSIZE)
888 #endif
889
890 /*
891  * nextf[i] is the pointer to the next free block of size 2^i.  The
892  * smallest allocatable block is 8 bytes.  The overhead information
893  * precedes the data area returned to the user.
894  */
895 #define NBUCKETS (BITS_IN_PTR*BUCKETS_PER_POW2 + 1)
896 static  union overhead *nextf[NBUCKETS];
897
898 #if defined(PURIFY) && !defined(USE_PERL_SBRK)
899 #  define USE_PERL_SBRK
900 #endif
901
902 #ifdef USE_PERL_SBRK
903 # define sbrk(a) Perl_sbrk(a)
904 Malloc_t Perl_sbrk (int size);
905 #else
906 # ifndef HAS_SBRK_PROTO /* <unistd.h> usually takes care of this */
907 extern  Malloc_t sbrk(int);
908 # endif
909 #endif
910
911 #ifdef DEBUGGING_MSTATS
912 /*
913  * nmalloc[i] is the difference between the number of mallocs and frees
914  * for a given block size.
915  */
916 static  u_int nmalloc[NBUCKETS];
917 static  u_int sbrk_slack;
918 static  u_int start_slack;
919 #else   /* !( defined DEBUGGING_MSTATS ) */
920 #  define sbrk_slack    0
921 #endif
922
923 static  u_int goodsbrk;
924
925 # ifdef PERL_EMERGENCY_SBRK
926
927 #  ifndef BIG_SIZE
928 #    define BIG_SIZE (1<<16)            /* 64K */
929 #  endif
930
931 static char *emergency_buffer;
932 static MEM_SIZE emergency_buffer_size;
933 static MEM_SIZE no_mem; /* 0 if the last request for more memory succeeded.
934                            Otherwise the size of the failing request. */
935
936 static Malloc_t
937 emergency_sbrk(MEM_SIZE size)
938 {
939     MEM_SIZE rsize = (((size - 1)>>LOG_OF_MIN_ARENA) + 1)<<LOG_OF_MIN_ARENA;
940
941     if (size >= BIG_SIZE && (!no_mem || (size < no_mem))) {
942         /* Give the possibility to recover, but avoid an infinite cycle. */
943         MALLOC_UNLOCK;
944         no_mem = size;
945         croak2("Out of memory during \"large\" request for %"UVuf" bytes, total sbrk() is %"UVuf" bytes", (UV)size, (UV)(goodsbrk + sbrk_slack));
946     }
947
948     if (emergency_buffer_size >= rsize) {
949         char *old = emergency_buffer;
950         
951         emergency_buffer_size -= rsize;
952         emergency_buffer += rsize;
953         return old;
954     } else {            
955         dTHX;
956         /* First offense, give a possibility to recover by dieing. */
957         /* No malloc involved here: */
958         GV **gvp = (GV**)hv_fetch(PL_defstash, "^M", 2, 0);
959         SV *sv;
960         char *pv;
961         int have = 0;
962         STRLEN n_a;
963
964         if (emergency_buffer_size) {
965             add_to_chain(emergency_buffer, emergency_buffer_size, 0);
966             emergency_buffer_size = 0;
967             emergency_buffer = Nullch;
968             have = 1;
969         }
970         if (!gvp) gvp = (GV**)hv_fetch(PL_defstash, "\015", 1, 0);
971         if (!gvp || !(sv = GvSV(*gvp)) || !SvPOK(sv) 
972             || (SvLEN(sv) < (1<<LOG_OF_MIN_ARENA) - M_OVERHEAD)) {
973             if (have)
974                 goto do_croak;
975             return (char *)-1;          /* Now die die die... */
976         }
977         /* Got it, now detach SvPV: */
978         pv = SvPV(sv, n_a);
979         /* Check alignment: */
980         if ((PTR2UV(pv) - sizeof(union overhead)) & (NEEDED_ALIGNMENT - 1)) {
981             PerlIO_puts(PerlIO_stderr(),"Bad alignment of $^M!\n");
982             return (char *)-1;          /* die die die */
983         }
984
985         emergency_buffer = pv - sizeof(union overhead);
986         emergency_buffer_size = malloced_size(pv) + M_OVERHEAD;
987         SvPOK_off(sv);
988         SvPVX(sv) = Nullch;
989         SvCUR(sv) = SvLEN(sv) = 0;
990     }
991   do_croak:
992     MALLOC_UNLOCK;
993     croak("Out of memory during request for %"UVuf" bytes, total sbrk() is %"UVuf" bytes", (UV)size, (UV)(goodsbrk + sbrk_slack));
994     /* NOTREACHED */
995     return Nullch;
996 }
997
998 # else /*  !defined(PERL_EMERGENCY_SBRK) */
999 #  define emergency_sbrk(size)  -1
1000 # endif
1001 #endif /* ifdef PERL_CORE */
1002
1003 #ifdef DEBUGGING
1004 #undef ASSERT
1005 #define ASSERT(p,diag)   if (!(p)) botch(diag,STRINGIFY(p));  else
1006 static void
1007 botch(char *diag, char *s)
1008 {
1009         dTHX;
1010         PerlIO_printf(PerlIO_stderr(), "assertion botched (%s?): %s\n", diag, s);
1011         PerlProc_abort();
1012 }
1013 #else
1014 #define ASSERT(p, diag)
1015 #endif
1016
1017 Malloc_t
1018 Perl_malloc(register size_t nbytes)
1019 {
1020         register union overhead *p;
1021         register int bucket;
1022         register MEM_SIZE shiftr;
1023
1024 #if defined(DEBUGGING) || defined(RCHECK)
1025         MEM_SIZE size = nbytes;
1026 #endif
1027
1028         BARK_64K_LIMIT("Allocation",nbytes,nbytes);
1029 #ifdef DEBUGGING
1030         if ((long)nbytes < 0)
1031             croak("%s", "panic: malloc");
1032 #endif
1033
1034         /*
1035          * Convert amount of memory requested into
1036          * closest block size stored in hash buckets
1037          * which satisfies request.  Account for
1038          * space used per block for accounting.
1039          */
1040 #ifdef PACK_MALLOC
1041 #  ifdef SMALL_BUCKET_VIA_TABLE
1042         if (nbytes == 0)
1043             bucket = MIN_BUCKET;
1044         else if (nbytes <= SIZE_TABLE_MAX) {
1045             bucket = bucket_of[(nbytes - 1) >> BUCKET_TABLE_SHIFT];
1046         } else
1047 #  else
1048         if (nbytes == 0)
1049             nbytes = 1;
1050         if (nbytes <= MAX_POW2_ALGO) goto do_shifts;
1051         else
1052 #  endif
1053 #endif 
1054         {
1055             POW2_OPTIMIZE_ADJUST(nbytes);
1056             nbytes += M_OVERHEAD;
1057             nbytes = (nbytes + 3) &~ 3; 
1058 #if defined(PACK_MALLOC) && !defined(SMALL_BUCKET_VIA_TABLE)
1059           do_shifts:
1060 #endif
1061             shiftr = (nbytes - 1) >> START_SHIFT;
1062             bucket = START_SHIFTS_BUCKET;
1063             /* apart from this loop, this is O(1) */
1064             while (shiftr >>= 1)
1065                 bucket += BUCKETS_PER_POW2;
1066         }
1067         MALLOC_LOCK;
1068         /*
1069          * If nothing in hash bucket right now,
1070          * request more memory from the system.
1071          */
1072         if (nextf[bucket] == NULL)    
1073                 morecore(bucket);
1074         if ((p = nextf[bucket]) == NULL) {
1075                 MALLOC_UNLOCK;
1076 #ifdef PERL_CORE
1077                 {
1078                     dTHX;
1079                     if (!PL_nomemok) {
1080 #if defined(PLAIN_MALLOC) && defined(NO_FANCY_MALLOC)
1081                         PerlIO_puts(PerlIO_stderr(),"Out of memory!\n");
1082 #else
1083                         char buff[80];
1084                         char *eb = buff + sizeof(buff) - 1;
1085                         char *s = eb;
1086                         size_t n = nbytes;
1087
1088                         PerlIO_puts(PerlIO_stderr(),"Out of memory during request for ");
1089 #if defined(DEBUGGING) || defined(RCHECK)
1090                         n = size;
1091 #endif
1092                         *s = 0;                 
1093                         do {
1094                             *--s = '0' + (n % 10);
1095                         } while (n /= 10);
1096                         PerlIO_puts(PerlIO_stderr(),s);
1097                         PerlIO_puts(PerlIO_stderr()," bytes, total sbrk() is ");
1098                         s = eb;
1099                         n = goodsbrk + sbrk_slack;
1100                         do {
1101                             *--s = '0' + (n % 10);
1102                         } while (n /= 10);
1103                         PerlIO_puts(PerlIO_stderr(),s);
1104                         PerlIO_puts(PerlIO_stderr()," bytes!\n");
1105 #endif /* defined(PLAIN_MALLOC) && defined(NO_FANCY_MALLOC) */
1106                         my_exit(1);
1107                     }
1108                 }
1109 #endif
1110                 return (NULL);
1111         }
1112
1113         /* remove from linked list */
1114 #if defined(RCHECK)
1115         if ((PTR2UV(p)) & (MEM_ALIGNBYTES - 1)) {
1116             dTHX;
1117             PerlIO_printf(PerlIO_stderr(),
1118                           "Unaligned pointer in the free chain 0x%"UVxf"\n",
1119                           PTR2UV(p));
1120         }
1121         if ((PTR2UV(p->ov_next)) & (MEM_ALIGNBYTES - 1)) {
1122             dTHX;
1123             PerlIO_printf(PerlIO_stderr(),
1124                           "Unaligned `next' pointer in the free "
1125                           "chain 0x%"UVxf" at 0x%"UVxf"\n",
1126                           PTR2UV(p->ov_next), PTR2UV(p));
1127         }
1128 #endif
1129         nextf[bucket] = p->ov_next;
1130
1131         MALLOC_UNLOCK;
1132
1133         DEBUG_m(PerlIO_printf(Perl_debug_log,
1134                               "0x%"UVxf": (%05lu) malloc %ld bytes\n",
1135                               PTR2UV((Malloc_t)(p + CHUNK_SHIFT)), (unsigned long)(PL_an++),
1136                               (long)size));
1137
1138 #ifdef IGNORE_SMALL_BAD_FREE
1139         if (bucket >= FIRST_BUCKET_WITH_CHECK)
1140 #endif 
1141             OV_MAGIC(p, bucket) = MAGIC;
1142 #ifndef PACK_MALLOC
1143         OV_INDEX(p) = bucket;
1144 #endif
1145 #ifdef RCHECK
1146         /*
1147          * Record allocated size of block and
1148          * bound space with magic numbers.
1149          */
1150         p->ov_rmagic = RMAGIC;
1151         if (bucket <= MAX_SHORT_BUCKET) {
1152             int i;
1153             
1154             nbytes = size + M_OVERHEAD; 
1155             p->ov_size = nbytes - 1;
1156             if ((i = nbytes & 3)) {
1157                 i = 4 - i;
1158                 while (i--)
1159                     *((char *)((caddr_t)p + nbytes - RSLOP + i)) = RMAGIC_C;
1160             }
1161             nbytes = (nbytes + 3) &~ 3; 
1162             *((u_int *)((caddr_t)p + nbytes - RSLOP)) = RMAGIC;
1163         }
1164 #endif
1165         return ((Malloc_t)(p + CHUNK_SHIFT));
1166 }
1167
1168 static char *last_sbrk_top;
1169 static char *last_op;                   /* This arena can be easily extended. */
1170 static MEM_SIZE sbrked_remains;
1171 static int sbrk_good = SBRK_ALLOW_FAILURES * SBRK_FAILURE_PRICE;
1172
1173 #ifdef DEBUGGING_MSTATS
1174 static int sbrks;
1175 #endif 
1176
1177 struct chunk_chain_s {
1178     struct chunk_chain_s *next;
1179     MEM_SIZE size;
1180 };
1181 static struct chunk_chain_s *chunk_chain;
1182 static int n_chunks;
1183 static char max_bucket;
1184
1185 /* Cutoff a piece of one of the chunks in the chain.  Prefer smaller chunk. */
1186 static void *
1187 get_from_chain(MEM_SIZE size)
1188 {
1189     struct chunk_chain_s *elt = chunk_chain, **oldp = &chunk_chain;
1190     struct chunk_chain_s **oldgoodp = NULL;
1191     long min_remain = LONG_MAX;
1192
1193     while (elt) {
1194         if (elt->size >= size) {
1195             long remains = elt->size - size;
1196             if (remains >= 0 && remains < min_remain) {
1197                 oldgoodp = oldp;
1198                 min_remain = remains;
1199             }
1200             if (remains == 0) {
1201                 break;
1202             }
1203         }
1204         oldp = &( elt->next );
1205         elt = elt->next;
1206     }
1207     if (!oldgoodp) return NULL;
1208     if (min_remain) {
1209         void *ret = *oldgoodp;
1210         struct chunk_chain_s *next = (*oldgoodp)->next;
1211         
1212         *oldgoodp = (struct chunk_chain_s *)((char*)ret + size);
1213         (*oldgoodp)->size = min_remain;
1214         (*oldgoodp)->next = next;
1215         return ret;
1216     } else {
1217         void *ret = *oldgoodp;
1218         *oldgoodp = (*oldgoodp)->next;
1219         n_chunks--;
1220         return ret;
1221     }
1222 }
1223
1224 static void
1225 add_to_chain(void *p, MEM_SIZE size, MEM_SIZE chip)
1226 {
1227     struct chunk_chain_s *next = chunk_chain;
1228     char *cp = (char*)p;
1229     
1230     cp += chip;
1231     chunk_chain = (struct chunk_chain_s *)cp;
1232     chunk_chain->size = size - chip;
1233     chunk_chain->next = next;
1234     n_chunks++;
1235 }
1236
1237 static void *
1238 get_from_bigger_buckets(int bucket, MEM_SIZE size)
1239 {
1240     int price = 1;
1241     static int bucketprice[NBUCKETS];
1242     while (bucket <= max_bucket) {
1243         /* We postpone stealing from bigger buckets until we want it
1244            often enough. */
1245         if (nextf[bucket] && bucketprice[bucket]++ >= price) {
1246             /* Steal it! */
1247             void *ret = (void*)(nextf[bucket] - 1 + CHUNK_SHIFT);
1248             bucketprice[bucket] = 0;
1249             if (((char*)nextf[bucket]) - M_OVERHEAD == last_op) {
1250                 last_op = NULL;         /* Disable optimization */
1251             }
1252             nextf[bucket] = nextf[bucket]->ov_next;
1253 #ifdef DEBUGGING_MSTATS
1254             nmalloc[bucket]--;
1255             start_slack -= M_OVERHEAD;
1256 #endif 
1257             add_to_chain(ret, (BUCKET_SIZE(bucket) +
1258                                POW2_OPTIMIZE_SURPLUS(bucket)), 
1259                          size);
1260             return ret;
1261         }
1262         bucket++;
1263     }
1264     return NULL;
1265 }
1266
1267 static union overhead *
1268 getpages(MEM_SIZE needed, int *nblksp, int bucket)
1269 {
1270     /* Need to do (possibly expensive) system call. Try to
1271        optimize it for rare calling. */
1272     MEM_SIZE require = needed - sbrked_remains;
1273     char *cp;
1274     union overhead *ovp;
1275     MEM_SIZE slack = 0;
1276
1277     if (sbrk_good > 0) {
1278         if (!last_sbrk_top && require < FIRST_SBRK) 
1279             require = FIRST_SBRK;
1280         else if (require < MIN_SBRK) require = MIN_SBRK;
1281
1282         if (require < goodsbrk * MIN_SBRK_FRAC / 100)
1283             require = goodsbrk * MIN_SBRK_FRAC / 100;
1284         require = ((require - 1 + MIN_SBRK) / MIN_SBRK) * MIN_SBRK;
1285     } else {
1286         require = needed;
1287         last_sbrk_top = 0;
1288         sbrked_remains = 0;
1289     }
1290
1291     DEBUG_m(PerlIO_printf(Perl_debug_log, 
1292                           "sbrk(%ld) for %ld-byte-long arena\n",
1293                           (long)require, (long) needed));
1294     cp = (char *)sbrk(require);
1295 #ifdef DEBUGGING_MSTATS
1296     sbrks++;
1297 #endif 
1298     if (cp == last_sbrk_top) {
1299         /* Common case, anything is fine. */
1300         sbrk_good++;
1301         ovp = (union overhead *) (cp - sbrked_remains);
1302         last_op = cp - sbrked_remains;
1303         sbrked_remains = require - (needed - sbrked_remains);
1304     } else if (cp == (char *)-1) { /* no more room! */
1305         ovp = (union overhead *)emergency_sbrk(needed);
1306         if (ovp == (union overhead *)-1)
1307             return 0;
1308         if (((char*)ovp) > last_op) {   /* Cannot happen with current emergency_sbrk() */
1309             last_op = 0;
1310         }
1311         return ovp;
1312     } else {                    /* Non-continuous or first sbrk(). */
1313         long add = sbrked_remains;
1314         char *newcp;
1315
1316         if (sbrked_remains) {   /* Put rest into chain, we
1317                                    cannot use it right now. */
1318             add_to_chain((void*)(last_sbrk_top - sbrked_remains),
1319                          sbrked_remains, 0);
1320         }
1321
1322         /* Second, check alignment. */
1323         slack = 0;
1324
1325 #if !defined(atarist) && !defined(__MINT__) /* on the atari we dont have to worry about this */
1326 #  ifndef I286  /* The sbrk(0) call on the I286 always returns the next segment */
1327         /* WANTED_ALIGNMENT may be more than NEEDED_ALIGNMENT, but this may
1328            improve performance of memory access. */
1329         if (PTR2UV(cp) & (WANTED_ALIGNMENT - 1)) { /* Not aligned. */
1330             slack = WANTED_ALIGNMENT - (PTR2UV(cp) & (WANTED_ALIGNMENT - 1));
1331             add += slack;
1332         }
1333 #  endif
1334 #endif /* !atarist && !MINT */
1335                 
1336         if (add) {
1337             DEBUG_m(PerlIO_printf(Perl_debug_log, 
1338                                   "sbrk(%ld) to fix non-continuous/off-page sbrk:\n\t%ld for alignement,\t%ld were assumed to come from the tail of the previous sbrk\n",
1339                                   (long)add, (long) slack,
1340                                   (long) sbrked_remains));
1341             newcp = (char *)sbrk(add);
1342 #if defined(DEBUGGING_MSTATS)
1343             sbrks++;
1344             sbrk_slack += add;
1345 #endif
1346             if (newcp != cp + require) {
1347                 /* Too bad: even rounding sbrk() is not continuous.*/
1348                 DEBUG_m(PerlIO_printf(Perl_debug_log, 
1349                                       "failed to fix bad sbrk()\n"));
1350 #ifdef PACK_MALLOC
1351                 if (slack) {
1352                     MALLOC_UNLOCK;
1353                     fatalcroak("panic: Off-page sbrk\n");
1354                 }
1355 #endif
1356                 if (sbrked_remains) {
1357                     /* Try again. */
1358 #if defined(DEBUGGING_MSTATS)
1359                     sbrk_slack += require;
1360 #endif
1361                     require = needed;
1362                     DEBUG_m(PerlIO_printf(Perl_debug_log, 
1363                                           "straight sbrk(%ld)\n",
1364                                           (long)require));
1365                     cp = (char *)sbrk(require);
1366 #ifdef DEBUGGING_MSTATS
1367                     sbrks++;
1368 #endif 
1369                     if (cp == (char *)-1)
1370                         return 0;
1371                 }
1372                 sbrk_good = -1; /* Disable optimization!
1373                                    Continue with not-aligned... */
1374             } else {
1375                 cp += slack;
1376                 require += sbrked_remains;
1377             }
1378         }
1379
1380         if (last_sbrk_top) {
1381             sbrk_good -= SBRK_FAILURE_PRICE;
1382         }
1383
1384         ovp = (union overhead *) cp;
1385         /*
1386          * Round up to minimum allocation size boundary
1387          * and deduct from block count to reflect.
1388          */
1389
1390 #  if NEEDED_ALIGNMENT > MEM_ALIGNBYTES
1391         if (PTR2UV(ovp) & (NEEDED_ALIGNMENT - 1))
1392             fatalcroak("Misalignment of sbrk()\n");
1393         else
1394 #  endif
1395 #ifndef I286    /* Again, this should always be ok on an 80286 */
1396         if (PTR2UV(ovp) & (MEM_ALIGNBYTES - 1)) {
1397             DEBUG_m(PerlIO_printf(Perl_debug_log, 
1398                                   "fixing sbrk(): %d bytes off machine alignement\n",
1399                                   (int)(PTR2UV(ovp) & (MEM_ALIGNBYTES - 1))));
1400             ovp = INT2PTR(union overhead *,(PTR2UV(ovp) + MEM_ALIGNBYTES) &
1401                                      (MEM_ALIGNBYTES - 1));
1402             (*nblksp)--;
1403 # if defined(DEBUGGING_MSTATS)
1404             /* This is only approx. if TWO_POT_OPTIMIZE: */
1405             sbrk_slack += (1 << (bucket >> BUCKET_POW2_SHIFT));
1406 # endif
1407         }
1408 #endif
1409         ;                               /* Finish `else' */
1410         sbrked_remains = require - needed;
1411         last_op = cp;
1412     }
1413 #if !defined(PLAIN_MALLOC) && !defined(NO_FANCY_MALLOC)
1414     no_mem = 0;
1415 #endif
1416     last_sbrk_top = cp + require;
1417 #ifdef DEBUGGING_MSTATS
1418     goodsbrk += require;
1419 #endif  
1420     return ovp;
1421 }
1422
1423 static int
1424 getpages_adjacent(MEM_SIZE require)
1425 {           
1426     if (require <= sbrked_remains) {
1427         sbrked_remains -= require;
1428     } else {
1429         char *cp;
1430
1431         require -= sbrked_remains;
1432         /* We do not try to optimize sbrks here, we go for place. */
1433         cp = (char*) sbrk(require);
1434 #ifdef DEBUGGING_MSTATS
1435         sbrks++;
1436         goodsbrk += require;
1437 #endif 
1438         if (cp == last_sbrk_top) {
1439             sbrked_remains = 0;
1440             last_sbrk_top = cp + require;
1441         } else {
1442             if (cp == (char*)-1) {      /* Out of memory */
1443 #ifdef DEBUGGING_MSTATS
1444                 goodsbrk -= require;
1445 #endif
1446                 return 0;
1447             }
1448             /* Report the failure: */
1449             if (sbrked_remains)
1450                 add_to_chain((void*)(last_sbrk_top - sbrked_remains),
1451                              sbrked_remains, 0);
1452             add_to_chain((void*)cp, require, 0);
1453             sbrk_good -= SBRK_FAILURE_PRICE;
1454             sbrked_remains = 0;
1455             last_sbrk_top = 0;
1456             last_op = 0;
1457             return 0;
1458         }
1459     }
1460             
1461     return 1;
1462 }
1463
1464 /*
1465  * Allocate more memory to the indicated bucket.
1466  */
1467 static void
1468 morecore(register int bucket)
1469 {
1470         register union overhead *ovp;
1471         register int rnu;       /* 2^rnu bytes will be requested */
1472         int nblks;              /* become nblks blocks of the desired size */
1473         register MEM_SIZE siz, needed;
1474
1475         if (nextf[bucket])
1476                 return;
1477         if (bucket == sizeof(MEM_SIZE)*8*BUCKETS_PER_POW2) {
1478             MALLOC_UNLOCK;
1479             croak("%s", "Out of memory during ridiculously large request");
1480         }
1481         if (bucket > max_bucket)
1482             max_bucket = bucket;
1483
1484         rnu = ( (bucket <= (LOG_OF_MIN_ARENA << BUCKET_POW2_SHIFT)) 
1485                 ? LOG_OF_MIN_ARENA 
1486                 : (bucket >> BUCKET_POW2_SHIFT) );
1487         /* This may be overwritten later: */
1488         nblks = 1 << (rnu - (bucket >> BUCKET_POW2_SHIFT)); /* how many blocks to get */
1489         needed = ((MEM_SIZE)1 << rnu) + POW2_OPTIMIZE_SURPLUS(bucket);
1490         if (nextf[rnu << BUCKET_POW2_SHIFT]) { /* 2048b bucket. */
1491             ovp = nextf[rnu << BUCKET_POW2_SHIFT] - 1 + CHUNK_SHIFT;
1492             nextf[rnu << BUCKET_POW2_SHIFT]
1493                 = nextf[rnu << BUCKET_POW2_SHIFT]->ov_next;
1494 #ifdef DEBUGGING_MSTATS
1495             nmalloc[rnu << BUCKET_POW2_SHIFT]--;
1496             start_slack -= M_OVERHEAD;
1497 #endif 
1498             DEBUG_m(PerlIO_printf(Perl_debug_log, 
1499                                   "stealing %ld bytes from %ld arena\n",
1500                                   (long) needed, (long) rnu << BUCKET_POW2_SHIFT));
1501         } else if (chunk_chain 
1502                    && (ovp = (union overhead*) get_from_chain(needed))) {
1503             DEBUG_m(PerlIO_printf(Perl_debug_log, 
1504                                   "stealing %ld bytes from chain\n",
1505                                   (long) needed));
1506         } else if ( (ovp = (union overhead*)
1507                      get_from_bigger_buckets((rnu << BUCKET_POW2_SHIFT) + 1,
1508                                              needed)) ) {
1509             DEBUG_m(PerlIO_printf(Perl_debug_log, 
1510                                   "stealing %ld bytes from bigger buckets\n",
1511                                   (long) needed));
1512         } else if (needed <= sbrked_remains) {
1513             ovp = (union overhead *)(last_sbrk_top - sbrked_remains);
1514             sbrked_remains -= needed;
1515             last_op = (char*)ovp;
1516         } else 
1517             ovp = getpages(needed, &nblks, bucket);
1518
1519         if (!ovp)
1520             return;
1521
1522         /*
1523          * Add new memory allocated to that on
1524          * free list for this hash bucket.
1525          */
1526         siz = BUCKET_SIZE(bucket);
1527 #ifdef PACK_MALLOC
1528         *(u_char*)ovp = bucket; /* Fill index. */
1529         if (bucket <= MAX_PACKED) {
1530             ovp = (union overhead *) ((char*)ovp + BLK_SHIFT(bucket));
1531             nblks = N_BLKS(bucket);
1532 #  ifdef DEBUGGING_MSTATS
1533             start_slack += BLK_SHIFT(bucket);
1534 #  endif
1535         } else if (bucket < LOG_OF_MIN_ARENA * BUCKETS_PER_POW2) {
1536             ovp = (union overhead *) ((char*)ovp + BLK_SHIFT(bucket));
1537             siz -= sizeof(union overhead);
1538         } else ovp++;           /* One chunk per block. */
1539 #endif /* PACK_MALLOC */
1540         nextf[bucket] = ovp;
1541 #ifdef DEBUGGING_MSTATS
1542         nmalloc[bucket] += nblks;
1543         if (bucket > MAX_PACKED) {
1544             start_slack += M_OVERHEAD * nblks;
1545         }
1546 #endif 
1547         while (--nblks > 0) {
1548                 ovp->ov_next = (union overhead *)((caddr_t)ovp + siz);
1549                 ovp = (union overhead *)((caddr_t)ovp + siz);
1550         }
1551         /* Not all sbrks return zeroed memory.*/
1552         ovp->ov_next = (union overhead *)NULL;
1553 #ifdef PACK_MALLOC
1554         if (bucket == 7*BUCKETS_PER_POW2) { /* Special case, explanation is above. */
1555             union overhead *n_op = nextf[7*BUCKETS_PER_POW2]->ov_next;
1556             nextf[7*BUCKETS_PER_POW2] = 
1557                 (union overhead *)((caddr_t)nextf[7*BUCKETS_PER_POW2] 
1558                                    - sizeof(union overhead));
1559             nextf[7*BUCKETS_PER_POW2]->ov_next = n_op;
1560         }
1561 #endif /* !PACK_MALLOC */
1562 }
1563
1564 Free_t
1565 Perl_mfree(void *mp)
1566 {
1567         register MEM_SIZE size;
1568         register union overhead *ovp;
1569         char *cp = (char*)mp;
1570 #ifdef PACK_MALLOC
1571         u_char bucket;
1572 #endif 
1573
1574         DEBUG_m(PerlIO_printf(Perl_debug_log, 
1575                               "0x%"UVxf": (%05lu) free\n",
1576                               PTR2UV(cp), (unsigned long)(PL_an++)));
1577
1578         if (cp == NULL)
1579                 return;
1580         ovp = (union overhead *)((caddr_t)cp 
1581                                 - sizeof (union overhead) * CHUNK_SHIFT);
1582 #ifdef PACK_MALLOC
1583         bucket = OV_INDEX(ovp);
1584 #endif 
1585 #ifdef IGNORE_SMALL_BAD_FREE
1586         if ((bucket >= FIRST_BUCKET_WITH_CHECK) 
1587             && (OV_MAGIC(ovp, bucket) != MAGIC))
1588 #else
1589         if (OV_MAGIC(ovp, bucket) != MAGIC)
1590 #endif 
1591             {
1592                 static int bad_free_warn = -1;
1593                 if (bad_free_warn == -1) {
1594                     dTHX;
1595                     char *pbf = PerlEnv_getenv("PERL_BADFREE");
1596                     bad_free_warn = (pbf) ? atoi(pbf) : 1;
1597                 }
1598                 if (!bad_free_warn)
1599                     return;
1600 #ifdef RCHECK
1601 #ifdef PERL_CORE
1602                 {
1603                     dTHX;
1604                     if (!PERL_IS_ALIVE || !PL_curcop || ckWARN_d(WARN_MALLOC))
1605                         Perl_warner(aTHX_ packWARN(WARN_MALLOC), "%s free() ignored (RMAGIC, PERL_CORE)",
1606                                     ovp->ov_rmagic == RMAGIC - 1 ?
1607                                     "Duplicate" : "Bad");
1608                 }
1609 #else
1610                 warn("%s free() ignored (RMAGIC)",
1611                     ovp->ov_rmagic == RMAGIC - 1 ? "Duplicate" : "Bad");
1612 #endif          
1613 #else
1614 #ifdef PERL_CORE
1615                 {
1616                     dTHX;
1617                     if (!PERL_IS_ALIVE || !PL_curcop || ckWARN_d(WARN_MALLOC))
1618                         Perl_warner(aTHX_ packWARN(WARN_MALLOC), "%s", "Bad free() ignored (PERL_CORE)");
1619                 }
1620 #else
1621                 warn("%s", "Bad free() ignored");
1622 #endif
1623 #endif
1624                 return;                         /* sanity */
1625             }
1626 #ifdef RCHECK
1627         ASSERT(ovp->ov_rmagic == RMAGIC, "chunk's head overwrite");
1628         if (OV_INDEX(ovp) <= MAX_SHORT_BUCKET) {
1629             int i;
1630             MEM_SIZE nbytes = ovp->ov_size + 1;
1631
1632             if ((i = nbytes & 3)) {
1633                 i = 4 - i;
1634                 while (i--) {
1635                     ASSERT(*((char *)((caddr_t)ovp + nbytes - RSLOP + i))
1636                            == RMAGIC_C, "chunk's tail overwrite");
1637                 }
1638             }
1639             nbytes = (nbytes + 3) &~ 3; 
1640             ASSERT(*(u_int *)((caddr_t)ovp + nbytes - RSLOP) == RMAGIC, "chunk's tail overwrite");          
1641         }
1642         ovp->ov_rmagic = RMAGIC - 1;
1643 #endif
1644         ASSERT(OV_INDEX(ovp) < NBUCKETS, "chunk's head overwrite");
1645         size = OV_INDEX(ovp);
1646
1647         MALLOC_LOCK;
1648         ovp->ov_next = nextf[size];
1649         nextf[size] = ovp;
1650         MALLOC_UNLOCK;
1651 }
1652
1653 /* There is no need to do any locking in realloc (with an exception of
1654    trying to grow in place if we are at the end of the chain).
1655    If somebody calls us from a different thread with the same address,
1656    we are sole anyway.  */
1657
1658 Malloc_t
1659 Perl_realloc(void *mp, size_t nbytes)
1660 {
1661         register MEM_SIZE onb;
1662         union overhead *ovp;
1663         char *res;
1664         int prev_bucket;
1665         register int bucket;
1666         int incr;               /* 1 if does not fit, -1 if "easily" fits in a
1667                                    smaller bucket, otherwise 0.  */
1668         char *cp = (char*)mp;
1669
1670 #if defined(DEBUGGING) || !defined(PERL_CORE)
1671         MEM_SIZE size = nbytes;
1672
1673         if ((long)nbytes < 0)
1674             croak("%s", "panic: realloc");
1675 #endif
1676
1677         BARK_64K_LIMIT("Reallocation",nbytes,size);
1678         if (!cp)
1679                 return Perl_malloc(nbytes);
1680
1681         ovp = (union overhead *)((caddr_t)cp 
1682                                 - sizeof (union overhead) * CHUNK_SHIFT);
1683         bucket = OV_INDEX(ovp);
1684
1685 #ifdef IGNORE_SMALL_BAD_FREE
1686         if ((bucket >= FIRST_BUCKET_WITH_CHECK) 
1687             && (OV_MAGIC(ovp, bucket) != MAGIC))
1688 #else
1689         if (OV_MAGIC(ovp, bucket) != MAGIC)
1690 #endif 
1691             {
1692                 static int bad_free_warn = -1;
1693                 if (bad_free_warn == -1) {
1694                     dTHX;
1695                     char *pbf = PerlEnv_getenv("PERL_BADFREE");
1696                     bad_free_warn = (pbf) ? atoi(pbf) : 1;
1697                 }
1698                 if (!bad_free_warn)
1699                     return Nullch;
1700 #ifdef RCHECK
1701 #ifdef PERL_CORE
1702                 {
1703                     dTHX;
1704                     if (!PERL_IS_ALIVE || !PL_curcop || ckWARN_d(WARN_MALLOC))
1705                         Perl_warner(aTHX_ packWARN(WARN_MALLOC), "%srealloc() %signored",
1706                                     (ovp->ov_rmagic == RMAGIC - 1 ? "" : "Bad "),
1707                                     ovp->ov_rmagic == RMAGIC - 1
1708                                     ? "of freed memory " : "");
1709                 }
1710 #else
1711                 warn("%srealloc() %signored",
1712                     (ovp->ov_rmagic == RMAGIC - 1 ? "" : "Bad "),
1713                      ovp->ov_rmagic == RMAGIC - 1 ? "of freed memory " : "");
1714 #endif
1715 #else
1716 #ifdef PERL_CORE
1717                 {
1718                     dTHX;
1719                     if (!PERL_IS_ALIVE || !PL_curcop || ckWARN_d(WARN_MALLOC))
1720                         Perl_warner(aTHX_ packWARN(WARN_MALLOC), "%s",
1721                                     "Bad realloc() ignored");
1722                 }
1723 #else
1724                 warn("%s", "Bad realloc() ignored");
1725 #endif
1726 #endif
1727                 return Nullch;                  /* sanity */
1728             }
1729
1730         onb = BUCKET_SIZE_REAL(bucket);
1731         /* 
1732          *  avoid the copy if same size block.
1733          *  We are not agressive with boundary cases. Note that it might
1734          *  (for a small number of cases) give false negative if
1735          *  both new size and old one are in the bucket for
1736          *  FIRST_BIG_POW2, but the new one is near the lower end.
1737          *
1738          *  We do not try to go to 1.5 times smaller bucket so far.
1739          */
1740         if (nbytes > onb) incr = 1;
1741         else {
1742 #ifdef DO_NOT_TRY_HARDER_WHEN_SHRINKING
1743             if ( /* This is a little bit pessimal if PACK_MALLOC: */
1744                 nbytes > ( (onb >> 1) - M_OVERHEAD )
1745 #  ifdef TWO_POT_OPTIMIZE
1746                 || (bucket == FIRST_BIG_POW2 && nbytes >= LAST_SMALL_BOUND )
1747 #  endif        
1748                 )
1749 #else  /* !DO_NOT_TRY_HARDER_WHEN_SHRINKING */
1750                 prev_bucket = ( (bucket > MAX_PACKED + 1) 
1751                                 ? bucket - BUCKETS_PER_POW2
1752                                 : bucket - 1);
1753              if (nbytes > BUCKET_SIZE_REAL(prev_bucket))
1754 #endif /* !DO_NOT_TRY_HARDER_WHEN_SHRINKING */
1755                  incr = 0;
1756              else incr = -1;
1757         }
1758 #ifdef STRESS_REALLOC
1759         goto hard_way;
1760 #endif
1761         if (incr == 0) {
1762           inplace_label:
1763 #ifdef RCHECK
1764                 /*
1765                  * Record new allocated size of block and
1766                  * bound space with magic numbers.
1767                  */
1768                 if (OV_INDEX(ovp) <= MAX_SHORT_BUCKET) {
1769                        int i, nb = ovp->ov_size + 1;
1770
1771                        if ((i = nb & 3)) {
1772                            i = 4 - i;
1773                            while (i--) {
1774                                ASSERT(*((char *)((caddr_t)ovp + nb - RSLOP + i)) == RMAGIC_C, "chunk's tail overwrite");
1775                            }
1776                        }
1777                        nb = (nb + 3) &~ 3; 
1778                        ASSERT(*(u_int *)((caddr_t)ovp + nb - RSLOP) == RMAGIC, "chunk's tail overwrite");
1779                         /*
1780                          * Convert amount of memory requested into
1781                          * closest block size stored in hash buckets
1782                          * which satisfies request.  Account for
1783                          * space used per block for accounting.
1784                          */
1785                         nbytes += M_OVERHEAD;
1786                         ovp->ov_size = nbytes - 1;
1787                         if ((i = nbytes & 3)) {
1788                             i = 4 - i;
1789                             while (i--)
1790                                 *((char *)((caddr_t)ovp + nbytes - RSLOP + i))
1791                                     = RMAGIC_C;
1792                         }
1793                         nbytes = (nbytes + 3) &~ 3; 
1794                         *((u_int *)((caddr_t)ovp + nbytes - RSLOP)) = RMAGIC;
1795                 }
1796 #endif
1797                 res = cp;
1798                 DEBUG_m(PerlIO_printf(Perl_debug_log, 
1799                               "0x%"UVxf": (%05lu) realloc %ld bytes inplace\n",
1800                               PTR2UV(res),(unsigned long)(PL_an++),
1801                               (long)size));
1802         } else if (incr == 1 && (cp - M_OVERHEAD == last_op) 
1803                    && (onb > (1 << LOG_OF_MIN_ARENA))) {
1804             MEM_SIZE require, newarena = nbytes, pow;
1805             int shiftr;
1806
1807             POW2_OPTIMIZE_ADJUST(newarena);
1808             newarena = newarena + M_OVERHEAD;
1809             /* newarena = (newarena + 3) &~ 3; */
1810             shiftr = (newarena - 1) >> LOG_OF_MIN_ARENA;
1811             pow = LOG_OF_MIN_ARENA + 1;
1812             /* apart from this loop, this is O(1) */
1813             while (shiftr >>= 1)
1814                 pow++;
1815             newarena = (1 << pow) + POW2_OPTIMIZE_SURPLUS(pow * BUCKETS_PER_POW2);
1816             require = newarena - onb - M_OVERHEAD;
1817             
1818             MALLOC_LOCK;
1819             if (cp - M_OVERHEAD == last_op /* We *still* are the last chunk */
1820                 && getpages_adjacent(require)) {
1821 #ifdef DEBUGGING_MSTATS
1822                 nmalloc[bucket]--;
1823                 nmalloc[pow * BUCKETS_PER_POW2]++;
1824 #endif      
1825                 *(cp - M_OVERHEAD) = pow * BUCKETS_PER_POW2; /* Fill index. */
1826                 MALLOC_UNLOCK;
1827                 goto inplace_label;
1828             } else {
1829                 MALLOC_UNLOCK;          
1830                 goto hard_way;
1831             }
1832         } else {
1833           hard_way:
1834             DEBUG_m(PerlIO_printf(Perl_debug_log, 
1835                               "0x%"UVxf": (%05lu) realloc %ld bytes the hard way\n",
1836                               PTR2UV(cp),(unsigned long)(PL_an++),
1837                               (long)size));
1838             if ((res = (char*)Perl_malloc(nbytes)) == NULL)
1839                 return (NULL);
1840             if (cp != res)                      /* common optimization */
1841                 Copy(cp, res, (MEM_SIZE)(nbytes<onb?nbytes:onb), char);
1842             Perl_mfree(cp);
1843         }
1844         return ((Malloc_t)res);
1845 }
1846
1847 Malloc_t
1848 Perl_calloc(register size_t elements, register size_t size)
1849 {
1850     long sz = elements * size;
1851     Malloc_t p = Perl_malloc(sz);
1852
1853     if (p) {
1854         memset((void*)p, 0, sz);
1855     }
1856     return p;
1857 }
1858
1859 char *
1860 Perl_strdup(const char *s)
1861 {
1862     MEM_SIZE l = strlen(s);
1863     char *s1 = (char *)Perl_malloc(l+1);
1864
1865     Copy(s, s1, (MEM_SIZE)(l+1), char);
1866     return s1;
1867 }
1868
1869 #ifdef PERL_CORE
1870 int
1871 Perl_putenv(char *a)
1872 {
1873     /* Sometimes system's putenv conflicts with my_setenv() - this is system
1874        malloc vs Perl's free(). */
1875   dTHX;
1876   char *var;
1877   char *val = a;
1878   MEM_SIZE l;
1879   char buf[80];
1880
1881   while (*val && *val != '=')
1882       val++;
1883   if (!*val)
1884       return -1;
1885   l = val - a;
1886   if (l < sizeof(buf))
1887       var = buf;
1888   else
1889       var = Perl_malloc(l + 1);
1890   Copy(a, var, l, char);
1891   var[l + 1] = 0;
1892   my_setenv(var, val+1);
1893   if (var != buf)
1894       Perl_mfree(var);
1895   return 0;
1896 }
1897 #  endif
1898
1899 MEM_SIZE
1900 Perl_malloced_size(void *p)
1901 {
1902     union overhead *ovp = (union overhead *)
1903         ((caddr_t)p - sizeof (union overhead) * CHUNK_SHIFT);
1904     int bucket = OV_INDEX(ovp);
1905 #ifdef RCHECK
1906     /* The caller wants to have a complete control over the chunk,
1907        disable the memory checking inside the chunk.  */
1908     if (bucket <= MAX_SHORT_BUCKET) {
1909         MEM_SIZE size = BUCKET_SIZE_REAL(bucket);
1910         ovp->ov_size = size + M_OVERHEAD - 1;
1911         *((u_int *)((caddr_t)ovp + size + M_OVERHEAD - RSLOP)) = RMAGIC;
1912     }
1913 #endif
1914     return BUCKET_SIZE_REAL(bucket);
1915 }
1916
1917 #  ifdef BUCKETS_ROOT2
1918 #    define MIN_EVEN_REPORT 6
1919 #  else
1920 #    define MIN_EVEN_REPORT MIN_BUCKET
1921 #  endif 
1922
1923 int
1924 Perl_get_mstats(pTHX_ perl_mstats_t *buf, int buflen, int level)
1925 {
1926 #ifdef DEBUGGING_MSTATS
1927         register int i, j;
1928         register union overhead *p;
1929         struct chunk_chain_s* nextchain;
1930
1931         buf->topbucket = buf->topbucket_ev = buf->topbucket_odd 
1932             = buf->totfree = buf->total = buf->total_chain = 0;
1933
1934         buf->minbucket = MIN_BUCKET;
1935         MALLOC_LOCK;
1936         for (i = MIN_BUCKET ; i < NBUCKETS; i++) {
1937                 for (j = 0, p = nextf[i]; p; p = p->ov_next, j++)
1938                         ;
1939                 if (i < buflen) {
1940                     buf->nfree[i] = j;
1941                     buf->ntotal[i] = nmalloc[i];
1942                 }               
1943                 buf->totfree += j * BUCKET_SIZE_REAL(i);
1944                 buf->total += nmalloc[i] * BUCKET_SIZE_REAL(i);
1945                 if (nmalloc[i]) {
1946                     i % 2 ? (buf->topbucket_odd = i) : (buf->topbucket_ev = i);
1947                     buf->topbucket = i;
1948                 }
1949         }
1950         nextchain = chunk_chain;
1951         while (nextchain) {
1952             buf->total_chain += nextchain->size;
1953             nextchain = nextchain->next;
1954         }
1955         buf->total_sbrk = goodsbrk + sbrk_slack;
1956         buf->sbrks = sbrks;
1957         buf->sbrk_good = sbrk_good;
1958         buf->sbrk_slack = sbrk_slack;
1959         buf->start_slack = start_slack;
1960         buf->sbrked_remains = sbrked_remains;
1961         MALLOC_UNLOCK;
1962         buf->nbuckets = NBUCKETS;
1963         if (level) {
1964             for (i = MIN_BUCKET ; i < NBUCKETS; i++) {
1965                 if (i >= buflen)
1966                     break;
1967                 buf->bucket_mem_size[i] = BUCKET_SIZE(i);
1968                 buf->bucket_available_size[i] = BUCKET_SIZE_REAL(i);
1969             }
1970         }
1971 #endif  /* defined DEBUGGING_MSTATS */
1972         return 0;               /* XXX unused */
1973 }
1974 /*
1975  * mstats - print out statistics about malloc
1976  * 
1977  * Prints two lines of numbers, one showing the length of the free list
1978  * for each size category, the second showing the number of mallocs -
1979  * frees for each size category.
1980  */
1981 void
1982 Perl_dump_mstats(pTHX_ char *s)
1983 {
1984 #ifdef DEBUGGING_MSTATS
1985         register int i;
1986         perl_mstats_t buffer;
1987         UV nf[NBUCKETS];
1988         UV nt[NBUCKETS];
1989
1990         buffer.nfree  = nf;
1991         buffer.ntotal = nt;
1992         get_mstats(&buffer, NBUCKETS, 0);
1993
1994         if (s)
1995             PerlIO_printf(Perl_error_log,
1996                           "Memory allocation statistics %s (buckets %"IVdf"(%"IVdf")..%"IVdf"(%"IVdf")\n",
1997                           s, 
1998                           (IV)BUCKET_SIZE_REAL(MIN_BUCKET), 
1999                           (IV)BUCKET_SIZE(MIN_BUCKET),
2000                           (IV)BUCKET_SIZE_REAL(buffer.topbucket), 
2001                           (IV)BUCKET_SIZE(buffer.topbucket));
2002         PerlIO_printf(Perl_error_log, "%8"IVdf" free:", buffer.totfree);
2003         for (i = MIN_EVEN_REPORT; i <= buffer.topbucket; i += BUCKETS_PER_POW2) {
2004                 PerlIO_printf(Perl_error_log, 
2005                               ((i < 8*BUCKETS_PER_POW2 || i == 10*BUCKETS_PER_POW2)
2006                                ? " %5"UVuf 
2007                                : ((i < 12*BUCKETS_PER_POW2) ? " %3"UVuf : " %"UVuf)),
2008                               buffer.nfree[i]);
2009         }
2010 #ifdef BUCKETS_ROOT2
2011         PerlIO_printf(Perl_error_log, "\n\t   ");
2012         for (i = MIN_BUCKET + 1; i <= buffer.topbucket_odd; i += BUCKETS_PER_POW2) {
2013                 PerlIO_printf(Perl_error_log, 
2014                               ((i < 8*BUCKETS_PER_POW2 || i == 10*BUCKETS_PER_POW2)
2015                                ? " %5"UVuf 
2016                                : ((i < 12*BUCKETS_PER_POW2) ? " %3"UVuf : " %"UVuf)),
2017                               buffer.nfree[i]);
2018         }
2019 #endif 
2020         PerlIO_printf(Perl_error_log, "\n%8"IVdf" used:", buffer.total - buffer.totfree);
2021         for (i = MIN_EVEN_REPORT; i <= buffer.topbucket; i += BUCKETS_PER_POW2) {
2022                 PerlIO_printf(Perl_error_log, 
2023                               ((i < 8*BUCKETS_PER_POW2 || i == 10*BUCKETS_PER_POW2)
2024                                ? " %5"IVdf
2025                                : ((i < 12*BUCKETS_PER_POW2) ? " %3"IVdf : " %"IVdf)), 
2026                               buffer.ntotal[i] - buffer.nfree[i]);
2027         }
2028 #ifdef BUCKETS_ROOT2
2029         PerlIO_printf(Perl_error_log, "\n\t   ");
2030         for (i = MIN_BUCKET + 1; i <= buffer.topbucket_odd; i += BUCKETS_PER_POW2) {
2031                 PerlIO_printf(Perl_error_log, 
2032                               ((i < 8*BUCKETS_PER_POW2 || i == 10*BUCKETS_PER_POW2)
2033                                ? " %5"IVdf 
2034                                : ((i < 12*BUCKETS_PER_POW2) ? " %3"IVdf : " %"IVdf)),
2035                               buffer.ntotal[i] - buffer.nfree[i]);
2036         }
2037 #endif 
2038         PerlIO_printf(Perl_error_log, "\nTotal sbrk(): %"IVdf"/%"IVdf":%"IVdf". Odd ends: pad+heads+chain+tail: %"IVdf"+%"IVdf"+%"IVdf"+%"IVdf".\n",
2039                       buffer.total_sbrk, buffer.sbrks, buffer.sbrk_good,
2040                       buffer.sbrk_slack, buffer.start_slack,
2041                       buffer.total_chain, buffer.sbrked_remains);
2042 #endif /* DEBUGGING_MSTATS */
2043 }
2044 #endif /* lint */
2045
2046 #ifdef USE_PERL_SBRK
2047
2048 #   if defined(__MACHTEN_PPC__) || defined(NeXT) || defined(__NeXT__) || defined(PURIFY)
2049 #      define PERL_SBRK_VIA_MALLOC
2050 #   endif
2051
2052 #   ifdef PERL_SBRK_VIA_MALLOC
2053
2054 /* it may seem schizophrenic to use perl's malloc and let it call system */
2055 /* malloc, the reason for that is only the 3.2 version of the OS that had */
2056 /* frequent core dumps within nxzonefreenolock. This sbrk routine put an */
2057 /* end to the cores */
2058
2059 #      ifndef SYSTEM_ALLOC
2060 #         define SYSTEM_ALLOC(a) malloc(a)
2061 #      endif
2062 #      ifndef SYSTEM_ALLOC_ALIGNMENT
2063 #         define SYSTEM_ALLOC_ALIGNMENT MEM_ALIGNBYTES
2064 #      endif
2065
2066 #   endif  /* PERL_SBRK_VIA_MALLOC */
2067
2068 static IV Perl_sbrk_oldchunk;
2069 static long Perl_sbrk_oldsize;
2070
2071 #   define PERLSBRK_32_K (1<<15)
2072 #   define PERLSBRK_64_K (1<<16)
2073
2074 Malloc_t
2075 Perl_sbrk(int size)
2076 {
2077     IV got;
2078     int small, reqsize;
2079
2080     if (!size) return 0;
2081 #ifdef PERL_CORE
2082     reqsize = size; /* just for the DEBUG_m statement */
2083 #endif
2084 #ifdef PACK_MALLOC
2085     size = (size + 0x7ff) & ~0x7ff;
2086 #endif
2087     if (size <= Perl_sbrk_oldsize) {
2088         got = Perl_sbrk_oldchunk;
2089         Perl_sbrk_oldchunk += size;
2090         Perl_sbrk_oldsize -= size;
2091     } else {
2092       if (size >= PERLSBRK_32_K) {
2093         small = 0;
2094       } else {
2095         size = PERLSBRK_64_K;
2096         small = 1;
2097       }
2098 #  if NEEDED_ALIGNMENT > SYSTEM_ALLOC_ALIGNMENT
2099       size += NEEDED_ALIGNMENT - SYSTEM_ALLOC_ALIGNMENT;
2100 #  endif
2101       got = (IV)SYSTEM_ALLOC(size);
2102 #  if NEEDED_ALIGNMENT > SYSTEM_ALLOC_ALIGNMENT
2103       got = (got + NEEDED_ALIGNMENT - 1) & ~(NEEDED_ALIGNMENT - 1);
2104 #  endif
2105       if (small) {
2106         /* Chunk is small, register the rest for future allocs. */
2107         Perl_sbrk_oldchunk = got + reqsize;
2108         Perl_sbrk_oldsize = size - reqsize;
2109       }
2110     }
2111
2112     DEBUG_m(PerlIO_printf(Perl_debug_log, "sbrk malloc size %ld (reqsize %ld), left size %ld, give addr 0x%"UVxf"\n",
2113                     size, reqsize, Perl_sbrk_oldsize, PTR2UV(got)));
2114
2115     return (void *)got;
2116 }
2117
2118 #endif /* ! defined USE_PERL_SBRK */