X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-bdb%2Fcache.c;h=961c047e2bf5bac87f9a6ca3987c265196f22dc0;hb=08059f1633bfd9d0a709761b026bdb8e4441c6e6;hp=8f20bcee6ff0f1b9559a3a91b98d3d7f815cc12d;hpb=6107ba67d2fd7eadb23ffdd1d284306011ef4013;p=openldap diff --git a/servers/slapd/back-bdb/cache.c b/servers/slapd/back-bdb/cache.c index 8f20bcee6f..961c047e2b 100644 --- a/servers/slapd/back-bdb/cache.c +++ b/servers/slapd/back-bdb/cache.c @@ -149,6 +149,17 @@ bdb_cache_entry_db_lock lockobj.size = e->e_nname.bv_len; 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; } @@ -1100,3 +1111,57 @@ bdb_lru_print( Cache *cache ) } } #endif + +#ifdef BDB_REUSE_LOCKERS +void +bdb_locker_id_free( void *key, void *data ) +{ + DB_ENV *env = key; + int lockid = (int) data; + + XLOCK_ID_FREE( env, lockid ); +} + +int +bdb_locker_id( Operation *op, DB_ENV *env, int *locker ) +{ + int i, rc, lockid; + void *data; + + if ( !env || !op || !locker ) return -1; + + /* Shouldn't happen unless we're single-threaded */ + if ( !op->o_threadctx ) { + *locker = 0; + return 0; + } + + if ( ldap_pvt_thread_pool_getkey( op->o_threadctx, env, &data, NULL ) ) { + for ( i=0, rc=1; rc != 0 && i<4; i++ ) { + rc = XLOCK_ID( env, &lockid ); + if (rc) ldap_pvt_thread_yield(); + } + if ( rc != 0) { + return rc; + } + data = (void *)lockid; + if ( ( rc = ldap_pvt_thread_pool_setkey( op->o_threadctx, env, + data, bdb_locker_id_free ) ) ) { + XLOCK_ID_FREE( env, lockid ); +#ifdef NEW_LOGGING + LDAP_LOG( BACK_BDB, ERR, "bdb_locker_id: err %s(%d)\n", + db_strerror(rc), rc, 0 ); +#else + Debug( LDAP_DEBUG_ANY, "bdb_locker_id: err %s(%d)\n", + db_strerror(rc), rc, 0 ); +#endif + + return rc; + } + } else { + lockid = (int)data; + } + *locker = lockid; + return 0; +} +#endif