]> xenbits.xensource.com Git - libvirt.git/commitdiff
vireventthread: Introduce virEventThreadStop
authorMichal Privoznik <mprivozn@redhat.com>
Thu, 25 Jul 2024 07:49:05 +0000 (09:49 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Thu, 22 Aug 2024 11:33:06 +0000 (13:33 +0200)
The aim is to move parts of vir_event_thread_finalize() that MAY
block into a separate function, so that unrefing the a
virEventThread no longer blocks (or require releasing and
subsequent re-acquiring of a mutex).

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
src/libvirt_private.syms
src/util/vireventthread.c
src/util/vireventthread.h

index 7a5df5a6a45edc06f9d385e4b220afc9787d050c..4f3555a37febdb624dd0c903a27eb66c10885a7a 100644 (file)
@@ -2288,6 +2288,7 @@ virEventGLibRunOnce;
 # util/vireventthread.h
 virEventThreadGetContext;
 virEventThreadNew;
+virEventThreadStop;
 
 
 # util/virfcp.h
index 20d52b9efb57f616a8f52cc54462e8ae1f26c5ee..131f53820ff4f4d7e60434618c2211c01f5725f7 100644 (file)
@@ -188,6 +188,28 @@ virEventThreadNew(const char *name)
 }
 
 
+/**
+ * virEventThreadStop:
+ * @evt: event thread
+ *
+ * May block until all events are processed. Typical use case is:
+ *
+ * virEventThread *evt = virEventThreadNew("name");
+ * ...
+ * virEventThreadStop(evt);
+ * g_object_unref(evt);
+ */
+void
+virEventThreadStop(virEventThread *evt)
+{
+    if (evt->thread) {
+        g_main_loop_quit(evt->loop);
+        g_thread_join(evt->thread);
+        evt->thread = NULL;
+    }
+}
+
+
 GMainContext *
 virEventThreadGetContext(virEventThread *evt)
 {
index 5826c25cf4f476260aa284ef8e268d54228a643f..78d842b89460bacd423ec4b4a93f8e03c5374291 100644 (file)
@@ -28,4 +28,6 @@ G_DECLARE_FINAL_TYPE(virEventThread, vir_event_thread, VIR, EVENT_THREAD, GObjec
 
 virEventThread *virEventThreadNew(const char *name);
 
+void virEventThreadStop(virEventThread *evt);
+
 GMainContext *virEventThreadGetContext(virEventThread *evt);