]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
ITS#9785 clear runqueue task as soon as it's getting started
authorOndřej Kuzník <ondra@mistotebe.net>
Tue, 25 Jan 2022 18:14:01 +0000 (18:14 +0000)
committerQuanah Gibson-Mount <quanah@openldap.org>
Wed, 2 Feb 2022 17:13:13 +0000 (17:13 +0000)
servers/slapd/daemon.c
servers/slapd/syncrepl.c

index c982cc9435eade64fe3ea21d621ddb24a0fa49ed..2f78b77c7fb7067a3db4950f1b42910cf4442f7c 100644 (file)
@@ -2412,6 +2412,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 )
@@ -2775,7 +2787,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 );
index bccef383e8768ece096fb450b7dd8636a2e76278..1ac265a1ce1c153a529e3fb70d75c839edff18bd 100644 (file)
@@ -7489,7 +7489,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 );