[libvirt PATCH 03/11] src: set the OS level thread name
Michal Privoznik
mprivozn at redhat.com
Sat Feb 22 12:39:44 UTC 2020
On 2/14/20 1:52 PM, Daniel P. Berrangé wrote:
> Setting the thread name makes it easier to debug libvirtd
> when many threads are running.
>
> Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
> ---
> src/libvirt_private.syms | 1 +
> src/util/virthread.c | 44 +++++++++++++++++++++++++++++++++++-----
> src/util/virthread.h | 4 +++-
> 3 files changed, 43 insertions(+), 6 deletions(-)
>
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index dc0449d1d8..375e6ea000 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -3258,6 +3258,7 @@ virThreadCreateFull;
> virThreadID;
> virThreadIsSelf;
> virThreadJoin;
> +virThreadMaxName;
> virThreadSelf;
> virThreadSelfID;
>
> diff --git a/src/util/virthread.c b/src/util/virthread.c
> index cdc5cab604..750e8d5655 100644
> --- a/src/util/virthread.c
> +++ b/src/util/virthread.c
> @@ -175,23 +175,57 @@ void virCondBroadcast(virCondPtr c)
>
> struct virThreadArgs {
> virThreadFunc func;
> - const char *funcName;
> + char *name;
> bool worker;
> void *opaque;
> };
>
> +size_t virThreadMaxName(void)
> +{
> +#if defined(__FreeBSD__) || defined(__APPLE__)
> + return 63;
> +#else
> +# ifdef __linux__
> + return 15;
> +# else
> + return 0; /* unlimited */
> +# endif
> +#endif
> +}
It's a pitty that the 16 bytes long limit wasn't lifted since 2.6.12-rc2.
> +
> static void *virThreadHelper(void *data)
> {
> struct virThreadArgs *args = data;
> struct virThreadArgs local = *args;
> + g_autofree char *thname = NULL;
> + size_t maxname = virThreadMaxName();
>
> /* Free args early, rather than tying it up during the entire thread. */
> VIR_FREE(args);
>
> if (local.worker)
> - virThreadJobSetWorker(local.funcName);
> + virThreadJobSetWorker(local.name);
> else
> - virThreadJobSet(local.funcName);
> + virThreadJobSet(local.name);
> +
> + if (maxname) {
> + thname = g_strndup(local.name, maxname);
> + } else {
> + thname = g_strdup(local.name);
> + }
> + g_free(local.name);
> +
> +#if defined(__linux__) || defined(WIN32)
> + pthread_setname_np(pthread_self(), thname);
> +#else
> +# ifdef __FreeBSD__
> + pthread_set_name_np(pthread_self(), thname);
> +# else
> +# ifdef __APPLE__
> + pthread_setname_np(thname);
> +# endif
> +# endif
> +#endif
>
> local.func(local.opaque);
>
> @@ -204,7 +238,7 @@ static void *virThreadHelper(void *data)
> int virThreadCreateFull(virThreadPtr thread,
> bool joinable,
> virThreadFunc func,
> - const char *funcName,
> + const char *name,
> bool worker,
> void *opaque)
> {
> @@ -221,7 +255,7 @@ int virThreadCreateFull(virThreadPtr thread,
> }
>
> args->func = func;
> - args->funcName = funcName;
> + args->name = g_strdup(name);
> args->worker = worker;
> args->opaque = opaque;
>
Don't forget to free args->name if pthread_create() fails.
Reviewed-by: Michal Privoznik <mprivozn at redhat.com>
Michal
More information about the libvir-list
mailing list