]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-bdb/cache.c
Hallvard B. Furuseth's patch for cache lock and mutex
[openldap] / servers / slapd / back-bdb / cache.c
index f26541a57c92b009d97dc56d21aec5a6b54e4413..5038db4bc799bacf7dbe6f7982e621f379a1a0db 100644 (file)
@@ -167,8 +167,8 @@ bdb_cache_return_entry_rw( Cache *cache, Entry *e, int rw )
        ID id;
        int refcnt, freeit = 1;
 
-       /* set cache mutex */
-       ldap_pvt_thread_mutex_lock( &cache->c_mutex );
+       /* set cache write lock */
+       ldap_pvt_thread_rdwr_wlock( &cache->c_rwlock );
 
        assert( e->e_private );
 
@@ -183,7 +183,11 @@ bdb_cache_return_entry_rw( Cache *cache, Entry *e, int rw )
         * for instance)
         */
        if (  BEI(e)->bei_state == CACHE_ENTRY_CREATING ) {
+               /* set lru mutex */
+               ldap_pvt_thread_mutex_lock( &cache->lru_mutex );
                bdb_cache_delete_entry_internal( cache, e );
+               /* free lru mutex */
+               ldap_pvt_thread_mutex_unlock( &cache->lru_mutex );
                freeit = 0;
                /* now the entry is in DELETED state */
        }
@@ -191,8 +195,8 @@ bdb_cache_return_entry_rw( Cache *cache, Entry *e, int rw )
        if ( BEI(e)->bei_state == CACHE_ENTRY_COMMITTED ) {
                BEI(e)->bei_state = CACHE_ENTRY_READY;
 
-               /* free cache mutex */
-               ldap_pvt_thread_mutex_unlock( &cache->c_mutex );
+               /* free cache write lock */
+               ldap_pvt_thread_rdwr_wunlock( &cache->c_rwlock );
 
 #ifdef NEW_LOGGING
                LDAP_LOG(( "cache", LDAP_LEVEL_DETAIL1,
@@ -207,8 +211,8 @@ bdb_cache_return_entry_rw( Cache *cache, Entry *e, int rw )
 
        } else if ( BEI(e)->bei_state == CACHE_ENTRY_DELETED ) {
                if( refcnt > 0 ) {
-                       /* free cache mutex */
-                       ldap_pvt_thread_mutex_unlock( &cache->c_mutex );
+                       /* free cache write lock */
+                       ldap_pvt_thread_rdwr_wunlock( &cache->c_rwlock );
 
 #ifdef NEW_LOGGING
                        LDAP_LOG(( "cache", LDAP_LEVEL_DETAIL1,
@@ -226,8 +230,8 @@ bdb_cache_return_entry_rw( Cache *cache, Entry *e, int rw )
                                bdb_entry_return( e );
                        }
 
-                       /* free cache mutex */
-                       ldap_pvt_thread_mutex_unlock( &cache->c_mutex );
+                       /* free cache write lock */
+                       ldap_pvt_thread_rdwr_wunlock( &cache->c_rwlock );
 
 #ifdef NEW_LOGGING
                        LDAP_LOG(( "cache", LDAP_LEVEL_DETAIL1,
@@ -241,8 +245,8 @@ bdb_cache_return_entry_rw( Cache *cache, Entry *e, int rw )
                }
 
        } else {
-               /* free cache mutex */
-               ldap_pvt_thread_mutex_unlock( &cache->c_mutex );
+               /* free cache write lock */
+               ldap_pvt_thread_rdwr_wunlock( &cache->c_rwlock );
 
 #ifdef NEW_LOGGING
                LDAP_LOG(( "cache", LDAP_LEVEL_DETAIL1,
@@ -302,14 +306,14 @@ bdb_cache_add_entry_rw(
                   "bdb_cache_add_entry_rw: add (%s):%s to cache\n",
                   e->e_dn, rw ? "w" : "r" ));
 #endif
-       /* set cache mutex */
-       ldap_pvt_thread_mutex_lock( &cache->c_mutex );
+       /* set cache write lock */
+       ldap_pvt_thread_rdwr_wlock( &cache->c_rwlock );
 
        assert( e->e_private == NULL );
 
        if( bdb_cache_entry_private_init(e) != 0 ) {
-               /* free cache mutex */
-               ldap_pvt_thread_mutex_unlock( &cache->c_mutex );
+               /* free cache write lock */
+               ldap_pvt_thread_rdwr_wunlock( &cache->c_rwlock );
 
 #ifdef NEW_LOGGING
                LDAP_LOG(( "cache", LDAP_LEVEL_ERR,
@@ -328,8 +332,8 @@ bdb_cache_add_entry_rw(
        if ( avl_insert( &cache->c_dntree, (caddr_t) e,
                (AVL_CMP) entry_dn_cmp, avl_dup_error ) != 0 )
        {
-               /* free cache mutex */
-               ldap_pvt_thread_mutex_unlock( &cache->c_mutex );
+               /* free cache write lock */
+               ldap_pvt_thread_rdwr_wunlock( &cache->c_rwlock );
 
 #ifdef NEW_LOGGING
                LDAP_LOG(( "cache", LDAP_LEVEL_DETAIL1,
@@ -376,8 +380,8 @@ bdb_cache_add_entry_rw(
 
                bdb_cache_entry_private_destroy(e);
 
-               /* free cache mutex */
-               ldap_pvt_thread_mutex_unlock( &cache->c_mutex );
+               /* free cache write lock */
+               ldap_pvt_thread_rdwr_wunlock( &cache->c_rwlock );
                return( -1 );
        }
 
@@ -388,6 +392,8 @@ bdb_cache_add_entry_rw(
        BEI(e)->bei_state = CACHE_ENTRY_CREATING;
        BEI(e)->bei_refcnt = 1;
 
+       /* set lru mutex */
+       ldap_pvt_thread_mutex_lock( &cache->lru_mutex );
        /* lru */
        LRU_ADD( cache, e );
        if ( ++cache->c_cursize > cache->c_maxsize ) {
@@ -426,8 +432,10 @@ bdb_cache_add_entry_rw(
                }
        }
 
-       /* free cache mutex */
-       ldap_pvt_thread_mutex_unlock( &cache->c_mutex );
+       /* free lru mutex */
+       ldap_pvt_thread_mutex_unlock( &cache->lru_mutex );
+       /* free cache write lock */
+       ldap_pvt_thread_rdwr_wunlock( &cache->c_rwlock );
        return( 0 );
 }
 
@@ -446,8 +454,8 @@ bdb_cache_update_entry(
        int     i, rc;
        Entry   *ee;
 
-       /* set cache mutex */
-       ldap_pvt_thread_mutex_lock( &cache->c_mutex );
+       /* set cache write lock */
+       ldap_pvt_thread_rdwr_wlock( &cache->c_rwlock );
 
        assert( e->e_private );
 
@@ -464,8 +472,8 @@ bdb_cache_update_entry(
                    e->e_id, e->e_dn, 0 );
 #endif
 
-               /* free cache mutex */
-               ldap_pvt_thread_mutex_unlock( &cache->c_mutex );
+               /* free cache write lock */
+               ldap_pvt_thread_rdwr_wunlock( &cache->c_rwlock );
                return( 1 );
        }
 
@@ -497,8 +505,8 @@ bdb_cache_update_entry(
 #endif
                }
 
-               /* free cache mutex */
-               ldap_pvt_thread_mutex_unlock( &cache->c_mutex );
+               /* free cache write lock */
+               ldap_pvt_thread_rdwr_wunlock( &cache->c_rwlock );
                return( -1 );
        }
 
@@ -507,6 +515,8 @@ bdb_cache_update_entry(
        /* will be marked after when entry is returned */
        BEI(e)->bei_state = CACHE_ENTRY_CREATING;
 
+       /* set lru mutex */
+       ldap_pvt_thread_mutex_lock( &cache->lru_mutex );
        /* lru */
        LRU_ADD( cache, e );
        if ( ++cache->c_cursize > cache->c_maxsize ) {
@@ -545,8 +555,10 @@ bdb_cache_update_entry(
                }
        }
 
-       /* free cache mutex */
-       ldap_pvt_thread_mutex_unlock( &cache->c_mutex );
+       /* free lru mutex */
+       ldap_pvt_thread_mutex_unlock( &cache->lru_mutex );
+       /* free cache write lock */
+       ldap_pvt_thread_rdwr_wunlock( &cache->c_rwlock );
        return( 0 );
 }
 
@@ -565,8 +577,8 @@ bdb_cache_find_entry_ndn2id(
        e.e_nname = *ndn;
 
 try_again:
-       /* set cache mutex */
-       ldap_pvt_thread_mutex_lock( &cache->c_mutex );
+       /* set cache read lock */
+       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 )
@@ -592,8 +604,8 @@ try_again:
                if ( state != CACHE_ENTRY_READY ) {
                        assert(state != CACHE_ENTRY_UNDEFINED);
 
-                       /* free cache mutex */
-                       ldap_pvt_thread_mutex_unlock( &cache->c_mutex );
+                       /* free cache read lock */
+                       ldap_pvt_thread_rdwr_runlock( &cache->c_rwlock );
 
 #ifdef NEW_LOGGING
                        LDAP_LOG(( "cache", LDAP_LEVEL_INFO,
@@ -610,12 +622,18 @@ try_again:
                        goto try_again;
                }
 
+               /* free cache read lock */
+               ldap_pvt_thread_rdwr_runlock( &cache->c_rwlock );
+
+               /* set lru mutex */
+               ldap_pvt_thread_mutex_lock( &cache->lru_mutex );
+
                /* lru */
                LRU_DELETE( cache, ep );
                LRU_ADD( cache, ep );
                
-               /* free cache mutex */
-               ldap_pvt_thread_mutex_unlock( &cache->c_mutex );
+               /* free lru mutex */
+               ldap_pvt_thread_mutex_unlock( &cache->lru_mutex );
 
 #ifdef NEW_LOGGING
                LDAP_LOG(( "cache", LDAP_LEVEL_DETAIL1,
@@ -628,8 +646,8 @@ try_again:
 #endif
 
        } else {
-               /* free cache mutex */
-               ldap_pvt_thread_mutex_unlock( &cache->c_mutex );
+               /* free cache read lock */
+               ldap_pvt_thread_rdwr_runlock( &cache->c_rwlock );
 
                id = NOID;
        }
@@ -655,8 +673,8 @@ bdb_cache_find_entry_id(
        e.e_id = id;
 
 try_again:
-       /* set cache mutex */
-       ldap_pvt_thread_mutex_lock( &cache->c_mutex );
+       /* set 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 )
@@ -678,8 +696,8 @@ try_again:
 
                        assert(state != CACHE_ENTRY_UNDEFINED);
 
-                       /* free cache mutex */
-                       ldap_pvt_thread_mutex_unlock( &cache->c_mutex );
+                       /* free cache read lock */
+                       ldap_pvt_thread_rdwr_runlock( &cache->c_rwlock );
 
 #ifdef NEW_LOGGING
                        LDAP_LOG(( "cache", LDAP_LEVEL_INFO,
@@ -703,8 +721,8 @@ try_again:
                         * so, unlock the cache, yield, and try again.
                         */
 
-                       /* free cache mutex */
-                       ldap_pvt_thread_mutex_unlock( &cache->c_mutex );
+                       /* free cache read lock */
+                       ldap_pvt_thread_rdwr_runlock( &cache->c_rwlock );
 
 #ifdef NEW_LOGGING
                        LDAP_LOG(( "cache", LDAP_LEVEL_INFO,
@@ -720,14 +738,18 @@ try_again:
                        goto try_again;
                }
 
+               /* free cache read lock */
+               ldap_pvt_thread_rdwr_runlock( &cache->c_rwlock );
+               /* set lru mutex */
+               ldap_pvt_thread_mutex_lock( &cache->lru_mutex );
                /* lru */
                LRU_DELETE( cache, ep );
                LRU_ADD( cache, ep );
                
                BEI(ep)->bei_refcnt++;
 
-               /* free cache mutex */
-               ldap_pvt_thread_mutex_unlock( &cache->c_mutex );
+               /* free lru mutex */
+               ldap_pvt_thread_mutex_unlock( &cache->lru_mutex );
 
 #ifdef NEW_LOGGING
                LDAP_LOG(( "cache", LDAP_LEVEL_DETAIL1,
@@ -743,8 +765,8 @@ try_again:
                return( ep );
        }
 
-       /* free cache mutex */
-       ldap_pvt_thread_mutex_unlock( &cache->c_mutex );
+       /* free cache read lock */
+       ldap_pvt_thread_rdwr_runlock( &cache->c_rwlock );
 
        return( NULL );
 }
@@ -768,8 +790,8 @@ bdb_cache_delete_entry(
 {
        int     rc;
 
-       /* set cache mutex */
-       ldap_pvt_thread_mutex_lock( &cache->c_mutex );
+       /* set cache write lock */
+       ldap_pvt_thread_rdwr_wlock( &cache->c_rwlock );
 
        assert( e->e_private );
 
@@ -781,10 +803,14 @@ bdb_cache_delete_entry(
                e->e_id, 0, 0 );
 #endif
 
+       /* set lru mutex */
+       ldap_pvt_thread_mutex_lock( &cache->lru_mutex );
        rc = bdb_cache_delete_entry_internal( cache, e );
+       /* free lru mutex */
+       ldap_pvt_thread_mutex_unlock( &cache->lru_mutex );
 
-       /* free cache mutex */
-       ldap_pvt_thread_mutex_unlock( &cache->c_mutex );
+       /* free cache write lock */
+       ldap_pvt_thread_rdwr_wunlock( &cache->c_rwlock );
        return( rc );
 }
 
@@ -832,8 +858,10 @@ bdb_cache_release_all( Cache *cache )
        Entry *e;
        int rc;
 
-       /* set cache mutex */
-       ldap_pvt_thread_mutex_lock( &cache->c_mutex );
+       /* set cache write lock */
+       ldap_pvt_thread_rdwr_wlock( &cache->c_rwlock );
+       /* set lru mutex */
+       ldap_pvt_thread_mutex_lock( &cache->lru_mutex );
 
 #ifdef NEW_LOGGING
        LDAP_LOG(( "cache", LDAP_LEVEL_ENTRY,
@@ -864,8 +892,10 @@ bdb_cache_release_all( Cache *cache )
 
        }
 
-       /* free cache mutex */
-       ldap_pvt_thread_mutex_unlock( &cache->c_mutex );
+       /* free lru mutex */
+       ldap_pvt_thread_mutex_unlock( &cache->lru_mutex );
+       /* free cache write lock */
+       ldap_pvt_thread_rdwr_wunlock( &cache->c_rwlock );
 }
 
 #ifdef LDAP_DEBUG