From: Quanah Gibson-Mount Date: Sat, 27 Jun 2009 19:52:25 +0000 (+0000) Subject: avoid LDAP_STAILQ_REMOVE in ldap_pvt_thread_pool_retract X-Git-Tag: OPENLDAP_REL_ENG_2_4_17~36 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=11b7d2903b95f6801ead85b25c4881f17c61eb05;p=openldap avoid LDAP_STAILQ_REMOVE in ldap_pvt_thread_pool_retract --- diff --git a/libraries/libldap_r/tpool.c b/libraries/libldap_r/tpool.c index 17061a3744..804bc0df31 100644 --- a/libraries/libldap_r/tpool.c +++ b/libraries/libldap_r/tpool.c @@ -373,6 +373,12 @@ ldap_pvt_thread_pool_submit ( return(-1); } +static void * +no_task( void *ctx, void *arg ) +{ + return NULL; +} + /* Cancel a pending task that was previously submitted. * Return 1 if the task was successfully cancelled, 0 if * not found, -1 for invalid parameters @@ -397,11 +403,11 @@ ldap_pvt_thread_pool_retract ( LDAP_STAILQ_FOREACH(task, &pool->ltp_pending_list, ltt_next.q) if (task->ltt_start_routine == start_routine && task->ltt_arg == arg) { - pool->ltp_pending_count--; - LDAP_STAILQ_REMOVE(&pool->ltp_pending_list, task, - ldap_int_thread_task_s, ltt_next.q); - LDAP_SLIST_INSERT_HEAD(&pool->ltp_free_list, task, - ltt_next.l); + /* Could LDAP_STAILQ_REMOVE the task, but that + * walks ltp_pending_list again to find it. + */ + task->ltt_start_routine = no_task; + task->ltt_arg = NULL; break; } ldap_pvt_thread_mutex_unlock(&pool->ltp_mutex);