ITS#9785 clear runqueue task as soon as it's getting started

This commit is contained in:
Ondřej Kuzník 2022-01-25 18:14:01 +00:00
parent 209ee9b082
commit ca19a774f6
2 changed files with 14 additions and 2 deletions

View File

@ -2421,6 +2421,18 @@ slap_listener_activate(
return rc;
}
static void *
slapd_rtask_trampoline(
void *ctx,
void *arg )
{
struct re_s *rtask = arg;
/* invalidate pool_cookie */
rtask->pool_cookie = NULL;
return rtask->routine( ctx, arg );
}
static void *
slapd_daemon_task(
void *ptr )
@ -2784,7 +2796,7 @@ loop:
ldap_pvt_runqueue_resched( &slapd_rq, rtask, 0 );
ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );
ldap_pvt_thread_pool_submit2( &connection_pool,
rtask->routine, (void *) rtask, &rtask->pool_cookie );
slapd_rtask_trampoline, (void *) rtask, &rtask->pool_cookie );
ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );
}
rtask = ldap_pvt_runqueue_next_sched( &slapd_rq, &cat );

View File

@ -7599,7 +7599,7 @@ syncrepl_config( ConfigArgs *c )
ldap_pvt_runqueue_stoptask( &slapd_rq, re );
isrunning = 1;
}
if ( ldap_pvt_thread_pool_retract( re->pool_cookie ) > 0 )
if ( !re->pool_cookie || ldap_pvt_thread_pool_retract( re->pool_cookie ) > 0 )
isrunning = 0;
ldap_pvt_runqueue_remove( &slapd_rq, re );