From 55ebc93a085dcc32c8c10ff2cbd4bb3570fdb1f0 Mon Sep 17 00:00:00 2001 From: Jiri Denemark Date: Fri, 20 Mar 2015 17:43:55 +0100 Subject: [PATCH] virThread: Set thread job 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 --- 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 a8dced5cdc..0945df4c94 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2181,7 +2181,7 @@ virRWLockRead; virRWLockUnlock; virRWLockWrite; virThreadCancel; -virThreadCreate; +virThreadCreateFull; virThreadID; virThreadInitialize; virThreadIsSelf; diff --git a/src/util/virthread.c b/src/util/virthread.c index 7e841d12c4..c2a9e7faaa 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 7146f0f4ed..e466d9bf01 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.39.5