Skip to content
Snippets Groups Projects
Commit 0bcb9c31 authored by Howard Chu's avatar Howard Chu
Browse files

Fix ITS#3155

parent 2c0d735a
No related branches found
No related tags found
No related merge requests found
...@@ -48,6 +48,10 @@ slap_sl_mem_init() ...@@ -48,6 +48,10 @@ slap_sl_mem_init()
ber_set_option( NULL, LBER_OPT_MEMORY_FNS, &slap_sl_mfuncs ); ber_set_option( NULL, LBER_OPT_MEMORY_FNS, &slap_sl_mfuncs );
} }
#ifdef NO_THREADS
static struct slab_heap *slheap;
#endif
void * void *
slap_sl_mem_create( slap_sl_mem_create(
ber_len_t size, ber_len_t size,
...@@ -57,7 +61,11 @@ slap_sl_mem_create( ...@@ -57,7 +61,11 @@ slap_sl_mem_create(
struct slab_heap *sh = NULL; struct slab_heap *sh = NULL;
int pad = 2*sizeof(int)-1; int pad = 2*sizeof(int)-1;
#ifdef NO_THREADS
sh = slheap;
#else
ldap_pvt_thread_pool_getkey( ctx, (void *)slap_sl_mem_init, (void **)&sh, NULL ); ldap_pvt_thread_pool_getkey( ctx, (void *)slap_sl_mem_init, (void **)&sh, NULL );
#endif
/* round up to doubleword boundary */ /* round up to doubleword boundary */
size += pad; size += pad;
...@@ -66,8 +74,12 @@ slap_sl_mem_create( ...@@ -66,8 +74,12 @@ slap_sl_mem_create(
if (!sh) { if (!sh) {
sh = ch_malloc( sizeof(struct slab_heap) ); sh = ch_malloc( sizeof(struct slab_heap) );
sh->h_base = ch_malloc( size ); sh->h_base = ch_malloc( size );
#ifdef NO_THREADS
slheap = sh;
#else
ldap_pvt_thread_pool_setkey( ctx, (void *)slap_sl_mem_init, ldap_pvt_thread_pool_setkey( ctx, (void *)slap_sl_mem_init,
(void *)sh, slap_sl_mem_destroy ); (void *)sh, slap_sl_mem_destroy );
#endif
} else if ( size > (char *) sh->h_end - (char *) sh->h_base ) { } else if ( size > (char *) sh->h_end - (char *) sh->h_base ) {
sh->h_base = ch_realloc( sh->h_base, size ); sh->h_base = ch_realloc( sh->h_base, size );
} }
...@@ -82,8 +94,12 @@ slap_sl_mem_detach( ...@@ -82,8 +94,12 @@ slap_sl_mem_detach(
void *memctx void *memctx
) )
{ {
#ifdef NO_THREADS
slheap = NULL;
#else
/* separate from context */ /* 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, NULL );
#endif
} }
void * void *
...@@ -209,9 +225,13 @@ slap_sl_context( void *ptr ) ...@@ -209,9 +225,13 @@ slap_sl_context( void *ptr )
struct slab_heap *sh = NULL; struct slab_heap *sh = NULL;
void *ctx; void *ctx;
#ifdef NO_THREADS
sh = slheap;
#else
ctx = ldap_pvt_thread_pool_context(); ctx = ldap_pvt_thread_pool_context();
ldap_pvt_thread_pool_getkey( ctx, (void *)slap_sl_mem_init, (void **)&sh, NULL ); ldap_pvt_thread_pool_getkey( ctx, (void *)slap_sl_mem_init, (void **)&sh, NULL );
#endif
if ( sh && ptr >= sh->h_base && ptr <= sh->h_end ) { if ( sh && ptr >= sh->h_base && ptr <= sh->h_end ) {
return sh; return sh;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment