cache->c_eifree = ei->bei_lrunext;
}
ldap_pvt_thread_mutex_unlock( &cache->c_eifree_mutex );
+ ei->bei_finders = 0;
}
if ( !ei ) {
ei = ch_calloc(1, sizeof(EntryInfo));
}
ei->bei_state = CACHE_ENTRY_REFERENCED;
- ei->bei_finders = 0;
return ei;
}
bdb_id_dup_err( void *v1, void *v2 )
{
EntryInfo *e2 = v2;
- e2->bei_e = v1;
+ e2->bei_lrunext = v1;
return -1;
}
/* Add to cache ID tree */
if (avl_insert( &bdb->bi_cache.c_idtree, ei2, bdb_id_cmp,
bdb_id_dup_err )) {
- EntryInfo *eix = (EntryInfo *)ei2->bei_e;
- eix = avl_find( bdb->bi_cache.c_idtree, ei2, bdb_id_cmp );
+ EntryInfo *eix = ei2->bei_lrunext;
bdb_cache_entryinfo_free( &bdb->bi_cache, ei2 );
ei2 = eix;
#ifdef BDB_HIER
ldap_pvt_thread_rdwr_wlock( &bdb->bi_cache.c_rwlock );
if ( avl_insert( &bdb->bi_cache.c_idtree, (caddr_t)ein,
bdb_id_cmp, bdb_id_dup_err ) ) {
- EntryInfo *eix = (EntryInfo *)ein->bei_e;
+ EntryInfo *eix = ein->bei_lrunext;
/* Someone else created this node just before us.
* Free our new copy and use the existing one.
rc = DB_NOTFOUND;
} else {
(*eip)->bei_finders++;
+ (*eip)->bei_state |= CACHE_ENTRY_REFERENCED;
/* Make sure only one thread tries to load the entry */
load1:
#ifdef SLAP_ZONE_ALLOC
}
}
+/* free up any keys used by the main thread */
+void
+bdb_locker_flush( DB_ENV *env )
+{
+ void *data;
+ void *ctx = ldap_pvt_thread_pool_context();
+
+ if ( !ldap_pvt_thread_pool_getkey( ctx, env, &data, NULL ) ) {
+ ldap_pvt_thread_pool_setkey( ctx, env, NULL, NULL );
+ bdb_locker_id_free( env, data );
+ }
+}
+
int
bdb_locker_id( Operation *op, DB_ENV *env, u_int32_t *locker )
{