]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
ITS#9620 Turn mi_cache_mutex into a RW lock
authorOndřej Kuzník <okuznik@symas.com>
Thu, 29 Jul 2021 12:23:03 +0000 (13:23 +0100)
committerQuanah Gibson-Mount <quanah@openldap.org>
Fri, 6 Aug 2021 18:51:51 +0000 (18:51 +0000)
servers/slapd/back-monitor/back-monitor.h
servers/slapd/back-monitor/cache.c
servers/slapd/back-monitor/init.c

index 843321d50754b18a4af27e894700ed7fc751e5b3..3f3d81bd991b62527a6e2f119937f2a879b3ff12 100644 (file)
@@ -83,7 +83,7 @@ typedef struct monitor_info_t {
         * Internal data
         */
        Avlnode                 *mi_cache;
-       ldap_pvt_thread_mutex_t mi_cache_mutex;
+       ldap_pvt_thread_rdwr_t  mi_cache_rwlock;
 
        /*
         * Config parameters
index ac56ca374f452eec13860bc9a94c9cd4fe58d886..4815756709e7d350aa939f72cd8915701e19e329 100644 (file)
@@ -90,10 +90,10 @@ monitor_cache_add(
        mc = ( monitor_cache_t * )ch_malloc( sizeof( monitor_cache_t ) );
        mc->mc_ndn = e->e_nname;
        mc->mc_e = e;
-       ldap_pvt_thread_mutex_lock( &mi->mi_cache_mutex );
+       ldap_pvt_thread_rdwr_wlock( &mi->mi_cache_rwlock );
        rc = ldap_avl_insert( &mi->mi_cache, ( caddr_t )mc,
                        monitor_cache_cmp, monitor_cache_dup );
-       ldap_pvt_thread_mutex_unlock( &mi->mi_cache_mutex );
+       ldap_pvt_thread_rdwr_wunlock( &mi->mi_cache_rwlock );
 
        return rc;
 }
@@ -152,21 +152,21 @@ monitor_cache_get(
 
        tmp_mc.mc_ndn = *ndn;
 retry:;
-       ldap_pvt_thread_mutex_lock( &mi->mi_cache_mutex );
+       ldap_pvt_thread_rdwr_rlock( &mi->mi_cache_rwlock );
        mc = ( monitor_cache_t * )ldap_avl_find( mi->mi_cache,
                        ( caddr_t )&tmp_mc, monitor_cache_cmp );
 
        if ( mc != NULL ) {
                /* entry is returned with mutex locked */
                if ( monitor_cache_trylock( mc->mc_e ) ) {
-                       ldap_pvt_thread_mutex_unlock( &mi->mi_cache_mutex );
+                       ldap_pvt_thread_rdwr_runlock( &mi->mi_cache_rwlock );
                        ldap_pvt_thread_yield();
                        goto retry;
                }
                *ep = mc->mc_e;
        }
 
-       ldap_pvt_thread_mutex_unlock( &mi->mi_cache_mutex );
+       ldap_pvt_thread_rdwr_runlock( &mi->mi_cache_rwlock );
 
        return ( *ep == NULL ? -1 : 0 );
 }
@@ -193,7 +193,7 @@ monitor_cache_remove(
        dnParent( ndn, &pndn );
 
 retry:;
-       ldap_pvt_thread_mutex_lock( &mi->mi_cache_mutex );
+       ldap_pvt_thread_rdwr_wlock( &mi->mi_cache_rwlock );
 
        tmp_mc.mc_ndn = *ndn;
        mc = ( monitor_cache_t * )ldap_avl_find( mi->mi_cache,
@@ -203,7 +203,7 @@ retry:;
                monitor_cache_t *pmc;
 
                if ( monitor_cache_trylock( mc->mc_e ) ) {
-                       ldap_pvt_thread_mutex_unlock( &mi->mi_cache_mutex );
+                       ldap_pvt_thread_rdwr_wunlock( &mi->mi_cache_rwlock );
                        goto retry;
                }
 
@@ -217,7 +217,7 @@ retry:;
 
                        if ( monitor_cache_trylock( pmc->mc_e ) ) {
                                monitor_cache_release( mi, mc->mc_e );
-                               ldap_pvt_thread_mutex_unlock( &mi->mi_cache_mutex );
+                               ldap_pvt_thread_rdwr_wunlock( &mi->mi_cache_rwlock );
                                goto retry;
                        }
 
@@ -272,7 +272,7 @@ retry:;
                }
        }
 
-       ldap_pvt_thread_mutex_unlock( &mi->mi_cache_mutex );
+       ldap_pvt_thread_rdwr_wunlock( &mi->mi_cache_rwlock );
 
        return ( *ep == NULL ? -1 : 0 );
 }
index 5ad7e07d7a29747ae85913ec29c61f9cc3422f94..b779619893baca876872bb6ff50a5f0a04abc4d3 100644 (file)
@@ -2155,7 +2155,7 @@ monitor_back_db_init(
 
        /* NOTE: only one monitor database is allowed,
         * so we use static storage */
-       ldap_pvt_thread_mutex_init( &monitor_info.mi_cache_mutex );
+       ldap_pvt_thread_rdwr_init( &monitor_info.mi_cache_rwlock );
 
        be->be_private = &monitor_info;
 
@@ -2558,7 +2558,7 @@ monitor_back_db_destroy(
                }
        }
        
-       ldap_pvt_thread_mutex_destroy( &monitor_info.mi_cache_mutex );
+       ldap_pvt_thread_rdwr_destroy( &monitor_info.mi_cache_rwlock );
 
        be->be_private = NULL;