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 )
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 );
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 );