This is a hack for two reasons:
o Current glibc releases (up to 2.5) have no wrapper for gettid(),
so we have to use _syscall0 to access it.
o There is no guarantee that pthreads will correspond to kernel
threads. However, in the two existing implementations of pthreads
on Linux, they correspond either to kernel processes or kernel
threads, so assumptions that the (pid, tid) pair is unique are
correct.
On the other hand, using real thread ID's has many advantages,
so I am keeping this patch at least in the dev-sorter branch to see
if it's safe or not.
#include <pthread.h>
+#ifdef CONFIG_LINUX
+#include <sys/types.h>
+#include <linux/unistd.h>
+#ifdef __NR_gettid
+static _syscall0(pid_t, gettid)
+#define CONFIG_USE_GETTID
+#endif
+#endif
+
static pthread_key_t ucwlib_context_key;
static pthread_mutex_t ucwlib_master_mutex;
static int
ucwlib_tid(void)
{
- static tid_counter;
+ static int tid_counter;
+ int tid;
+
+#ifdef CONFIG_USE_GETTID
+ tid = gettid();
+ if (tid > 0)
+ return tid;
+ /* The syscall might be unimplemented */
+#endif
ucwlib_lock();
- int tid = ++tid_counter;
+ tid = ++tid_counter;
ucwlib_unlock();
return tid;
}