ITS#6335 Don't reuse a modtarget someone is about to remove

This commit is contained in:
Rein Tollevik 2009-10-16 17:27:18 +00:00
parent eefe62b597
commit 739f8d0753

View File

@ -1324,15 +1324,14 @@ syncprov_op_cleanup( Operation *op, SlapReply *rs )
/* Remove op from lock table */
mt = opc->smt;
if ( mt ) {
modinst *mi = mt->mt_mods;
/* If there are more, promote the next one */
if ( mi->mi_next ) {
ldap_pvt_thread_mutex_lock( &mt->mt_mutex );
mt->mt_mods = mi->mi_next;
mt->mt_mods = mt->mt_mods->mi_next;
/* If there are more, promote the next one */
if ( mt->mt_mods ) {
mt->mt_op = mt->mt_mods->mi_op;
ldap_pvt_thread_mutex_unlock( &mt->mt_mutex );
} else {
ldap_pvt_thread_mutex_unlock( &mt->mt_mutex );
ldap_pvt_thread_mutex_lock( &si->si_mods_mutex );
avl_delete( &si->si_mods, mt, sp_avl_cmp );
ldap_pvt_thread_mutex_unlock( &si->si_mods_mutex );
@ -1946,6 +1945,15 @@ syncprov_op_mod( Operation *op, SlapReply *rs )
mt = avl_find( si->si_mods, &mtdummy, sp_avl_cmp );
if ( mt ) {
ldap_pvt_thread_mutex_lock( &mt->mt_mutex );
if ( mt->mt_mods == NULL ) {
/* Cannot reuse this mt, as another thread is about
* to release it in syncprov_op_cleanup.
*/
ldap_pvt_thread_mutex_unlock( &mt->mt_mutex );
mt = NULL;
}
}
if ( mt ) {
ldap_pvt_thread_mutex_unlock( &si->si_mods_mutex );
mt->mt_tail->mi_next = mi;
mt->mt_tail = mi;