#define MAGIC 0xff /* magic # on accounting info */
#define RMAGIC 0x55555555 /* magic # on range info */
#ifdef RCHECK
-#define RSLOP sizeof (u_int)
+# define RSLOP sizeof (u_int)
+# ifdef TWO_POT_OPTIMIZE
+# define MAX_SHORT_BUCKET 12
+# else
+# define MAX_SHORT_BUCKET 13
+# endif
#else
-#define RSLOP 0
+# define RSLOP 0
#endif
#ifdef PACK_MALLOC
register int bucket = 0;
register MEM_SIZE shiftr;
-#ifdef PERL_CORE
-#ifdef DEBUGGING
+#if defined(DEBUGGING) || defined(RCHECK)
MEM_SIZE size = nbytes;
#endif
+#ifdef PERL_CORE
#ifdef HAS_64K_LIMIT
if (nbytes > 0xffff) {
- PerlIO_printf(PerlIO_stderr(), "Allocation too large: %lx\n", (long)nbytes);
+ PerlIO_printf(PerlIO_stderr(),
+ "Allocation too large: %lx\n", (long)nbytes);
my_exit(1);
}
#endif /* HAS_64K_LIMIT */
#ifdef DEBUGGING
if ((long)nbytes < 0)
- croak("panic: malloc");
+ croak("panic: malloc");
#endif
#endif /* PERL_CORE */
* space used per block for accounting.
*/
#ifdef PACK_MALLOC
- if (nbytes > MAX_2_POT_ALGO) {
+ if (nbytes == 0)
+ nbytes = 1;
+ else if (nbytes > MAX_2_POT_ALGO)
#endif
+ {
#ifdef TWO_POT_OPTIMIZE
- if (nbytes >= FIRST_BIG_BOUND) {
- nbytes -= PERL_PAGESIZE;
- }
+ if (nbytes >= FIRST_BIG_BOUND)
+ nbytes -= PERL_PAGESIZE;
#endif
- nbytes += M_OVERHEAD;
- nbytes = (nbytes + 3) &~ 3;
-#ifdef PACK_MALLOC
- } else if (nbytes == 0) {
- nbytes = 1;
+ nbytes += M_OVERHEAD;
+ nbytes = (nbytes + 3) &~ 3;
}
-#endif
shiftr = (nbytes - 1) >> 2;
/* apart from this loop, this is O(1) */
while (shiftr >>= 1)
* Record allocated size of block and
* bound space with magic numbers.
*/
+ nbytes = (size + M_OVERHEAD + 3) &~ 3;
if (nbytes <= 0x10000)
p->ov_size = nbytes - 1;
p->ov_rmagic = RMAGIC;
#endif
#ifdef RCHECK
ASSERT(op->ov_rmagic == RMAGIC);
- if (OV_INDEX(op) <= 13)
+ if (OV_INDEX(op) <= MAX_SHORT_BUCKET)
ASSERT(*(u_int *)((caddr_t)op + op->ov_size + 1 - RSLOP) == RMAGIC);
op->ov_rmagic = RMAGIC - 1;
#endif
int was_alloced = 0;
char *cp = (char*)mp;
-#ifdef PERL_CORE
#ifdef DEBUGGING
MEM_SIZE size = nbytes;
#endif
+#ifdef PERL_CORE
#ifdef HAS_64K_LIMIT
if (nbytes > 0xffff) {
- PerlIO_printf(PerlIO_stderr(), "Reallocation too large: %lx\n", size);
+ PerlIO_printf(PerlIO_stderr(),
+ "Reallocation too large: %lx\n", size);
my_exit(1);
}
#endif /* HAS_64K_LIMIT */
* Record new allocated size of block and
* bound space with magic numbers.
*/
- if (OV_INDEX(op) <= 13) {
+ if (OV_INDEX(op) <= MAX_SHORT_BUCKET) {
/*
* Convert amount of memory requested into
* closest block size stored in hash buckets