From b465cb158b54c6eb0a1e923f88641da65a9f176b Mon Sep 17 00:00:00 2001 From: Ignazio Pillai Date: Thu, 7 Feb 2019 18:03:55 +0100 Subject: [PATCH] gtask: fix task_wait_time estimation The wait time is estimated as function of the number of running threads Fixes #1683 --- gio/gtask.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/gio/gtask.c b/gio/gtask.c index 346d2ec5b..f5d717ada 100644 --- a/gio/gtask.c +++ b/gio/gtask.c @@ -619,11 +619,14 @@ static gint tasks_running; * The base and multiplier below gives us 10 extra threads after about * a second of blocking, 30 after 5 seconds, 100 after a minute, and * 200 after 20 minutes. + * + * We specify maximum pool size of 330 to increase the waiting time up + * to around 30 minutes. */ #define G_TASK_POOL_SIZE 10 #define G_TASK_WAIT_TIME_BASE 100000 #define G_TASK_WAIT_TIME_MULTIPLIER 1.03 -#define G_TASK_WAIT_TIME_MAX (30 * 60 * 1000000) +#define G_TASK_WAIT_TIME_MAX_POOL_SIZE 330 static void g_task_init (GTask *task) @@ -1359,7 +1362,7 @@ g_task_thread_setup (void) if (tasks_running == G_TASK_POOL_SIZE) task_wait_time = G_TASK_WAIT_TIME_BASE; - else if (tasks_running > G_TASK_POOL_SIZE && task_wait_time < G_TASK_WAIT_TIME_MAX) + else if (tasks_running > G_TASK_POOL_SIZE && tasks_running < G_TASK_WAIT_TIME_MAX_POOL_SIZE) task_wait_time *= G_TASK_WAIT_TIME_MULTIPLIER; if (tasks_running >= G_TASK_POOL_SIZE) @@ -1381,6 +1384,9 @@ g_task_thread_cleanup (void) else if (tasks_running + tasks_pending < G_TASK_POOL_SIZE) g_source_set_ready_time (task_pool_manager, -1); + if (tasks_running > G_TASK_POOL_SIZE && tasks_running < G_TASK_WAIT_TIME_MAX_POOL_SIZE) + task_wait_time /= G_TASK_WAIT_TIME_MULTIPLIER; + tasks_running--; g_mutex_unlock (&task_pool_mutex); g_private_set (&task_private, GUINT_TO_POINTER (FALSE));