From: Ondřej Kuzník Date: Tue, 25 Jan 2022 18:14:01 +0000 (+0000) Subject: ITS#9785 clear runqueue task as soon as it's getting started X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ca19a774f6e78176c6b79ddc0b9340b2a46bd0cb;p=thirdparty%2Fopenldap.git ITS#9785 clear runqueue task as soon as it's getting started --- diff --git a/servers/slapd/daemon.c b/servers/slapd/daemon.c index d08422e368..194d4cfb59 100644 --- a/servers/slapd/daemon.c +++ b/servers/slapd/daemon.c @@ -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 ); diff --git a/servers/slapd/syncrepl.c b/servers/slapd/syncrepl.c index 5c46b89f6a..47a773f4d7 100644 --- a/servers/slapd/syncrepl.c +++ b/servers/slapd/syncrepl.c @@ -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 );