/* cache.c - routines to maintain an in-core cache of entries */
/* $OpenLDAP$ */
/*
- * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file
*/
/* BDB backend specific entry info -- visible only to the cache */
typedef struct bdb_entry_info {
+#if 0
ldap_pvt_thread_rdwr_t bei_rdwr; /* reader/writer lock */
+#endif
/*
* remaining fields require backend cache lock to access
static void bdb_lru_print(Cache *cache);
#endif
+#if 0 /* unused */
static int
bdb_cache_entry_rdwr_lock(Entry *e, int rw)
{
else
return ldap_pvt_thread_rdwr_runlock(&BEI(e)->bei_rdwr);
}
+#endif /* unused */
+#if 0
static int
bdb_cache_entry_rdwr_init(Entry *e)
{
{
return ldap_pvt_thread_rdwr_destroy( &BEI(e)->bei_rdwr );
}
+#endif
static int
bdb_cache_entry_private_init( Entry *e )
e->e_private = ch_calloc(1, sizeof(struct bdb_entry_info));
+#if 0
if( bdb_cache_entry_rdwr_init( e ) != 0 ) {
free( BEI(e) );
e->e_private = NULL;
return 1;
}
+#endif
return 0;
}
bdb_cache_entry_db_lock
( DB_ENV *env, u_int32_t locker, Entry *e, int rw, u_int32_t flags, DB_LOCK *lock )
{
+#ifdef NO_THREADS
+ return 0;
+#else
int rc;
DBT lockobj;
int db_rw;
else
db_rw = DB_LOCK_READ;
+#if 0
lockobj.data = e->e_nname.bv_val;
lockobj.size = e->e_nname.bv_len;
+#else
+ lockobj.data = &e->e_private;
+ lockobj.size = sizeof(e->e_private);
+#endif
rc = LOCK_GET(env, locker, flags | DB_LOCK_NOWAIT,
&lockobj, db_rw, lock);
+ if (rc) {
+#ifdef NEW_LOGGING
+ LDAP_LOG( CACHE, DETAIL1,
+ "bdb_cache_entry_db_lock: entry %s, rw %d, rc %d\n",
+ e->e_nname.bv_val, rw, rc );
+#else
+ Debug( LDAP_DEBUG_TRACE,
+ "bdb_cache_entry_db_lock: entry %s, rw %d, rc %d\n",
+ e->e_nname.bv_val, rw, rc );
+#endif
+ }
return rc;
+#endif /* NO_THREADS */
}
int
bdb_cache_entry_db_unlock
( DB_ENV *env, DB_LOCK *lock )
{
+#ifdef NO_THREADS
+ return 0;
+#else
int rc;
rc = LOCK_PUT ( env, lock );
return rc;
+#endif
}
/*
{
assert( e->e_private );
+#if 0
bdb_cache_entry_rdwr_destroy( e );
+#endif
free( e->e_private );
e->e_private = NULL;
}
if ( avl_insert( &cache->c_dntree, (caddr_t) e,
- (AVL_CMP) entry_dn_cmp, avl_dup_error ) != 0 )
+ entry_dn_cmp, avl_dup_error ) != 0 )
{
/* free cache write lock */
ldap_pvt_thread_rdwr_wunlock( &cache->c_rwlock );
/* id tree */
if ( avl_insert( &cache->c_idtree, (caddr_t) e,
- (AVL_CMP) entry_id_cmp, avl_dup_error ) != 0 )
+ entry_id_cmp, avl_dup_error ) != 0 )
{
#ifdef NEW_LOGGING
LDAP_LOG( CACHE, DETAIL1,
/* delete from dn tree inserted above */
if ( avl_delete( &cache->c_dntree, (caddr_t) e,
- (AVL_CMP) entry_dn_cmp ) == NULL )
+ entry_dn_cmp ) == NULL )
{
#ifdef NEW_LOGGING
LDAP_LOG( CACHE, INFO,
case DB_LOCK_NOTGRANTED :
/* undo avl changes immediately */
if ( avl_delete( &cache->c_idtree, (caddr_t) e,
- (AVL_CMP) entry_id_cmp ) == NULL ) {
+ entry_id_cmp ) == NULL ) {
#ifdef NEW_LOGGING
LDAP_LOG( CACHE, INFO,
"bdb_cache_add_entry: can't delete (%s) from cache.\n",
#endif
}
if ( avl_delete( &cache->c_dntree, (caddr_t) e,
- (AVL_CMP) entry_dn_cmp ) == NULL ) {
+ entry_dn_cmp ) == NULL ) {
#ifdef NEW_LOGGING
LDAP_LOG( CACHE, INFO,
"bdb_cache_add_entry: can't delete (%s) from cache.\n",
assert( e->e_private );
if ( avl_insert( &cache->c_dntree, (caddr_t) e,
- (AVL_CMP) entry_dn_cmp, avl_dup_error ) != 0 )
+ entry_dn_cmp, avl_dup_error ) != 0 )
{
#ifdef NEW_LOGGING
LDAP_LOG( CACHE, DETAIL1,
/* id tree */
if ( avl_insert( &cache->c_idtree, (caddr_t) e,
- (AVL_CMP) entry_id_cmp, avl_dup_error ) != 0 )
+ entry_id_cmp, avl_dup_error ) != 0 )
{
#ifdef NEW_LOGGING
LDAP_LOG( CACHE, DETAIL1,
/* delete from dn tree inserted above */
if ( avl_delete( &cache->c_dntree, (caddr_t) e,
- (AVL_CMP) entry_dn_cmp ) == NULL )
+ entry_dn_cmp ) == NULL )
{
#ifdef NEW_LOGGING
LDAP_LOG( CACHE, INFO,
ldap_pvt_thread_rdwr_rlock( &cache->c_rwlock );
if ( (ep = (Entry *) avl_find( cache->c_dntree, (caddr_t) &e,
- (AVL_CMP) entry_dn_cmp )) != NULL )
+ entry_dn_cmp )) != NULL )
{
int state;
count++;
/*
* entry is deleted or not fully created yet
*/
- if ( state != CACHE_ENTRY_READY ) {
+ if ( state != CACHE_ENTRY_READY && state != CACHE_ENTRY_COMMITTED ) {
assert(state != CACHE_ENTRY_UNDEFINED);
/* free cache read lock */
ldap_pvt_thread_rdwr_rlock( &cache->c_rwlock );
if ( (ep = (Entry *) avl_find( cache->c_idtree, (caddr_t) &e,
- (AVL_CMP) entry_id_cmp )) != NULL )
+ entry_id_cmp )) != NULL )
{
int state;
ID ep_id;
/*
* entry is deleted or not fully created yet
*/
- if ( state != CACHE_ENTRY_READY ) {
+ if ( state != CACHE_ENTRY_READY && state != CACHE_ENTRY_COMMITTED ) {
assert(state != CACHE_ENTRY_UNDEFINED);
int rc = 0; /* return code */
/* dn tree */
- if ( avl_delete( &cache->c_dntree, (caddr_t) e, (AVL_CMP) entry_dn_cmp )
- == NULL )
+ if ( avl_delete( &cache->c_dntree, (caddr_t) e, entry_dn_cmp ) == NULL )
{
rc = -1;
}
/* id tree */
- if ( avl_delete( &cache->c_idtree, (caddr_t) e, (AVL_CMP) entry_id_cmp )
- == NULL )
+ if ( avl_delete( &cache->c_idtree, (caddr_t) e, entry_id_cmp ) == NULL )
{
rc = -1;
}
{
int i, rc, lockid;
void *data;
+ void *ctx;
- if ( !env || !op || !locker ) return -1;
+ if ( !env || !locker ) return -1;
+
+ /* If no op was provided, try to find the ctx anyway... */
+ if ( op ) {
+ ctx = op->o_threadctx;
+ } else {
+ ctx = ldap_pvt_thread_pool_context();
+ }
/* Shouldn't happen unless we're single-threaded */
- if ( !op->o_threadctx ) {
+ if ( !ctx ) {
*locker = 0;
return 0;
}
- if ( ldap_pvt_thread_pool_getkey( op->o_threadctx, env, &data, NULL ) ) {
+ if ( ldap_pvt_thread_pool_getkey( ctx, env, &data, NULL ) ) {
for ( i=0, rc=1; rc != 0 && i<4; i++ ) {
rc = XLOCK_ID( env, &lockid );
if (rc) ldap_pvt_thread_yield();
return rc;
}
data = (void *)lockid;
- if ( ( rc = ldap_pvt_thread_pool_setkey( op->o_threadctx, env,
+ if ( ( rc = ldap_pvt_thread_pool_setkey( ctx, env,
data, bdb_locker_id_free ) ) ) {
XLOCK_ID_FREE( env, lockid );
#ifdef NEW_LOGGING