From ca19a774f6e78176c6b79ddc0b9340b2a46bd0cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Kuzn=C3=ADk?= Date: Tue, 25 Jan 2022 18:14:01 +0000 Subject: [PATCH] ITS#9785 clear runqueue task as soon as it's getting started --- servers/slapd/daemon.c | 14 +++++++++++++- servers/slapd/syncrepl.c | 2 +- 2 files changed, 14 insertions(+), 2 deletions(-) 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 );