X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Fthreads.c;h=d2e0f220d769bce15c34935cb12ca259e8413cfe;hb=8f5b597a0c9187c0d7bc7785be0886023203dbfd;hp=f45c8e38a95a36bf8de359e32e526748e2192283;hpb=66f968af299fe8ce6ba65b38fd3cb477e9112818;p=libucw.git diff --git a/lib/threads.c b/lib/threads.c index f45c8e38..d2e0f220 100644 --- a/lib/threads.c +++ b/lib/threads.c @@ -14,6 +14,15 @@ #include +#ifdef CONFIG_LINUX +#include +#include +#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; @@ -31,6 +40,25 @@ ucwlib_threads_init(void) 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) { @@ -38,6 +66,7 @@ ucwlib_thread_context(void) if (!c) { c = xmalloc_zero(sizeof(*c)); + c->thread_id = ucwlib_tid(); pthread_setspecific(ucwlib_context_key, c); } return c; @@ -58,7 +87,7 @@ ucwlib_unlock(void) #else struct ucwlib_context * -ucw_thread_context(void) +ucwlib_thread_context(void) { static struct ucwlib_context ucwlib_context; return &ucwlib_context; @@ -82,7 +111,7 @@ int main(void) { ucwlib_lock(); ucwlib_unlock(); - ucwlib_thread_context(); + log(L_INFO, "tid=%d", ucwlib_thread_context()->thread_id); return 0; }