mono_coop_mutex_lock (&threadpool->threads_lock);
for (;;) {
- ThreadPoolCounter counter;
-
- counter = COUNTER_READ (threadpool);
- if (counter._.working == 0)
+ if (threadpool->threads->len == 0)
break;
- if (counter._.working == 1) {
- if (threadpool->threads->len == 1 && g_ptr_array_index (threadpool->threads, 0) == current) {
- /* We are waiting on ourselves */
- break;
- }
+ if (threadpool->threads->len == 1 && g_ptr_array_index (threadpool->threads, 0) == current) {
+ /* We are waiting on ourselves */
+ break;
}
mono_coop_cond_wait (&threadpool->threads_exit_cond, &threadpool->threads_lock);
mono_coop_mutex_lock (&threadpool->threads_lock);
- COUNTER_ATOMIC (threadpool, counter, {
- counter._.working --;
- });
-
g_ptr_array_remove_fast (threadpool->threads, thread);
mono_coop_cond_signal (&threadpool->threads_exit_cond);
mono_coop_mutex_unlock (&threadpool->threads_lock);
+ COUNTER_ATOMIC (threadpool, counter, {
+ counter._.working --;
+ });
+
mono_refcount_dec (threadpool);
}