From 9288c31bf7e21fde201db49b956d3cf609c1c558 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Thu, 18 Nov 2010 13:03:56 +0000 Subject: [PATCH] Include a thread identifier in log messages To allow messages from different threads to be untangled, include an integer thread identifier in log messages. * src/util/logging.c: Include thread ID * src/util/threads.h, src/util/threads.h, src/util/threads-pthread.c: Add new virThreadSelfID() function * configure.ac: Check for sys/syscall.h --- configure.ac | 2 +- src/libvirt_private.syms | 1 + src/util/logging.c | 6 ++++-- src/util/threads-pthread.c | 16 ++++++++++++++++ src/util/threads-win32.c | 6 ++++++ src/util/threads.h | 1 + 6 files changed, 29 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index d21d558a70..fca93fcf81 100644 --- a/configure.ac +++ b/configure.ac @@ -110,7 +110,7 @@ LIBS=$old_libs dnl Availability of various common headers (non-fatal if missing). AC_CHECK_HEADERS([pwd.h paths.h regex.h sys/syslimits.h sys/un.h \ sys/poll.h syslog.h mntent.h net/ethernet.h linux/magic.h \ - sys/un.h]) + sys/un.h sys/syscall.h]) AC_CHECK_LIB([intl],[gettext],[]) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 10ae74f4ad..0547cdfa02 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -734,6 +734,7 @@ virThreadCreate; virThreadIsSelf; virThreadJoin; virThreadSelf; +virThreadSelfID; # usb.h diff --git a/src/util/logging.c b/src/util/logging.c index ac38d4d98d..d65dec077c 100644 --- a/src/util/logging.c +++ b/src/util/logging.c @@ -548,14 +548,16 @@ void virLogMessage(const char *category, int priority, const char *funcname, localtime_r(&cur_time.tv_sec, &time_info); if ((funcname != NULL)) { - ret = virAsprintf(&msg, "%02d:%02d:%02d.%03d: %s : %s:%lld : %s\n", + ret = virAsprintf(&msg, "%02d:%02d:%02d.%03d: %d: %s : %s:%lld : %s\n", time_info.tm_hour, time_info.tm_min, time_info.tm_sec, (int) cur_time.tv_usec / 1000, + virThreadSelfID(), virLogPriorityString(priority), funcname, linenr, str); } else { - ret = virAsprintf(&msg, "%02d:%02d:%02d.%03d: %s : %s\n", + ret = virAsprintf(&msg, "%02d:%02d:%02d.%03d: %d: %s : %s\n", time_info.tm_hour, time_info.tm_min, time_info.tm_sec, (int) cur_time.tv_usec / 1000, + virThreadSelfID(), virLogPriorityString(priority), str); } VIR_FREE(str); diff --git a/src/util/threads-pthread.c b/src/util/threads-pthread.c index 34d9ce8474..02070ae350 100644 --- a/src/util/threads-pthread.c +++ b/src/util/threads-pthread.c @@ -21,6 +21,11 @@ #include +#include +#if HAVE_SYS_SYSCALL_H +# include +#endif + /* Nothing special required for pthreads */ int virThreadInitialize(void) @@ -170,6 +175,17 @@ bool virThreadIsSelf(virThreadPtr thread) return pthread_equal(pthread_self(), thread->thread) ? true : false; } +int virThreadSelfID(void) +{ +#if defined(HAVE_SYS_SYSCALL_H) && defined(SYS_gettid) + pid_t tid; + tid = syscall(SYS_gettid); + return (int)tid; +#else + return (int)pthread_self(); +#endif +} + void virThreadJoin(virThreadPtr thread) { pthread_join(thread->thread, NULL); diff --git a/src/util/threads-win32.c b/src/util/threads-win32.c index de73fd5685..33be4cf477 100644 --- a/src/util/threads-win32.c +++ b/src/util/threads-win32.c @@ -288,6 +288,12 @@ bool virThreadIsSelf(virThreadPtr thread) return self.thread == thread->thread ? true : false; } +int virThreadSelfID(void) +{ + return (int)GetCurrentThreadId(); +} + + void virThreadJoin(virThreadPtr thread) { if (thread->joinable) { diff --git a/src/util/threads.h b/src/util/threads.h index b3b827d3e5..fa00a91014 100644 --- a/src/util/threads.h +++ b/src/util/threads.h @@ -51,6 +51,7 @@ int virThreadCreate(virThreadPtr thread, void virThreadSelf(virThreadPtr thread); bool virThreadIsSelf(virThreadPtr thread); void virThreadJoin(virThreadPtr thread); +int virThreadSelfID(void); int virMutexInit(virMutexPtr m) ATTRIBUTE_RETURN_CHECK; int virMutexInitRecursive(virMutexPtr m) ATTRIBUTE_RETURN_CHECK;