]> git.sur5r.net Git - openldap/commitdiff
ITS#3961 better fix - provide a context for the main thread. The context
authorHoward Chu <hyc@openldap.org>
Tue, 23 Aug 2005 04:12:57 +0000 (04:12 +0000)
committerHoward Chu <hyc@openldap.org>
Tue, 23 Aug 2005 04:12:57 +0000 (04:12 +0000)
must be reset by the caller to clear out temp allocations etc.

include/ldap_pvt_thread.h
libraries/libldap_r/tpool.c
servers/slapd/bconfig.c
servers/slapd/overlays/syncprov.c

index 75b9998e80a0bda4855963bed4fefff8372d2274..79c821dd659ddf48255392bf7272de4337d6338e 100644 (file)
@@ -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
 
index 675fa4d0b46e5f1319ad86b7ea6651cc52d99b52..440b5a75e50084021643b9c35b76aedb7b0bfe64 100644 (file)
@@ -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 */
index eb0f575ae0c84d7f5f344e399062dd4146d3fce7..8e9156cf378fef583bf284b8994f6662c8ab64c7 100644 (file)
@@ -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;
 }
index 978e7c7fd8755568c13e7db33652088d659fc8b5..2f5d88b65bebe647b1089ddc5d22d9e3cdfeea6f 100644 (file)
@@ -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;
 }