]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/sl_malloc.c
ITS#5490
[openldap] / servers / slapd / sl_malloc.c
index 8c204e50a47b914a30e50c22ad4b1e628ba2b160..74e24e21e89d7042fef38a4325bee89fa6b04fb0 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2003-2006 The OpenLDAP Foundation.
+ * Copyright 2003-2008 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -94,7 +94,8 @@ void *
 slap_sl_mem_create(
        ber_len_t size,
        int stack,
-       void *ctx
+       void *ctx,
+       int new
 )
 {
        struct slab_heap *sh;
@@ -113,6 +114,9 @@ slap_sl_mem_create(
        sh = sh_tmp;
 #endif
 
+       if ( !new )
+               return sh;
+
        /* round up to doubleword boundary */
        size += pad;
        size &= ~pad;
@@ -125,7 +129,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 if ( size > (char *)sh->sh_end - (char *)sh->sh_base ) {
                        void    *newptr;
@@ -158,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++) {
@@ -242,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
 }
 
@@ -261,6 +266,10 @@ slap_sl_malloc(
        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);
 
@@ -365,6 +374,10 @@ slap_sl_realloc(void *ptr, ber_len_t size, void *ctx)
        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 */
@@ -434,6 +447,11 @@ slap_sl_free(void *ptr, void *ctx)
        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) {