]> 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)
committerOndřej Kuzník <ondra@mistotebe.net>
Thu, 27 Jan 2022 15:59:39 +0000 (15:59 +0000)
servers/slapd/daemon.c
servers/slapd/syncrepl.c

index d08422e368261311637e46582ffac22de9e59969..194d4cfb59819cb10d16c1daf25915ad6e39f8ca 100644 (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 );
index 5c46b89f6ad312a5c91d0737835a9b09b0305281..47a773f4d71039091c3fcb6e224b892bb6e81e05 100644 (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 );