[glib: 1/2] gtask: fix task_wait_time estimation



commit b465cb158b54c6eb0a1e923f88641da65a9f176b
Author: Ignazio Pillai <ignazp amazon com>
Date:   Thu Feb 7 18:03:55 2019 +0100

    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));


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]