use arbitrary context pointers.
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_END_DECL
#endif /* _LDAP_THREAD_H */
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 )
+{
+ ldap_int_thread_key_t *ctx = vctx;
+ int i;
+
+ for ( i=0; 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 */
return 1;
if ( readit ) {
+ void *thrctx = ldap_pvt_thread_pool_fake_context_init();
+
op = (Operation *)opbuf;
- connection_fake_init( &conn, op, cfb );
+ connection_fake_init( &conn, op, thrctx );
filter.f_desc = slap_schema.si_ad_objectClass;
op->o_bd = &cfb->cb_db;
rc = op->o_bd->be_search( op, &rs );
- slap_sl_mem_destroy( NULL, op->o_tmpmemctx );
+ ldap_pvt_thread_pool_fake_context_destroy( thrctx );
}
cfb->cb_use_ldif = 1;
Operation *op;
slap_callback cb = { NULL, slap_null_cb, NULL, NULL };
SlapReply rs = {REP_RESULT};
+ void *thrctx = NULL;
/* If we read the config from back-ldif, nothing to do here */
if ( cfb->cb_got_ldif )
return 0;
if ( cfb->cb_use_ldif ) {
+ thrctx = ldap_pvt_thread_pool_fake_context_init();
op = (Operation *)opbuf;
- connection_fake_init( &conn, op, cfb );
+ connection_fake_init( &conn, op, thrctx );
op->o_dn = be->be_rootdn;
op->o_ndn = be->be_rootndn;
}
}
}
- if ( op )
- slap_sl_mem_destroy( NULL, op->o_tmpmemctx );
+ if ( thrctx )
+ ldap_pvt_thread_pool_fake_context_destroy( thrctx );
return 0;
}
/* Cheating - we have no thread pool context for these functions,
* so make one.
*/
-typedef struct thread_keys {
- void *key;
- void *data;
- ldap_pvt_thread_pool_keyfree_t *xfree;
-} thread_keys;
-#define MAXKEYS 32
-/* A fake thread context */
-static thread_keys thrctx[MAXKEYS];
+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.
return rc;
}
- connection_fake_init( &conn, op, thrctx );
+ syncprov_thrctx = ldap_pvt_thread_pool_fake_context_init();
+ connection_fake_init( &conn, op, syncprov_thrctx );
op->o_bd = be;
op->o_dn = be->be_rootdn;
op->o_ndn = be->be_rootndn;
Operation *op = (Operation *)opbuf;
SlapReply rs = {REP_RESULT};
- connection_fake_init( &conn, op, thrctx );
+ connection_fake_init( &conn, op, syncprov_thrctx );
op->o_bd = be;
op->o_dn = be->be_rootdn;
op->o_ndn = be->be_rootndn;
syncprov_checkpoint( op, &rs, on );
}
- for ( i=0; thrctx[i].key; i++) {
- if ( thrctx[i].xfree )
- thrctx[i].xfree( thrctx[i].key, thrctx[i].data );
- thrctx[i].key = NULL;
- }
+ ldap_pvt_thread_pool_fake_context_destroy( syncprov_thrctx );
+ syncprov_thrctx = NULL;
return 0;
}