diff options
author | Tobias Brunner <tobias@strongswan.org> | 2011-12-16 16:21:01 +0100 |
---|---|---|
committer | Tobias Brunner <tobias@strongswan.org> | 2011-12-16 16:44:38 +0100 |
commit | c17f6f96e2da0265a5d565a43cbca036f1571dfb (patch) | |
tree | 1719b4ec23b9f10ae5dbaa6e6628997ea379d965 | |
parent | b24287c2693e681c33a6a3f11455cbf604f218b0 (diff) | |
download | strongswan-c17f6f96e2da0265a5d565a43cbca036f1571dfb.tar.bz2 strongswan-c17f6f96e2da0265a5d565a43cbca036f1571dfb.tar.xz |
Log native thread ID when a thread is created.
If possible gettid() is used, otherwise pthread_self() is logged (which is
not completely portable, but seems to work on most supported platforms).
-rw-r--r-- | configure.in | 11 | ||||
-rw-r--r-- | src/libstrongswan/threading/thread.c | 17 |
2 files changed, 27 insertions, 1 deletions
diff --git a/configure.in b/configure.in index 4f4f03554..b6c35703a 100644 --- a/configure.in +++ b/configure.in @@ -380,6 +380,17 @@ dnl check if native rwlocks are available AC_CHECK_FUNCS(pthread_rwlock_init) LIBS=$saved_LIBS +AC_MSG_CHECKING([for gettid]) +AC_TRY_COMPILE( + [#define _GNU_SOURCE + #include <unistd.h> + #include <sys/syscall.h>], + [int main() { + return syscall(SYS_gettid);}], + [AC_MSG_RESULT([yes]); AC_DEFINE([HAVE_GETTID])], + [AC_MSG_RESULT([no])] +) + AC_CHECK_FUNCS(prctl mallinfo getpass closefrom) AC_CHECK_HEADERS(sys/sockio.h glob.h) diff --git a/src/libstrongswan/threading/thread.c b/src/libstrongswan/threading/thread.c index d3da1e379..9092bf7b7 100644 --- a/src/libstrongswan/threading/thread.c +++ b/src/libstrongswan/threading/thread.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Tobias Brunner + * Copyright (C) 2009-2011 Tobias Brunner * Hochschule fuer Technik Rapperswil * * This program is free software; you can redistribute it and/or modify it @@ -17,6 +17,10 @@ #include <pthread.h> #include <signal.h> #include <semaphore.h> +#ifdef HAVE_GETTID +#include <unistd.h> +#include <sys/syscall.h> +#endif #include <library.h> #include <debug.h> @@ -278,6 +282,17 @@ static void *thread_main(private_thread_t *this) sem_wait(&this->created); current_thread->set(current_thread, this); pthread_cleanup_push((thread_cleanup_t)thread_cleanup, this); + + /* TODO: this is not 100% portable as pthread_t is an opaque type (i.e. + * could be of any size, or even a struct) */ +#ifdef HAVE_GETTID + DBG2(DBG_LIB, "created thread %.2d [%u]", + this->id, syscall(SYS_gettid)); +#else + DBG2(DBG_LIB, "created thread %.2d [%lx]", + this->id, (u_long)this->thread_id); +#endif + res = this->main(this->arg); pthread_cleanup_pop(TRUE); |