mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-03-07 14:18:15 +08:00
ITS#3961 better fix - provide a context for the main thread. The context
must be reset by the caller to clear out temp allocations etc.
This commit is contained in:
parent
468112e2ba
commit
1f78e2b831
@ -208,11 +208,8 @@ ldap_pvt_thread_pool_purgekey LDAP_P(( void *key ));
|
||||
LDAP_F( void *)
|
||||
ldap_pvt_thread_pool_context LDAP_P(( void ));
|
||||
|
||||
LDAP_F( void *)
|
||||
ldap_pvt_thread_pool_fake_context_init LDAP_P(( void ));
|
||||
|
||||
LDAP_F( void )
|
||||
ldap_pvt_thread_pool_fake_context_destroy LDAP_P(( void *key ));
|
||||
ldap_pvt_thread_pool_context_reset LDAP_P(( void *key ));
|
||||
|
||||
LDAP_END_DECL
|
||||
|
||||
|
@ -96,9 +96,15 @@ static ldap_pvt_thread_mutex_t ldap_pvt_thread_pool_mutex;
|
||||
|
||||
static void *ldap_int_thread_pool_wrapper( void *pool );
|
||||
|
||||
static ldap_pvt_thread_t ldap_int_main_tid;
|
||||
|
||||
static ldap_int_thread_key_t ldap_int_main_thrctx[LDAP_MAXTHR];
|
||||
|
||||
int
|
||||
ldap_int_thread_pool_startup ( void )
|
||||
{
|
||||
ldap_int_main_tid = ldap_pvt_thread_self();
|
||||
|
||||
return ldap_pvt_thread_mutex_init(&ldap_pvt_thread_pool_mutex);
|
||||
}
|
||||
|
||||
@ -652,6 +658,8 @@ void *ldap_pvt_thread_pool_context( )
|
||||
int i, hash;
|
||||
|
||||
tid = ldap_pvt_thread_self();
|
||||
if ( TID_EQ( tid, ldap_int_main_tid ))
|
||||
return ldap_int_main_thrctx;
|
||||
|
||||
TID_HASH( tid, hash );
|
||||
for (i = hash & (LDAP_MAXTHR-1); !TID_EQ(thread_keys[i].id, tid_zero) &&
|
||||
@ -660,21 +668,15 @@ void *ldap_pvt_thread_pool_context( )
|
||||
return thread_keys[i].ctx;
|
||||
}
|
||||
|
||||
void *ldap_pvt_thread_pool_fake_context_init( )
|
||||
{
|
||||
return LDAP_CALLOC( LDAP_MAXTHR, sizeof(ldap_int_thread_key_t) );
|
||||
}
|
||||
|
||||
void ldap_pvt_thread_pool_fake_context_destroy( void *vctx )
|
||||
void ldap_pvt_thread_pool_context_reset( void *vctx )
|
||||
{
|
||||
ldap_int_thread_key_t *ctx = vctx;
|
||||
int i;
|
||||
|
||||
for ( i=0; ctx[i].ltk_key; i++) {
|
||||
for ( i=0; i<MAXKEYS && ctx[i].ltk_key; i++) {
|
||||
if ( ctx[i].ltk_free )
|
||||
ctx[i].ltk_free( ctx[i].ltk_key, ctx[i].ltk_data );
|
||||
ctx[i].ltk_key = NULL;
|
||||
}
|
||||
LDAP_FREE( vctx );
|
||||
}
|
||||
#endif /* LDAP_THREAD_HAVE_TPOOL */
|
||||
|
@ -2600,7 +2600,7 @@ config_setup_ldif( BackendDB *be, const char *dir, int readit ) {
|
||||
return 1;
|
||||
|
||||
if ( readit ) {
|
||||
void *thrctx = ldap_pvt_thread_pool_fake_context_init();
|
||||
void *thrctx = ldap_pvt_thread_pool_context();
|
||||
|
||||
op = (Operation *)opbuf;
|
||||
connection_fake_init( &conn, op, thrctx );
|
||||
@ -2633,7 +2633,7 @@ config_setup_ldif( BackendDB *be, const char *dir, int readit ) {
|
||||
op->o_bd = &cfb->cb_db;
|
||||
rc = op->o_bd->be_search( op, &rs );
|
||||
|
||||
ldap_pvt_thread_pool_fake_context_destroy( thrctx );
|
||||
ldap_pvt_thread_pool_context_reset( thrctx );
|
||||
}
|
||||
|
||||
cfb->cb_use_ldif = 1;
|
||||
@ -3989,7 +3989,7 @@ config_back_db_open( BackendDB *be )
|
||||
return 0;
|
||||
|
||||
if ( cfb->cb_use_ldif ) {
|
||||
thrctx = ldap_pvt_thread_pool_fake_context_init();
|
||||
thrctx = ldap_pvt_thread_pool_context();
|
||||
op = (Operation *)opbuf;
|
||||
connection_fake_init( &conn, op, thrctx );
|
||||
|
||||
@ -4103,7 +4103,7 @@ config_back_db_open( BackendDB *be )
|
||||
}
|
||||
}
|
||||
if ( thrctx )
|
||||
ldap_pvt_thread_pool_fake_context_destroy( thrctx );
|
||||
ldap_pvt_thread_pool_context_reset( thrctx );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -2111,12 +2111,6 @@ sp_cf_gen(ConfigArgs *c)
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* Cheating - we have no thread pool context for these functions,
|
||||
* so make one.
|
||||
*/
|
||||
|
||||
static void *syncprov_thrctx;
|
||||
|
||||
/* ITS#3456 we cannot run this search on the main thread, must use a
|
||||
* child thread in order to insure we have a big enough stack.
|
||||
*/
|
||||
@ -2148,6 +2142,7 @@ syncprov_db_open(
|
||||
Entry *e;
|
||||
Attribute *a;
|
||||
int rc;
|
||||
void *thrctx = NULL;
|
||||
|
||||
if ( slapMode & SLAP_TOOL_MODE ) {
|
||||
return 0;
|
||||
@ -2158,8 +2153,8 @@ syncprov_db_open(
|
||||
return rc;
|
||||
}
|
||||
|
||||
syncprov_thrctx = ldap_pvt_thread_pool_fake_context_init();
|
||||
connection_fake_init( &conn, op, syncprov_thrctx );
|
||||
thrctx = ldap_pvt_thread_pool_context();
|
||||
connection_fake_init( &conn, op, thrctx );
|
||||
op->o_bd = be;
|
||||
op->o_dn = be->be_rootdn;
|
||||
op->o_ndn = be->be_rootndn;
|
||||
@ -2212,6 +2207,7 @@ syncprov_db_open(
|
||||
|
||||
out:
|
||||
op->o_bd->bd_info = (BackendInfo *)on;
|
||||
ldap_pvt_thread_pool_context_reset( thrctx );
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -2234,15 +2230,16 @@ syncprov_db_close(
|
||||
char opbuf[OPERATION_BUFFER_SIZE];
|
||||
Operation *op = (Operation *)opbuf;
|
||||
SlapReply rs = {REP_RESULT};
|
||||
void *thrctx;
|
||||
|
||||
connection_fake_init( &conn, op, syncprov_thrctx );
|
||||
thrctx = ldap_pvt_thread_pool_context();
|
||||
connection_fake_init( &conn, op, thrctx );
|
||||
op->o_bd = be;
|
||||
op->o_dn = be->be_rootdn;
|
||||
op->o_ndn = be->be_rootndn;
|
||||
syncprov_checkpoint( op, &rs, on );
|
||||
ldap_pvt_thread_pool_context_reset( thrctx );
|
||||
}
|
||||
ldap_pvt_thread_pool_fake_context_destroy( syncprov_thrctx );
|
||||
syncprov_thrctx = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user