Create a helper API to set the quit flag and wake up the worker
threads when a quit has been requested such as via a signal handler.
Signed-off-by: John Ferlan <jferlan(a)redhat.com>
---
src/libvirt_private.syms | 1 +
src/util/virthreadpool.c | 43 ++++++++++++++++++++++++++++++++++------
src/util/virthreadpool.h | 2 ++
3 files changed, 40 insertions(+), 6 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 3e304907b9..af76c29928 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -3001,6 +3001,7 @@ virThreadPoolGetMaxWorkers;
virThreadPoolGetMinWorkers;
virThreadPoolGetPriorityWorkers;
virThreadPoolNewFull;
+virThreadPoolQuitRequested;
virThreadPoolSendJob;
virThreadPoolSetParameters;
diff --git a/src/util/virthreadpool.c b/src/util/virthreadpool.c
index 10f2bd2c3a..137c5d1746 100644
--- a/src/util/virthreadpool.c
+++ b/src/util/virthreadpool.c
@@ -30,9 +30,12 @@
#include "viralloc.h"
#include "virthread.h"
#include "virerror.h"
+#include "virlog.h"
#define VIR_FROM_THIS VIR_FROM_NONE
+VIR_LOG_INIT("util.threadpool");
+
typedef struct _virThreadPoolJob virThreadPoolJob;
typedef virThreadPoolJob *virThreadPoolJobPtr;
@@ -269,6 +272,18 @@ virThreadPoolNewFull(size_t minWorkers,
}
+
+static void
+virThreadPoolSetQuit(virThreadPoolPtr pool)
+{
+ pool->quit = true;
+ if (pool->nWorkers > 0)
+ virCondBroadcast(&pool->cond);
+ if (pool->nPrioWorkers > 0)
+ virCondBroadcast(&pool->prioCond);
+}
+
+
void virThreadPoolFree(virThreadPoolPtr pool)
{
virThreadPoolJobPtr job;
@@ -278,13 +293,9 @@ void virThreadPoolFree(virThreadPoolPtr pool)
return;
virMutexLock(&pool->mutex);
- pool->quit = true;
- if (pool->nWorkers > 0)
- virCondBroadcast(&pool->cond);
- if (pool->nPrioWorkers > 0) {
+ if (pool->nPrioWorkers > 0)
priority = true;
- virCondBroadcast(&pool->prioCond);
- }
+ virThreadPoolSetQuit(pool);
while (pool->nWorkers > 0 || pool->nPrioWorkers > 0)
ignore_value(virCondWait(&pool->quit_cond, &pool->mutex));
@@ -307,6 +318,26 @@ void virThreadPoolFree(virThreadPoolPtr pool)
}
+/*
+ * virThreadPoolQuitRequested:
+ * @pool: Pointer to thread pool
+ *
+ * When libvirtd quit is requested via the daemonShutdownHandler let's
+ * set the quit flag for current workers and wake them up.
+ */
+void
+virThreadPoolQuitRequested(virThreadPoolPtr pool)
+{
+ virMutexLock(&pool->mutex);
+
+ VIR_DEBUG("nWorkers=%zd, nPrioWorkers=%zd jobQueueDepth=%zd",
+ pool->nWorkers, pool->nPrioWorkers, pool->jobQueueDepth);
+
+ virThreadPoolSetQuit(pool);
+ virMutexUnlock(&pool->mutex);
+}
+
+
size_t virThreadPoolGetMinWorkers(virThreadPoolPtr pool)
{
size_t ret;
diff --git a/src/util/virthreadpool.h b/src/util/virthreadpool.h
index e1f362f5bb..f2c8b2ae61 100644
--- a/src/util/virthreadpool.h
+++ b/src/util/virthreadpool.h
@@ -52,6 +52,8 @@ size_t virThreadPoolGetJobQueueDepth(virThreadPoolPtr pool);
void virThreadPoolFree(virThreadPoolPtr pool);
+void virThreadPoolQuitRequested(virThreadPoolPtr pool);
+
int virThreadPoolSendJob(virThreadPoolPtr pool,
unsigned int priority,
void *jobdata) ATTRIBUTE_NONNULL(1)
--
2.17.1