Don't get stuck in here if immediate is TRUE. (#310954, Hong Jen Yee)

2005-07-20  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.
This commit is contained in:
Matthias Clasen 2005-07-20 17:06:02 +00:00 committed by Matthias Clasen
parent e81747cdc0
commit 8ac11176ab
6 changed files with 46 additions and 4 deletions

View File

@ -1,3 +1,11 @@
2005-07-20 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-20 Tor Lillqvist <tml@novell.com> 2005-07-20 Tor Lillqvist <tml@novell.com>
* glib/gutils.h (g_win32_get_system_data_dirs): Make this an * glib/gutils.h (g_win32_get_system_data_dirs): Make this an

View File

@ -1,3 +1,11 @@
2005-07-20 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-20 Tor Lillqvist <tml@novell.com> 2005-07-20 Tor Lillqvist <tml@novell.com>
* glib/gutils.h (g_win32_get_system_data_dirs): Make this an * glib/gutils.h (g_win32_get_system_data_dirs): Make this an

View File

@ -1,3 +1,11 @@
2005-07-20 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-20 Tor Lillqvist <tml@novell.com> 2005-07-20 Tor Lillqvist <tml@novell.com>
* glib/gutils.h (g_win32_get_system_data_dirs): Make this an * glib/gutils.h (g_win32_get_system_data_dirs): Make this an

View File

@ -1,3 +1,11 @@
2005-07-20 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-20 Tor Lillqvist <tml@novell.com> 2005-07-20 Tor Lillqvist <tml@novell.com>
* glib/gutils.h (g_win32_get_system_data_dirs): Make this an * glib/gutils.h (g_win32_get_system_data_dirs): Make this an

View File

@ -79,6 +79,7 @@ g_thread_pool_thread_proxy (gpointer data)
gboolean goto_global_pool = !pool->pool.exclusive; gboolean goto_global_pool = !pool->pool.exclusive;
gint len = g_async_queue_length_unlocked (pool->queue); gint len = g_async_queue_length_unlocked (pool->queue);
g_print ("thread pool proxy loop\n");
if (g_thread_should_run (pool, len)) if (g_thread_should_run (pool, len))
{ {
if (watcher) if (watcher)
@ -118,13 +119,16 @@ g_thread_pool_thread_proxy (gpointer data)
len = g_async_queue_length_unlocked (pool->queue); len = g_async_queue_length_unlocked (pool->queue);
} }
g_print ("queue len %d\n", len);
if (!g_thread_should_run (pool, len)) if (!g_thread_should_run (pool, len))
{ {
g_print ("shouldn't run, go to global pool\n");
g_cond_broadcast (inform_cond); g_cond_broadcast (inform_cond);
goto_global_pool = TRUE; goto_global_pool = TRUE;
} }
else if (len > 0) else if (len > 0)
{ {
g_print ("should run, don't go to global pool\n");
/* At this pool there are no threads waiting, but tasks are. */ /* At this pool there are no threads waiting, but tasks are. */
goto_global_pool = FALSE; goto_global_pool = FALSE;
} }
@ -134,6 +138,7 @@ g_thread_pool_thread_proxy (gpointer data)
* just return from a timed wait. We now wait for a limited * just return from a timed wait. We now wait for a limited
* time at this pool for new tasks to avoid costly context * time at this pool for new tasks to avoid costly context
* switches. */ * switches. */
g_print ("no threads, no tasks, wait for a while\n");
goto_global_pool = FALSE; goto_global_pool = FALSE;
watcher = TRUE; watcher = TRUE;
} }
@ -545,7 +550,8 @@ g_thread_pool_free (GThreadPool *pool,
if (wait) if (wait)
{ {
g_mutex_lock (inform_mutex); 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_async_queue_unlock (real->queue);
g_cond_wait (inform_cond, inform_mutex); g_cond_wait (inform_cond, inform_mutex);
@ -554,7 +560,8 @@ g_thread_pool_free (GThreadPool *pool,
g_mutex_unlock (inform_mutex); 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 /* No thread is currently doing something (and nothing is left
* to process in the queue) */ * to process in the queue) */

View File

@ -8,6 +8,7 @@
G_LOCK_DEFINE_STATIC (thread_counter); G_LOCK_DEFINE_STATIC (thread_counter);
gulong abs_thread_counter; gulong abs_thread_counter;
gulong running_thread_counter; gulong running_thread_counter;
gulong leftover_task_counter;
void void
thread_pool_func (gpointer a, gpointer b) thread_pool_func (gpointer a, gpointer b)
@ -21,6 +22,7 @@ thread_pool_func (gpointer a, gpointer b)
G_LOCK (thread_counter); G_LOCK (thread_counter);
running_thread_counter--; running_thread_counter--;
leftover_task_counter--;
G_UNLOCK (thread_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 (pool1, GUINT_TO_POINTER (1), NULL);
g_thread_pool_push (pool2, 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); 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 (pool2, FALSE, TRUE);
g_thread_pool_free (pool3, 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); g_assert (running_thread_counter == 0);
#endif #endif
return 0; return 0;