Backport a threadpool fix

This commit is contained in:
Matthias Clasen 2005-07-23 13:16:13 +00:00
parent a783b16f38
commit 8edd3a3c0b
6 changed files with 53 additions and 16 deletions

View File

@ -1,8 +1,16 @@
2005-07-23 Matthias Clasen <mclasen@redhat.com>
* glib/gthreadpool.c (g_thread_pool_free): Don't get
stuck in here if immediate is TRUE. (#310954,
Hong Jen Yee)
* tests/threadpool-test.c (main): Test immediate == TRUE.
2005-07-19 Matthias Clasen <mclasen@redhat.com>
* glib/gatomic.c (g_atomic_pointer_compare_and_exchange):
Fix g_atomic_pointer_compare_and_exchange on sparc64.
(#167572, Gert Doering)
* glib/gatomic.c (g_atomic_pointer_compare_and_exchange):
Fix g_atomic_pointer_compare_and_exchange on sparc64.
(#167572, Gert Doering)
2005-07-14 Tor Lillqvist <tml@novell.com>

View File

@ -1,8 +1,16 @@
2005-07-23 Matthias Clasen <mclasen@redhat.com>
* glib/gthreadpool.c (g_thread_pool_free): Don't get
stuck in here if immediate is TRUE. (#310954,
Hong Jen Yee)
* tests/threadpool-test.c (main): Test immediate == TRUE.
2005-07-19 Matthias Clasen <mclasen@redhat.com>
* glib/gatomic.c (g_atomic_pointer_compare_and_exchange):
Fix g_atomic_pointer_compare_and_exchange on sparc64.
(#167572, Gert Doering)
* glib/gatomic.c (g_atomic_pointer_compare_and_exchange):
Fix g_atomic_pointer_compare_and_exchange on sparc64.
(#167572, Gert Doering)
2005-07-14 Tor Lillqvist <tml@novell.com>

View File

@ -1,8 +1,16 @@
2005-07-23 Matthias Clasen <mclasen@redhat.com>
* glib/gthreadpool.c (g_thread_pool_free): Don't get
stuck in here if immediate is TRUE. (#310954,
Hong Jen Yee)
* tests/threadpool-test.c (main): Test immediate == TRUE.
2005-07-19 Matthias Clasen <mclasen@redhat.com>
* glib/gatomic.c (g_atomic_pointer_compare_and_exchange):
Fix g_atomic_pointer_compare_and_exchange on sparc64.
(#167572, Gert Doering)
* glib/gatomic.c (g_atomic_pointer_compare_and_exchange):
Fix g_atomic_pointer_compare_and_exchange on sparc64.
(#167572, Gert Doering)
2005-07-14 Tor Lillqvist <tml@novell.com>

View File

@ -1,8 +1,16 @@
2005-07-23 Matthias Clasen <mclasen@redhat.com>
* glib/gthreadpool.c (g_thread_pool_free): Don't get
stuck in here if immediate is TRUE. (#310954,
Hong Jen Yee)
* tests/threadpool-test.c (main): Test immediate == TRUE.
2005-07-19 Matthias Clasen <mclasen@redhat.com>
* glib/gatomic.c (g_atomic_pointer_compare_and_exchange):
Fix g_atomic_pointer_compare_and_exchange on sparc64.
(#167572, Gert Doering)
* glib/gatomic.c (g_atomic_pointer_compare_and_exchange):
Fix g_atomic_pointer_compare_and_exchange on sparc64.
(#167572, Gert Doering)
2005-07-14 Tor Lillqvist <tml@novell.com>

View File

@ -545,7 +545,8 @@ g_thread_pool_free (GThreadPool *pool,
if (wait)
{
g_mutex_lock (inform_mutex);
while (g_async_queue_length_unlocked (real->queue) != -real->num_threads)
while (g_async_queue_length_unlocked (real->queue) != -real->num_threads &&
!(immediate && real->num_threads == 0))
{
g_async_queue_unlock (real->queue);
g_cond_wait (inform_cond, inform_mutex);
@ -554,7 +555,8 @@ g_thread_pool_free (GThreadPool *pool,
g_mutex_unlock (inform_mutex);
}
if (g_async_queue_length_unlocked (real->queue) == -real->num_threads)
if (immediate ||
g_async_queue_length_unlocked (real->queue) == -real->num_threads)
{
/* No thread is currently doing something (and nothing is left
* to process in the queue) */

View File

@ -8,6 +8,7 @@
G_LOCK_DEFINE_STATIC (thread_counter);
gulong abs_thread_counter;
gulong running_thread_counter;
gulong leftover_task_counter;
void
thread_pool_func (gpointer a, gpointer b)
@ -21,6 +22,7 @@ thread_pool_func (gpointer a, gpointer b)
G_LOCK (thread_counter);
running_thread_counter--;
leftover_task_counter--;
G_UNLOCK (thread_counter);
}
@ -44,13 +46,14 @@ main (int argc,
g_thread_pool_push (pool1, GUINT_TO_POINTER (1), NULL);
g_thread_pool_push (pool2, GUINT_TO_POINTER (1), NULL);
g_thread_pool_push (pool3, GUINT_TO_POINTER (1), NULL);
leftover_task_counter += 3;
}
g_thread_pool_free (pool1, FALSE, TRUE);
g_thread_pool_free (pool1, TRUE, TRUE);
g_thread_pool_free (pool2, FALSE, TRUE);
g_thread_pool_free (pool3, FALSE, TRUE);
g_assert (RUNS * 3 == abs_thread_counter);
g_assert (RUNS * 3 == abs_thread_counter + leftover_task_counter);
g_assert (running_thread_counter == 0);
#endif
return 0;