From: Ondřej Kuzník Date: Thu, 29 Jul 2021 12:23:03 +0000 (+0100) Subject: ITS#9620 Turn mi_cache_mutex into a RW lock X-Git-Tag: OPENLDAP_REL_ENG_2_6_0~122 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=60c219243bd585d7995c8b4ca330c4f23c3e6901;p=thirdparty%2Fopenldap.git ITS#9620 Turn mi_cache_mutex into a RW lock --- diff --git a/servers/slapd/back-monitor/back-monitor.h b/servers/slapd/back-monitor/back-monitor.h index 843321d507..3f3d81bd99 100644 --- a/servers/slapd/back-monitor/back-monitor.h +++ b/servers/slapd/back-monitor/back-monitor.h @@ -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 diff --git a/servers/slapd/back-monitor/cache.c b/servers/slapd/back-monitor/cache.c index ac56ca374f..4815756709 100644 --- a/servers/slapd/back-monitor/cache.c +++ b/servers/slapd/back-monitor/cache.c @@ -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 ); } diff --git a/servers/slapd/back-monitor/init.c b/servers/slapd/back-monitor/init.c index 5ad7e07d7a..b779619893 100644 --- a/servers/slapd/back-monitor/init.c +++ b/servers/slapd/back-monitor/init.c @@ -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;