mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-24 00:29:35 -05:00
ITS#8747 Do not observe an epoch while calling dispose_cb
This commit is contained in:
parent
c472639170
commit
2c1bb42f01
1 changed files with 15 additions and 1 deletions
|
|
@ -112,6 +112,7 @@ epoch_join( void )
|
|||
epoch_t epoch;
|
||||
struct pending_ref *old, *ref = NULL;
|
||||
|
||||
retry:
|
||||
/* TODO: make this completely lock-free */
|
||||
ldap_pvt_thread_rdwr_rlock( &epoch_mutex );
|
||||
epoch = current_epoch;
|
||||
|
|
@ -134,6 +135,19 @@ epoch_join( void )
|
|||
current_epoch = EPOCH_NEXT(epoch);
|
||||
ldap_pvt_thread_rdwr_wunlock( &epoch_mutex );
|
||||
|
||||
if ( !ref ) {
|
||||
return epoch;
|
||||
}
|
||||
|
||||
/*
|
||||
* The below is now safe to free outside epochs and we don't want to make
|
||||
* the current epoch last any longer than necessary.
|
||||
*
|
||||
* Looks like there might be fairness issues in massively parallel
|
||||
* environments but they haven't been observed on 32-core machines.
|
||||
*/
|
||||
epoch_leave( epoch );
|
||||
|
||||
for ( old = ref; old; old = ref ) {
|
||||
ref = old->next;
|
||||
|
||||
|
|
@ -141,7 +155,7 @@ epoch_join( void )
|
|||
ch_free( old );
|
||||
}
|
||||
|
||||
return epoch;
|
||||
goto retry;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
Loading…
Reference in a new issue