diff --git a/libraries/libldap_r/tpool.c b/libraries/libldap_r/tpool.c index e23f9ad09c..56e8f54687 100644 --- a/libraries/libldap_r/tpool.c +++ b/libraries/libldap_r/tpool.c @@ -508,14 +508,7 @@ ldap_pvt_thread_pool_destroy ( ldap_pvt_thread_pool_t *tpool, int run_pending ) : LDAP_INT_THREAD_POOL_STOPPING; ldap_pvt_thread_cond_broadcast(&pool->ltp_cond); - ldap_pvt_thread_mutex_unlock(&pool->ltp_mutex); - - do { - ldap_pvt_thread_yield(); - ldap_pvt_thread_mutex_lock(&pool->ltp_mutex); - waiting = pool->ltp_open_count; - ldap_pvt_thread_mutex_unlock(&pool->ltp_mutex); - } while (waiting > 0); + ldap_pvt_thread_cond_wait(&pool->ltp_cond, &pool->ltp_mutex); while ((ctx = LDAP_STAILQ_FIRST(&pool->ltp_pending_list)) != NULL) { @@ -645,6 +638,11 @@ ldap_int_thread_pool_wrapper ( thread_keys[keyslot].id = tid_zero; pool->ltp_open_count--; + + /* let pool_destroy know we're all done */ + if (pool->ltp_open_count < 1) + ldap_pvt_thread_cond_signal(&pool->ltp_cond); + ldap_pvt_thread_mutex_unlock(&pool->ltp_mutex); ldap_pvt_thread_exit(NULL);