]> git.sur5r.net Git - openldap/commitdiff
Deleted bi_database_mutex, use DB_LOCK instead. Changed bdb_locker_id to
authorHoward Chu <hyc@openldap.org>
Sat, 29 Mar 2003 05:15:48 +0000 (05:15 +0000)
committerHoward Chu <hyc@openldap.org>
Sat, 29 Mar 2003 05:15:48 +0000 (05:15 +0000)
lookup the threadctx if no Op * is provided. (bdb_db_cache doesn't know
its thread context when it acquires a locker ID.)

servers/slapd/back-bdb/back-bdb.h
servers/slapd/back-bdb/cache.c
servers/slapd/back-bdb/dbcache.c
servers/slapd/back-bdb/init.c

index 33a7f6c857ad8d805582157199ce3cb799c7952f..e3d0c7e032dcd3b380a2f4dcacd7be8c5fe24c74 100644 (file)
@@ -110,7 +110,6 @@ struct bdb_info {
 
        int                     bi_ndatabases;
        struct bdb_db_info **bi_databases;
-       ldap_pvt_thread_mutex_t bi_database_mutex;
        int             bi_db_opflags;  /* db-specific flags */
 
        slap_mask_t     bi_defaultmask;
index d7ebd7ba1b02eea4bbbfaa8da30972f2712b6838..7bbabf84571a75545cdcc0e7081bfdba481bf8a4 100644 (file)
@@ -1143,16 +1143,24 @@ bdb_locker_id( Operation *op, DB_ENV *env, int *locker )
 {
        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( &connection_pool );
+       }
 
        /* 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();
@@ -1161,7 +1169,7 @@ bdb_locker_id( Operation *op, DB_ENV *env, int *locker )
                        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
index d7ce96003f4dbf65308f86c6005dd1bfb96833be..6d4456bde6b229eb28bfddd07c8aeb93c9aca5d1 100644 (file)
@@ -56,6 +56,9 @@ bdb_db_cache(
        struct bdb_info *bdb = (struct bdb_info *) be->be_private;
        struct bdb_db_info *db;
        char *file;
+       DBT lockobj;
+       DB_LOCK lock;
+       u_int32_t locker = 0;
 
        *dbout = NULL;
 
@@ -66,19 +69,33 @@ bdb_db_cache(
                }
        }
 
-       ldap_pvt_thread_mutex_lock( &bdb->bi_database_mutex );
+       lockobj.data = "bdb_db_cache";
+       lockobj.size = sizeof("bdb_db_cache");
+
+       if (tid) {
+               locker = TXN_ID( tid );
+       } else {
+#ifdef BDB_REUSE_LOCKERS
+#define        op      NULL    /* implicit arg in LOCK_ID */
+#endif
+               rc = LOCK_ID( bdb->bi_dbenv, &locker );
+               if (rc) return rc;
+       }
+       rc = LOCK_GET( bdb->bi_dbenv, locker, 0, &lockobj,
+               DB_LOCK_WRITE, &lock );
+       if (rc) return rc;
 
        /* check again! may have been added by another thread */
        for( i=BDB_NDB; bdb->bi_databases[i]; i++ ) {
                if( !strcmp( bdb->bi_databases[i]->bdi_name, name) ) {
                        *dbout = bdb->bi_databases[i]->bdi_db;
-                       ldap_pvt_thread_mutex_unlock( &bdb->bi_database_mutex );
+                       LOCK_PUT( bdb->bi_dbenv, &lock);
                        return 0;
                }
        }
 
        if( i >= BDB_INDICES ) {
-               ldap_pvt_thread_mutex_unlock( &bdb->bi_database_mutex );
+               LOCK_PUT( bdb->bi_dbenv, &lock);
                return -1;
        }
 
@@ -97,7 +114,7 @@ bdb_db_cache(
                        "bdb_db_cache: db_create(%s) failed: %s (%d)\n",
                        bdb->bi_dbenv_home, db_strerror(rc), rc );
 #endif
-               ldap_pvt_thread_mutex_unlock( &bdb->bi_database_mutex );
+               LOCK_PUT( bdb->bi_dbenv, &lock);
                return rc;
        }
 
@@ -131,7 +148,7 @@ bdb_db_cache(
                        "bdb_db_cache: db_open(%s) failed: %s (%d)\n",
                        name, db_strerror(rc), rc );
 #endif
-               ldap_pvt_thread_mutex_unlock( &bdb->bi_database_mutex );
+               LOCK_PUT( bdb->bi_dbenv, &lock);
                return rc;
        }
 
@@ -141,6 +158,6 @@ bdb_db_cache(
 
        *dbout = db->bdi_db;
 
-       ldap_pvt_thread_mutex_unlock( &bdb->bi_database_mutex );
+       LOCK_PUT( bdb->bi_dbenv, &lock );
        return 0;
 }
index c99c70a7bbfbafaf4e2194cc0a39d331deeb9ff6..0619f92cc8b3e2be7067f6ca26e0857c69f621bc 100644 (file)
@@ -98,7 +98,6 @@ bdb_db_init( BackendDB *be )
        LDAP_LIST_INIT (&bdb->psearch_list);
 #endif
 
-       ldap_pvt_thread_mutex_init( &bdb->bi_database_mutex );
        ldap_pvt_thread_mutex_init( &bdb->bi_lastid_mutex );
        ldap_pvt_thread_mutex_init( &bdb->bi_cache.lru_mutex );
        ldap_pvt_thread_rdwr_init ( &bdb->bi_cache.c_rwlock );
@@ -525,7 +524,6 @@ bdb_db_destroy( BackendDB *be )
        ldap_pvt_thread_rdwr_destroy ( &bdb->bi_cache.c_rwlock );
        ldap_pvt_thread_mutex_destroy( &bdb->bi_cache.lru_mutex );
        ldap_pvt_thread_mutex_destroy( &bdb->bi_lastid_mutex );
-       ldap_pvt_thread_mutex_destroy( &bdb->bi_database_mutex );
 
        ch_free( bdb );
        be->be_private = NULL;