mirror of
https://git.openldap.org/openldap/openldap.git
synced 2024-12-21 03:10:25 +08:00
Fix ITS#3155
This commit is contained in:
parent
2c0d735aa7
commit
0bcb9c3150
@ -48,6 +48,10 @@ slap_sl_mem_init()
|
||||
ber_set_option( NULL, LBER_OPT_MEMORY_FNS, &slap_sl_mfuncs );
|
||||
}
|
||||
|
||||
#ifdef NO_THREADS
|
||||
static struct slab_heap *slheap;
|
||||
#endif
|
||||
|
||||
void *
|
||||
slap_sl_mem_create(
|
||||
ber_len_t size,
|
||||
@ -57,7 +61,11 @@ slap_sl_mem_create(
|
||||
struct slab_heap *sh = NULL;
|
||||
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 );
|
||||
#endif
|
||||
|
||||
/* round up to doubleword boundary */
|
||||
size += pad;
|
||||
@ -66,8 +74,12 @@ slap_sl_mem_create(
|
||||
if (!sh) {
|
||||
sh = ch_malloc( sizeof(struct slab_heap) );
|
||||
sh->h_base = ch_malloc( size );
|
||||
#ifdef NO_THREADS
|
||||
slheap = sh;
|
||||
#else
|
||||
ldap_pvt_thread_pool_setkey( ctx, (void *)slap_sl_mem_init,
|
||||
(void *)sh, slap_sl_mem_destroy );
|
||||
#endif
|
||||
} else if ( size > (char *) sh->h_end - (char *) sh->h_base ) {
|
||||
sh->h_base = ch_realloc( sh->h_base, size );
|
||||
}
|
||||
@ -82,8 +94,12 @@ slap_sl_mem_detach(
|
||||
void *memctx
|
||||
)
|
||||
{
|
||||
#ifdef NO_THREADS
|
||||
slheap = NULL;
|
||||
#else
|
||||
/* separate from context */
|
||||
ldap_pvt_thread_pool_setkey( ctx, (void *)slap_sl_mem_init, NULL, NULL );
|
||||
#endif
|
||||
}
|
||||
|
||||
void *
|
||||
@ -209,9 +225,13 @@ slap_sl_context( void *ptr )
|
||||
struct slab_heap *sh = NULL;
|
||||
void *ctx;
|
||||
|
||||
#ifdef NO_THREADS
|
||||
sh = slheap;
|
||||
#else
|
||||
ctx = ldap_pvt_thread_pool_context();
|
||||
|
||||
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 ) {
|
||||
return sh;
|
||||
|
Loading…
Reference in New Issue
Block a user