mirror of
https://git.openldap.org/openldap/openldap.git
synced 2026-01-05 06:31:11 -05:00
ITS#9045 rlock only if there may be other threads
We can't rlock if we've registered ourselves as a writer. We can only figure that out by checking if we're the thread that initiated the pause: is the server paused already?
This commit is contained in:
parent
5ccbe63246
commit
12bf5a95ba
3 changed files with 15 additions and 5 deletions
|
|
@ -253,7 +253,8 @@ typedef enum {
|
|||
LDAP_PVT_THREAD_POOL_PARAM_ACTIVE_MAX,
|
||||
LDAP_PVT_THREAD_POOL_PARAM_PENDING_MAX,
|
||||
LDAP_PVT_THREAD_POOL_PARAM_BACKLOAD_MAX,
|
||||
LDAP_PVT_THREAD_POOL_PARAM_STATE
|
||||
LDAP_PVT_THREAD_POOL_PARAM_STATE,
|
||||
LDAP_PVT_THREAD_POOL_PARAM_PAUSED
|
||||
} ldap_pvt_thread_pool_param_t;
|
||||
#endif /* !LDAP_PVT_THREAD_H_DONE */
|
||||
|
||||
|
|
|
|||
|
|
@ -769,6 +769,12 @@ ldap_pvt_thread_pool_query(
|
|||
}
|
||||
break;
|
||||
|
||||
case LDAP_PVT_THREAD_POOL_PARAM_PAUSED:
|
||||
ldap_pvt_thread_mutex_lock(&pool->ltp_mutex);
|
||||
count = (pool->ltp_pause == PAUSED);
|
||||
ldap_pvt_thread_mutex_unlock(&pool->ltp_mutex);
|
||||
break;
|
||||
|
||||
case LDAP_PVT_THREAD_POOL_PARAM_UNKNOWN:
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6900,13 +6900,16 @@ int config_back_entry_get(
|
|||
CfBackInfo *cfb;
|
||||
CfEntryInfo *ce, *last;
|
||||
Entry *e = NULL;
|
||||
int locked = 0, rc = LDAP_NO_SUCH_OBJECT;
|
||||
int paused = 0, rc = LDAP_NO_SUCH_OBJECT;
|
||||
|
||||
cfb = (CfBackInfo *)op->o_bd->be_private;
|
||||
|
||||
if ( !ldap_pvt_thread_pool_pausequery( &connection_pool ) ) {
|
||||
if ( ldap_pvt_thread_pool_query( &connection_pool,
|
||||
LDAP_PVT_THREAD_POOL_PARAM_PAUSED, &paused ) ) {
|
||||
return -1;
|
||||
}
|
||||
if ( !paused ) {
|
||||
ldap_pvt_thread_rdwr_rlock( &cfb->cb_rwlock );
|
||||
locked = 1;
|
||||
}
|
||||
ce = config_find_base( cfb->cb_root, ndn, &last );
|
||||
if ( ce ) {
|
||||
|
|
@ -6922,7 +6925,7 @@ int config_back_entry_get(
|
|||
if ( e ) {
|
||||
*ent = entry_dup( e );
|
||||
}
|
||||
if ( locked )
|
||||
if ( !paused )
|
||||
ldap_pvt_thread_rdwr_runlock( &cfb->cb_rwlock );
|
||||
|
||||
return rc;
|
||||
|
|
|
|||
Loading…
Reference in a new issue