summaryrefslogtreecommitdiff
path: root/rts/posix/OSThreads.c
diff options
context:
space:
mode:
Diffstat (limited to 'rts/posix/OSThreads.c')
-rw-r--r--rts/posix/OSThreads.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/rts/posix/OSThreads.c b/rts/posix/OSThreads.c
index c29454809f..5fd09982de 100644
--- a/rts/posix/OSThreads.c
+++ b/rts/posix/OSThreads.c
@@ -23,6 +23,12 @@
#include "Rts.h"
+#if defined(linux_HOST_OS)
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/syscall.h>
+#endif
+
#if defined(THREADED_RTS)
#include "RtsUtils.h"
#include "Task.h"
@@ -312,4 +318,24 @@ nat getNumberOfProcessors (void)
return 1;
}
+#endif /* defined(THREADED_RTS) */
+
+KernelThreadId kernelThreadId (void)
+{
+#if defined(linux_HOST_OS)
+ pid_t tid = syscall(SYS_gettid); // no really, see man gettid
+ return tid;
+
+#elif defined(freebsd_HOST_OS)
+ return pthread_getthreadid_np();
+
+#elif defined(darwin_HOST_OS)
+ uint64_t ktid;
+ pthread_threadid_np(NULL, &ktid);
+ return ktid;
+
+#else
+ // unsupported
+ return 0;
#endif
+}