diff --git a/configure b/configure index 0aac3491608..0451ec739f0 100755 --- a/configure +++ b/configure @@ -13247,10 +13247,12 @@ fi + for ac_func in \ _lwp_create \ + _lwp_self \ _pclose \ _popen \ _snprintf \ diff --git a/configure.ac b/configure.ac index 8eb46ee03e4..649a9da5720 100644 --- a/configure.ac +++ b/configure.ac @@ -943,6 +943,7 @@ dnl **** Check for functions **** AC_FUNC_ALLOCA() AC_CHECK_FUNCS(\ _lwp_create \ + _lwp_self \ _pclose \ _popen \ _snprintf \ diff --git a/include/config.h.in b/include/config.h.in index 65062d828ad..4d37b997c9e 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -677,6 +677,9 @@ /* Define to 1 if you have the `_lwp_create' function. */ #undef HAVE__LWP_CREATE +/* Define to 1 if you have the `_lwp_self' function. */ +#undef HAVE__LWP_SELF + /* Define to 1 if you have the `_pclose' function. */ #undef HAVE__PCLOSE diff --git a/include/thread.h b/include/thread.h index 5fadd2b5b5c..2e4798dbaf2 100644 --- a/include/thread.h +++ b/include/thread.h @@ -147,6 +147,7 @@ extern TEB *THREAD_IdToTEB( DWORD id ); /* scheduler/sysdeps.c */ extern int SYSDEPS_SpawnThread( TEB *teb ); extern void SYSDEPS_SetCurThread( TEB *teb ); +extern int SYSDEPS_GetUnixTid(void); extern void SYSDEPS_InitErrno(void); extern void DECLSPEC_NORETURN SYSDEPS_ExitThread( int status ); extern void DECLSPEC_NORETURN SYSDEPS_AbortThread( int status ); diff --git a/scheduler/client.c b/scheduler/client.c index 8d3a554348f..4024cbc8970 100644 --- a/scheduler/client.c +++ b/scheduler/client.c @@ -694,7 +694,7 @@ void CLIENT_InitThread(void) SERVER_START_REQ( init_thread ) { req->unix_pid = getpid(); - req->unix_tid = -1; + req->unix_tid = SYSDEPS_GetUnixTid(); req->teb = teb; req->entry = teb->entry_point; req->reply_fd = reply_pipe[1]; diff --git a/scheduler/sysdeps.c b/scheduler/sysdeps.c index 7c322d120ea..ac62ecca101 100644 --- a/scheduler/sysdeps.c +++ b/scheduler/sysdeps.c @@ -317,6 +317,25 @@ void SYSDEPS_AbortThread( int status ) _exit( status ); } +/*********************************************************************** + * SYSDEPS_GetUnixTid + * + * Get the Unix tid of the current thread. + */ +int SYSDEPS_GetUnixTid(void) +{ +#ifdef HAVE__LWP_SELF + return _lwp_self(); +#elif defined(__linux__) && defined(__i386__) + int ret; + __asm__("int $0x80" : "=a" (ret) : "0" (224) /* SYS_gettid */); + if (ret < 0) ret = -1; + return ret; +#else + return -1; +#endif +} + /* default errno before threading is initialized */ static int *default_errno_location(void)