]> git.sur5r.net Git - openldap/commitdiff
Don't spawn threads based on ltp_pending_count, it doesn't get decremented
authorHoward Chu <hyc@openldap.org>
Mon, 17 Feb 2003 12:10:41 +0000 (12:10 +0000)
committerHoward Chu <hyc@openldap.org>
Mon, 17 Feb 2003 12:10:41 +0000 (12:10 +0000)
right away due to ltp_mutex still being held. Just see if all open threads
are active... Use cond_broadcast to signal all waiting threads. Make sure
to remove correct ctx from active list after the thread returns.

libraries/libldap_r/tpool.c

index 24f83c37d1f9a9e1b04537c6c88a5cf87ddda5b6..0910124b489a3f83177fb3dc3adc33db4e38cabb 100644 (file)
@@ -214,7 +214,9 @@ ldap_pvt_thread_pool_submit (
        LDAP_STAILQ_INSERT_TAIL(&pool->ltp_pending_list, ctx, ltc_next.q);
        ldap_pvt_thread_cond_signal(&pool->ltp_cond);
        if ((pool->ltp_open_count <= 0
+#if 0
                        || pool->ltp_pending_count > 1
+#endif
                        || pool->ltp_open_count == pool->ltp_active_count)
                && (pool->ltp_max_count <= 0
                        || pool->ltp_open_count < pool->ltp_max_count))
@@ -346,14 +348,8 @@ ldap_pvt_thread_pool_destroy ( ldap_pvt_thread_pool_t *tpool, int run_pending )
        pool->ltp_state = run_pending
                ? LDAP_INT_THREAD_POOL_FINISHING
                : LDAP_INT_THREAD_POOL_STOPPING;
-       waiting = pool->ltp_open_count;
 
-       /* broadcast could be used here, but only after
-        * it is fixed in the NT thread implementation
-        */
-       while (--waiting >= 0) {
-               ldap_pvt_thread_cond_signal(&pool->ltp_cond);
-       }
+       ldap_pvt_thread_cond_broadcast(&pool->ltp_cond);
        ldap_pvt_thread_mutex_unlock(&pool->ltp_mutex);
 
        do {
@@ -437,7 +433,10 @@ ldap_int_thread_pool_wrapper (
                ctx->ltc_start_routine(ctx, ctx->ltc_arg);
 
                ldap_pvt_thread_mutex_lock(&pool->ltp_mutex);
+               LDAP_SLIST_REMOVE(&pool->ltp_active_list, ctx,
+                       ldap_int_thread_ctx_s, ltc_next.al);
                LDAP_SLIST_INSERT_HEAD(&pool->ltp_free_list, ctx, ltc_next.l);
+               pool->ltp_active_count--;
                ldap_pvt_thread_mutex_unlock(&pool->ltp_mutex);
 
                ldap_pvt_thread_yield();
@@ -447,11 +446,6 @@ ldap_int_thread_pool_wrapper (
                 */
 
                ldap_pvt_thread_mutex_lock(&pool->ltp_mutex);
-               pool->ltp_active_count--;
-               ctx = LDAP_SLIST_FIRST(&pool->ltp_active_list);
-               if (ctx) {
-                       LDAP_SLIST_REMOVE_HEAD(&pool->ltp_active_list, ltc_next.al);
-               }
        }
 
        pool->ltp_open_count--;