#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 void
+ucwlib_free_thread_context(void *p)
+{
+ xfree(p);
+}
+
static void CONSTRUCTOR
ucwlib_threads_init(void)
{
- if (pthread_key_create(&ucwlib_context_key, NULL) < 0)
+ if (pthread_key_create(&ucwlib_context_key, ucwlib_free_thread_context) < 0)
die("Cannot create pthread_key: %m");
pthread_mutex_init(&ucwlib_master_mutex, NULL);
}
+static int
+ucwlib_tid(void)
+{
+ 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();
+ tid = ++tid_counter;
+ ucwlib_unlock();
+ return tid;
+}
+
struct ucwlib_context *
ucwlib_thread_context(void)
{
if (!c)
{
c = xmalloc_zero(sizeof(*c));
+ c->thread_id = ucwlib_tid();
pthread_setspecific(ucwlib_context_key, c);
}
return c;
#else
struct ucwlib_context *
-ucw_thread_context(void)
+ucwlib_thread_context(void)
{
static struct ucwlib_context ucwlib_context;
return &ucwlib_context;
{
ucwlib_lock();
ucwlib_unlock();
- ucwlib_thread_context();
+ log(L_INFO, "tid=%d", ucwlib_thread_context()->thread_id);
return 0;
}