X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=glib%2Fgthreadpool.c;h=dad424dca6e123f3f8f7b916dc1d1d47707cc6b6;hb=0a4ee12c7a9dfc82443133dfb2b18fb411d79f48;hp=a07628fe2f52a7483060b7ff56004f6620980f47;hpb=430c5635f245ca485f09035f1b6c3a59dd69758c;p=platform%2Fupstream%2Fglib.git diff --git a/glib/gthreadpool.c b/glib/gthreadpool.c index a07628f..dad424d 100644 --- a/glib/gthreadpool.c +++ b/glib/gthreadpool.c @@ -15,9 +15,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library; if not, see . */ /* @@ -110,9 +108,9 @@ static gint wakeup_thread_serial = 0; /* Here all unused threads are waiting */ static GAsyncQueue *unused_thread_queue = NULL; static gint unused_threads = 0; -static gint max_unused_threads = 0; +static gint max_unused_threads = 2; static gint kill_unused_threads = 0; -static guint max_idle_time = 0; +static guint max_idle_time = 15 * 1000; static void g_thread_pool_queue_push_unlocked (GRealThreadPool *pool, gpointer data); @@ -163,15 +161,11 @@ g_thread_pool_wait_for_new_pool (void) else if (local_max_idle_time > 0) { /* If a maximal idle time is given, wait for the given time. */ - GTimeVal end_time; - - g_get_current_time (&end_time); - g_time_val_add (&end_time, local_max_idle_time * 1000); - DEBUG_MSG (("thread %p waiting in global pool for %f seconds.", g_thread_self (), local_max_idle_time / 1000.0)); - pool = g_async_queue_timed_pop (unused_thread_queue, &end_time); + pool = g_async_queue_timeout_pop (unused_thread_queue, + local_max_idle_time * 1000); } else { @@ -260,17 +254,13 @@ g_thread_pool_wait_for_new_task (GRealThreadPool *pool) /* A thread will wait for new tasks for at most 1/2 * second before going to the global pool. */ - GTimeVal end_time; - - g_get_current_time (&end_time); - g_time_val_add (&end_time, G_USEC_PER_SEC / 2); /* 1/2 second */ - DEBUG_MSG (("thread %p in pool %p waits for up to a 1/2 second for task " "(%d running, %d unprocessed).", g_thread_self (), pool, pool->num_threads, g_async_queue_length_unlocked (pool->queue))); - task = g_async_queue_timed_pop_unlocked (pool->queue, &end_time); + task = g_async_queue_timeout_pop_unlocked (pool->queue, + G_USEC_PER_SEC / 2); } } else @@ -414,7 +404,7 @@ g_thread_pool_start_thread (GRealThreadPool *pool, GThread *thread; /* No thread was found, we have to start a new one */ - thread = g_thread_try ("pool", g_thread_pool_thread_proxy, pool, error); + thread = g_thread_try_new ("pool", g_thread_pool_thread_proxy, pool, error); if (thread == NULL) return FALSE; @@ -457,13 +447,18 @@ g_thread_pool_start_thread (GRealThreadPool *pool, * until it is destroyed by g_thread_pool_free(). If @exclusive is * %FALSE, threads are created when needed and shared between all * non-exclusive thread pools. This implies that @max_threads may - * not be -1 for exclusive thread pools. + * not be -1 for exclusive thread pools. Besides, exclusive thread + * pools are not affected by g_thread_pool_set_max_idle_time() + * since their threads are never considered idle and returned to the + * global pool. * * @error can be %NULL to ignore errors, or non-%NULL to report * errors. An error can only occur when @exclusive is set to %TRUE * and not all @max_threads threads could be created. + * See #GThreadError for possible errors that may occur. + * Note, even in case of error a valid #GThreadPool is returned. * - * Return value: the new #GThreadPool + * Returns: the new #GThreadPool */ GThreadPool * g_thread_pool_new (GFunc func, @@ -541,7 +536,7 @@ g_thread_pool_new (GFunc func, * * Before version 2.32, this function did not return a success status. * - * Return value: %TRUE on success, %FALSE if an error occurred + * Returns: %TRUE on success, %FALSE if an error occurred */ gboolean g_thread_pool_push (GThreadPool *pool, @@ -606,7 +601,7 @@ g_thread_pool_push (GThreadPool *pool, * * Before version 2.32, this function did not return a success status. * - * Return value: %TRUE on success, %FALSE if an error occurred + * Returns: %TRUE on success, %FALSE if an error occurred */ gboolean g_thread_pool_set_max_threads (GThreadPool *pool, @@ -658,7 +653,7 @@ g_thread_pool_set_max_threads (GThreadPool *pool, * * Returns the maximal number of threads for @pool. * - * Return value: the maximal number of threads + * Returns: the maximal number of threads */ gint g_thread_pool_get_max_threads (GThreadPool *pool) @@ -684,7 +679,7 @@ g_thread_pool_get_max_threads (GThreadPool *pool) * * Returns the number of threads currently running in @pool. * - * Return value: the number of threads currently running + * Returns: the number of threads currently running */ guint g_thread_pool_get_num_threads (GThreadPool *pool) @@ -710,7 +705,7 @@ g_thread_pool_get_num_threads (GThreadPool *pool) * * Returns the number of tasks still unprocessed in @pool. * - * Return value: the number of unprocessed tasks + * Returns: the number of unprocessed tasks */ guint g_thread_pool_unprocessed (GThreadPool *pool) @@ -744,8 +739,8 @@ g_thread_pool_unprocessed (GThreadPool *pool) * * If @wait_ is %TRUE, the functions does not return before all * tasks to be processed (dependent on @immediate, whether all - * or only the currently running) are ready. Otherwise the function - * returns immediately. + * or only the currently running) are ready. + * Otherwise the function returns immediately. * * After calling this function @pool must not be used anymore. */ @@ -826,8 +821,14 @@ g_thread_pool_wakeup_and_stop_all (GRealThreadPool *pool) pool->immediate = TRUE; + /* + * So here we're sending bogus data to the pool threads, which + * should cause them each to wake up, and check the above + * pool->immediate condition. However we don't want that + * data to be sorted (since it'll crash the sorter). + */ for (i = 0; i < pool->num_threads; i++) - g_thread_pool_queue_push_unlocked (pool, GUINT_TO_POINTER (1)); + g_async_queue_push_unlocked (pool->queue, GUINT_TO_POINTER (1)); } /** @@ -837,6 +838,8 @@ g_thread_pool_wakeup_and_stop_all (GRealThreadPool *pool) * Sets the maximal number of unused threads to @max_threads. * If @max_threads is -1, no limit is imposed on the number * of unused threads. + * + * The default value is 2. */ void g_thread_pool_set_max_unused_threads (gint max_threads) @@ -872,7 +875,7 @@ g_thread_pool_set_max_unused_threads (gint max_threads) * * Returns the maximal allowed number of unused threads. * - * Return value: the maximal number of unused threads + * Returns: the maximal number of unused threads */ gint g_thread_pool_get_max_unused_threads (void) @@ -885,7 +888,7 @@ g_thread_pool_get_max_unused_threads (void) * * Returns the number of currently unused threads. * - * Return value: the number of currently unused threads + * Returns: the number of currently unused threads */ guint g_thread_pool_get_num_unused_threads (void) @@ -972,8 +975,7 @@ g_thread_pool_set_sort_function (GThreadPool *pool, * * By setting @interval to 0, idle threads will not be stopped. * - * This function makes use of g_async_queue_timed_pop () using - * @interval. + * The default value is 15000 (15 seconds). * * Since: 2.10 */ @@ -1011,7 +1013,7 @@ g_thread_pool_set_max_idle_time (guint interval) * If this function returns 0, threads waiting in the thread * pool for new work are not stopped. * - * Return value: the maximum @interval (milliseconds) to wait + * Returns: the maximum @interval (milliseconds) to wait * for new tasks in the thread pool before stopping the * thread *