[libvirt] [PATCH 4/8] virThread: Set thread job

Jiri Denemark jdenemar at redhat.com
Mon Mar 23 13:26:03 UTC 2015


Automatically assign a job to every thread created by virThreadCreate.
The name of the virThreadFunc function passed to virThreadCreate is used
as the job or worker name in case no name is explicitly passed.

Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
---
 src/libvirt_private.syms |  2 +-
 src/util/virthread.c     | 25 +++++++++++++++++++++----
 src/util/virthread.h     | 13 +++++++++----
 3 files changed, 31 insertions(+), 9 deletions(-)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index f5756a7..4980305 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2174,7 +2174,7 @@ virRWLockRead;
 virRWLockUnlock;
 virRWLockWrite;
 virThreadCancel;
-virThreadCreate;
+virThreadCreateFull;
 virThreadID;
 virThreadInitialize;
 virThreadIsSelf;
diff --git a/src/util/virthread.c b/src/util/virthread.c
index 7e841d1..c2a9e7f 100644
--- a/src/util/virthread.c
+++ b/src/util/virthread.c
@@ -30,6 +30,7 @@
 #endif
 
 #include "viralloc.h"
+#include "virthreadjob.h"
 
 
 /* Nothing special required for pthreads */
@@ -184,6 +185,8 @@ void virCondBroadcast(virCondPtr c)
 
 struct virThreadArgs {
     virThreadFunc func;
+    const char *funcName;
+    bool worker;
     void *opaque;
 };
 
@@ -194,14 +197,26 @@ static void *virThreadHelper(void *data)
 
     /* Free args early, rather than tying it up during the entire thread.  */
     VIR_FREE(args);
+
+    if (local.worker)
+        virThreadJobSetWorker(local.funcName);
+    else
+        virThreadJobSet(local.funcName);
+
     local.func(local.opaque);
+
+    if (!local.worker)
+        virThreadJobClear(0);
+
     return NULL;
 }
 
-int virThreadCreate(virThreadPtr thread,
-                    bool joinable,
-                    virThreadFunc func,
-                    void *opaque)
+int virThreadCreateFull(virThreadPtr thread,
+                        bool joinable,
+                        virThreadFunc func,
+                        const char *funcName,
+                        bool worker,
+                        void *opaque)
 {
     struct virThreadArgs *args;
     pthread_attr_t attr;
@@ -216,6 +231,8 @@ int virThreadCreate(virThreadPtr thread,
     }
 
     args->func = func;
+    args->funcName = funcName;
+    args->worker = worker;
     args->opaque = opaque;
 
     if (!joinable)
diff --git a/src/util/virthread.h b/src/util/virthread.h
index 7146f0f..e466d9b 100644
--- a/src/util/virthread.h
+++ b/src/util/virthread.h
@@ -88,10 +88,15 @@ void virThreadOnExit(void);
 
 typedef void (*virThreadFunc)(void *opaque);
 
-int virThreadCreate(virThreadPtr thread,
-                    bool joinable,
-                    virThreadFunc func,
-                    void *opaque) ATTRIBUTE_RETURN_CHECK;
+# define virThreadCreate(thread, joinable, func, opaque) \
+    virThreadCreateFull(thread, joinable, func, #func, false, opaque)
+
+int virThreadCreateFull(virThreadPtr thread,
+                        bool joinable,
+                        virThreadFunc func,
+                        const char *funcName,
+                        bool worker,
+                        void *opaque) ATTRIBUTE_RETURN_CHECK;
 void virThreadSelf(virThreadPtr thread);
 bool virThreadIsSelf(virThreadPtr thread);
 void virThreadJoin(virThreadPtr thread);
-- 
2.3.3




More information about the libvir-list mailing list