diff options
author | Nicholas Clark <nick@ccl4.org> | 2008-02-27 19:10:02 +0000 |
---|---|---|
committer | Nicholas Clark <nick@ccl4.org> | 2008-02-27 19:10:02 +0000 |
commit | 641071807211a3969bcad26ac3f2a39f4550a11c (patch) | |
tree | f8d7cf2e1c8f223acae107e41f2361248172d699 | |
parent | 4fd0a9b8690ace1bad89926e6d018a6f863761c3 (diff) | |
download | perl-641071807211a3969bcad26ac3f2a39f4550a11c.tar.gz |
Add Perl_malloc_good_size to malloc.c. (A routine that rounds up the
passed in request to the size that will actually be allocated. It's
the same interface as Darwin already provides with malloc_good_size().)
p4raw-id: //depot/perl@33389
-rw-r--r-- | embed.fnc | 1 | ||||
-rw-r--r-- | embed.h | 2 | ||||
-rw-r--r-- | makedef.pl | 1 | ||||
-rw-r--r-- | malloc.c | 50 | ||||
-rw-r--r-- | proto.h | 3 |
5 files changed, 41 insertions, 16 deletions
@@ -87,6 +87,7 @@ Aanop |Malloc_t|realloc |Malloc_t where|MEM_SIZE nbytes Anop |Free_t |mfree |Malloc_t where #if defined(MYMALLOC) npR |MEM_SIZE|malloced_size |NN void *p +npR |MEM_SIZE|malloc_good_size |size_t nbytes #endif AnpR |void* |get_context @@ -38,6 +38,7 @@ #if defined(MYMALLOC) #ifdef PERL_CORE #define malloced_size Perl_malloced_size +#define malloc_good_size Perl_malloc_good_size #endif #endif #define get_context Perl_get_context @@ -2349,6 +2350,7 @@ #if defined(MYMALLOC) #ifdef PERL_CORE #define malloced_size Perl_malloced_size +#define malloc_good_size Perl_malloc_good_size #endif #endif #define get_context Perl_get_context diff --git a/makedef.pl b/makedef.pl index dad466ad42..a559061a5f 100644 --- a/makedef.pl +++ b/makedef.pl @@ -667,6 +667,7 @@ else { Perl_dump_mstats Perl_get_mstats Perl_malloced_size + Perl_malloc_good_size MallocCfg_ptr MallocCfgP_ptr )]; @@ -1404,23 +1404,12 @@ cmp_pat_4bytes(unsigned char *s, size_t nbytes, const unsigned char *fill) # define FILLCHECK_DEADBEEF(s, n) ((void)0) #endif -Malloc_t -Perl_malloc(register size_t nbytes) +int +S_ajust_size_and_find_bucket(size_t *nbytes_p) { - dVAR; - register union overhead *p; - register int bucket; - register MEM_SIZE shiftr; - -#if defined(DEBUGGING) || defined(RCHECK) - MEM_SIZE size = nbytes; -#endif - - BARK_64K_LIMIT("Allocation",nbytes,nbytes); -#ifdef DEBUGGING - if ((long)nbytes < 0) - croak("%s", "panic: malloc"); -#endif + MEM_SIZE shiftr; + int bucket; + size_t nbytes = *nbytes_p; /* * Convert amount of memory requested into @@ -1455,6 +1444,28 @@ Perl_malloc(register size_t nbytes) while (shiftr >>= 1) bucket += BUCKETS_PER_POW2; } + *nbytes_p = nbytes; + return bucket; +} + +Malloc_t +Perl_malloc(size_t nbytes) +{ + dVAR; + register union overhead *p; + register int bucket; + +#if defined(DEBUGGING) || defined(RCHECK) + MEM_SIZE size = nbytes; +#endif + + BARK_64K_LIMIT("Allocation",nbytes,nbytes); +#ifdef DEBUGGING + if ((long)nbytes < 0) + croak("%s", "panic: malloc"); +#endif + + bucket = S_ajust_size_and_find_bucket(&nbytes); MALLOC_LOCK; /* * If nothing in hash bucket right now, @@ -2376,6 +2387,13 @@ Perl_malloced_size(void *p) return BUCKET_SIZE_REAL(bucket); } + +MEM_SIZE +Perl_malloc_good_size(size_t wanted) +{ + return BUCKET_SIZE_REAL(S_ajust_size_and_find_bucket(&wanted)); +} + # ifdef BUCKETS_ROOT2 # define MIN_EVEN_REPORT 6 # else @@ -106,6 +106,9 @@ PERL_CALLCONV MEM_SIZE Perl_malloced_size(void *p) #define PERL_ARGS_ASSERT_MALLOCED_SIZE \ assert(p) +PERL_CALLCONV MEM_SIZE Perl_malloc_good_size(size_t nbytes) + __attribute__warn_unused_result__; + #endif PERL_CALLCONV void* Perl_get_context(void) |