]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
util: add stop/drain functions to thread pool
authorNikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
Thu, 9 Jul 2020 07:58:02 +0000 (10:58 +0300)
committerNikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
Mon, 7 Sep 2020 06:33:58 +0000 (09:33 +0300)
Stop just send signal for threads to exit when they finish with
current task. Drain waits when all threads will finish.

Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
src/libvirt_private.syms
src/util/virthreadpool.c
src/util/virthreadpool.h

index 3b9606a366e161d1e2c77174c1543854e6dc0b6c..9c3af24227229e24296b3233ccfd97d10e11dca5 100644 (file)
@@ -3332,6 +3332,7 @@ virThreadJobSetWorker;
 
 
 # util/virthreadpool.h
+virThreadPoolDrain;
 virThreadPoolFree;
 virThreadPoolGetCurrentWorkers;
 virThreadPoolGetFreeWorkers;
@@ -3342,6 +3343,7 @@ virThreadPoolGetPriorityWorkers;
 virThreadPoolNewFull;
 virThreadPoolSendJob;
 virThreadPoolSetParameters;
+virThreadPoolStop;
 
 
 # util/virtime.h
index 10a44deeb68df2b685c41bde97ca767ef00d4a82..ca44f55c1be79c448de48dc25bbccf03882577e0 100644 (file)
@@ -268,19 +268,27 @@ virThreadPoolNewFull(size_t minWorkers,
 
 }
 
-void virThreadPoolFree(virThreadPoolPtr pool)
-{
-    virThreadPoolJobPtr job;
 
-    if (!pool)
+static void
+virThreadPoolStopLocked(virThreadPoolPtr pool)
+{
+    if (pool->quit)
         return;
 
-    virMutexLock(&pool->mutex);
     pool->quit = true;
     if (pool->nWorkers > 0)
         virCondBroadcast(&pool->cond);
     if (pool->nPrioWorkers > 0)
         virCondBroadcast(&pool->prioCond);
+}
+
+
+static void
+virThreadPoolDrainLocked(virThreadPoolPtr pool)
+{
+    virThreadPoolJobPtr job;
+
+    virThreadPoolStopLocked(pool);
 
     while (pool->nWorkers > 0 || pool->nPrioWorkers > 0)
         ignore_value(virCondWait(&pool->quit_cond, &pool->mutex));
@@ -289,6 +297,15 @@ void virThreadPoolFree(virThreadPoolPtr pool)
         pool->jobList.head = pool->jobList.head->next;
         VIR_FREE(job);
     }
+}
+
+void virThreadPoolFree(virThreadPoolPtr pool)
+{
+    if (!pool)
+        return;
+
+    virMutexLock(&pool->mutex);
+    virThreadPoolDrainLocked(pool);
 
     VIR_FREE(pool->workers);
     virMutexUnlock(&pool->mutex);
@@ -475,3 +492,19 @@ virThreadPoolSetParameters(virThreadPoolPtr pool,
     virMutexUnlock(&pool->mutex);
     return -1;
 }
+
+void
+virThreadPoolStop(virThreadPoolPtr pool)
+{
+    virMutexLock(&pool->mutex);
+    virThreadPoolStopLocked(pool);
+    virMutexUnlock(&pool->mutex);
+}
+
+void
+virThreadPoolDrain(virThreadPoolPtr pool)
+{
+    virMutexLock(&pool->mutex);
+    virThreadPoolDrainLocked(pool);
+    virMutexUnlock(&pool->mutex);
+}
index c97d9b39196a140fea1d762ddda77de622284671..dd1aaf308d71b703682ab3ab40379514466cdafc 100644 (file)
@@ -56,3 +56,6 @@ int virThreadPoolSetParameters(virThreadPoolPtr pool,
                                long long int minWorkers,
                                long long int maxWorkers,
                                long long int prioWorkers);
+
+void virThreadPoolStop(virThreadPoolPtr pool);
+void virThreadPoolDrain(virThreadPoolPtr pool);