X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fsl_malloc.c;h=89614e55a8b943f7faa6daea5e6b4a055fc7b840;hb=e841247c9086053d774d66e4fbb058d0ead706b2;hp=021bc830aa027b5c13f6ef013a798ca092c7aba4;hpb=5d2ba11ad924cfe9be57d7d6a1e6a37e108bbe10;p=openldap diff --git a/servers/slapd/sl_malloc.c b/servers/slapd/sl_malloc.c index 021bc830aa..89614e55a8 100644 --- a/servers/slapd/sl_malloc.c +++ b/servers/slapd/sl_malloc.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 2003-2005 The OpenLDAP Foundation. + * Copyright 2003-2009 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,7 +22,9 @@ #include "slap.h" static struct slab_object * slap_replenish_sopool(struct slab_heap* sh); +#ifdef SLAPD_UNUSED static void print_slheap(int level, void *ctx); +#endif void slap_sl_mem_destroy( @@ -92,10 +94,11 @@ void * slap_sl_mem_create( ber_len_t size, int stack, - void *ctx + void *ctx, + int new ) { - struct slab_heap *sh = NULL; + struct slab_heap *sh; ber_len_t size_shift; int pad = 2*sizeof(int)-1, pad_shift; int order = -1, order_start = -1, order_end = -1; @@ -105,10 +108,15 @@ slap_sl_mem_create( #ifdef NO_THREADS sh = slheap; #else + void *sh_tmp = NULL; ldap_pvt_thread_pool_getkey( - ctx, (void *)slap_sl_mem_init, (void **)&sh, NULL ); + ctx, (void *)slap_sl_mem_init, &sh_tmp, NULL ); + sh = sh_tmp; #endif + if ( !new ) + return sh; + /* round up to doubleword boundary */ size += pad; size &= ~pad; @@ -121,10 +129,14 @@ slap_sl_mem_create( slheap = sh; #else ldap_pvt_thread_pool_setkey(ctx, (void *)slap_sl_mem_init, - (void *)sh, slap_sl_mem_destroy); + (void *)sh, slap_sl_mem_destroy, NULL, NULL); #endif } else if ( size > (char *)sh->sh_end - (char *)sh->sh_base ) { - sh->sh_base = ch_realloc(sh->sh_base, size); + void *newptr; + + newptr = ch_realloc( sh->sh_base, size ); + if ( newptr == NULL ) return NULL; + sh->sh_base = newptr; } sh->sh_last = sh->sh_base; sh->sh_end = (char *) sh->sh_base + size; @@ -150,7 +162,7 @@ slap_sl_mem_create( slheap = sh; #else ldap_pvt_thread_pool_setkey(ctx, (void *)slap_sl_mem_init, - (void *)sh, slap_sl_mem_destroy); + (void *)sh, slap_sl_mem_destroy, NULL, NULL); #endif } else { for (i = 0; i <= sh->sh_maxorder - order_start; i++) { @@ -181,7 +193,11 @@ slap_sl_mem_create( } if (size > (char *)sh->sh_end - (char *)sh->sh_base) { - sh->sh_base = realloc(sh->sh_base, size); + void *newptr; + + newptr = realloc( sh->sh_base, size ); + if ( newptr == NULL ) return NULL; + sh->sh_base = newptr; } } sh->sh_end = (char *)sh->sh_base + size; @@ -230,7 +246,8 @@ slap_sl_mem_detach( slheap = NULL; #else /* separate from context */ - ldap_pvt_thread_pool_setkey( ctx, (void *)slap_sl_mem_init, NULL, NULL ); + ldap_pvt_thread_pool_setkey( ctx, (void *)slap_sl_mem_init, + NULL, 0, NULL, NULL ); #endif } @@ -245,10 +262,14 @@ slap_sl_malloc( int pad = 2*sizeof(int)-1, pad_shift; int order = -1, order_start = -1; struct slab_object *so_new, *so_left, *so_right; - ber_len_t *ptr, *new; + ber_len_t *ptr, *newptr; unsigned long diff; int i, j; +#ifdef SLAP_NO_SL_MALLOC + return ber_memalloc_x( size, NULL ); +#endif + /* ber_set_option calls us like this */ if (!ctx) return ber_memalloc_x(size, NULL); @@ -263,10 +284,10 @@ slap_sl_malloc( (long)size, 0, 0); return ch_malloc(size); } - new = sh->sh_last; - *new++ = size - sizeof(ber_len_t); + newptr = sh->sh_last; + *newptr++ = size - sizeof(ber_len_t); sh->sh_last = (char *) sh->sh_last + size; - return( (void *)new ); + return( (void *)newptr ); } else { size_shift = size - 1; do { @@ -334,13 +355,13 @@ slap_sl_malloc( void * slap_sl_calloc( ber_len_t n, ber_len_t size, void *ctx ) { - void *new; + void *newptr; - new = slap_sl_malloc( n*size, ctx ); - if ( new ) { - memset( new, 0, n*size ); + newptr = slap_sl_malloc( n*size, ctx ); + if ( newptr ) { + memset( newptr, 0, n*size ); } - return new; + return newptr; } void * @@ -348,17 +369,21 @@ slap_sl_realloc(void *ptr, ber_len_t size, void *ctx) { struct slab_heap *sh = ctx; int pad = 2*sizeof(int) -1; - ber_len_t *p = (ber_len_t *)ptr, *new; + ber_len_t *p = (ber_len_t *)ptr, *newptr; if (ptr == NULL) return slap_sl_malloc(size, ctx); +#ifdef SLAP_NO_SL_MALLOC + return ber_memrealloc_x( ptr, size, NULL ); +#endif + /* Not our memory? */ if (!sh || ptr < sh->sh_base || ptr >= sh->sh_end) { /* duplicate of realloc behavior, oh well */ - new = ber_memrealloc_x(ptr, size, NULL); - if (new) { - return new; + newptr = ber_memrealloc_x(ptr, size, NULL); + if (newptr) { + return newptr; } Debug(LDAP_DEBUG_ANY, "ch_realloc of %lu bytes failed\n", (long) size, 0, 0); @@ -378,31 +403,32 @@ slap_sl_realloc(void *ptr, ber_len_t size, void *ctx) /* Never shrink blocks */ if (size <= p[-1]) { - new = p; + newptr = p; /* If reallocing the last block, we can grow it */ } else if ((char *)ptr + p[-1] == sh->sh_last && (char *)ptr + size < (char *)sh->sh_end ) { - new = p; + newptr = p; sh->sh_last = (char *)sh->sh_last + size - p[-1]; p[-1] = size; /* Nowhere to grow, need to alloc and copy */ } else { - new = slap_sl_malloc(size, ctx); - AC_MEMCPY(new, ptr, p[-1]); + newptr = slap_sl_malloc(size, ctx); + AC_MEMCPY(newptr, ptr, p[-1]); } - return new; + return newptr; } else { - void *newptr; - newptr = slap_sl_malloc(size, ctx); + void *newptr2; + + newptr2 = slap_sl_malloc(size, ctx); if (size < p[-1]) { - AC_MEMCPY(newptr, ptr, size); + AC_MEMCPY(newptr2, ptr, size); } else { - AC_MEMCPY(newptr, ptr, p[-1]); + AC_MEMCPY(newptr2, ptr, p[-1]); } slap_sl_free(ptr, ctx); - return newptr; + return newptr2; } } @@ -418,6 +444,14 @@ slap_sl_free(void *ptr, void *ctx) unsigned long diff; int i, inserted = 0; + if (!ptr) + return; + +#ifdef SLAP_NO_SL_MALLOC + ber_memfree_x( ptr, NULL ); + return; +#endif + if (!sh || ptr < sh->sh_base || ptr >= sh->sh_end) { ber_memfree_x(ptr, NULL); } else if (sh->sh_stack && (char *)ptr + p[-1] == sh->sh_last) { @@ -475,7 +509,7 @@ slap_sl_free(void *ptr, void *ctx) Debug(LDAP_DEBUG_TRACE, "slap_sl_free: " "free object not found while bit is clear.\n", 0, 0, 0); - assert(so); + assert(so != NULL); } } else { @@ -525,7 +559,7 @@ slap_sl_free(void *ptr, void *ctx) Debug(LDAP_DEBUG_TRACE, "slap_sl_free: " "free object not found while bit is clear.\n", 0, 0, 0 ); - assert( so ); + assert(so != NULL); } } else { @@ -549,8 +583,8 @@ slap_sl_free(void *ptr, void *ctx) void * slap_sl_context( void *ptr ) { - struct slab_heap *sh = NULL; - void *ctx; + struct slab_heap *sh; + void *ctx, *sh_tmp; if ( slapMode & SLAP_TOOL_MODE ) return NULL; @@ -559,8 +593,10 @@ slap_sl_context( void *ptr ) #else ctx = ldap_pvt_thread_pool_context(); - ldap_pvt_thread_pool_getkey(ctx, (void *)slap_sl_mem_init, - (void **)&sh, NULL); + sh_tmp = NULL; + ldap_pvt_thread_pool_getkey( + ctx, (void *)slap_sl_mem_init, &sh_tmp, NULL); + sh = sh_tmp; #endif if (sh && ptr >= sh->sh_base && ptr <= sh->sh_end) { @@ -594,6 +630,7 @@ slap_replenish_sopool( return so_block; } +#ifdef SLAPD_UNUSED static void print_slheap(int level, void *ctx) { @@ -634,3 +671,4 @@ print_slheap(int level, void *ctx) } } } +#endif