50 lines
1.6 KiB
Diff
50 lines
1.6 KiB
Diff
From d49cf07541bb54a5ac7aec1feec8514db33db8ea Mon Sep 17 00:00:00 2001
|
|
From: Rich Felker <dalias@aerifal.cx>
|
|
Date: Mon, 17 Aug 2020 20:12:53 -0400
|
|
Subject: [PATCH] add gettid function
|
|
|
|
this is a prerequisite for addition of other interfaces that use
|
|
kernel tids, including futex and SIGEV_THREAD_ID.
|
|
|
|
there is some ambiguity as to whether the semantic return type should
|
|
be int or pid_t. either way, futex API imposes a contract that the
|
|
values fit in int (excluding some upper reserved bits). glibc used
|
|
pid_t, so in the interest of not having gratuitous mismatch (the
|
|
underlying types are the same anyway), pid_t is used here as well.
|
|
|
|
while conceptually this is a syscall, the copy stored in the thread
|
|
structure is always valid in all contexts where it's valid to call
|
|
libc functions, so it's used to avoid the syscall.
|
|
---
|
|
include/unistd.h | 1 +
|
|
src/linux/gettid.c | 8 ++++++++
|
|
2 files changed, 9 insertions(+)
|
|
create mode 100644 src/linux/gettid.c
|
|
|
|
diff --git a/include/unistd.h b/include/unistd.h
|
|
index 7bcbff943..07584a23e 100644
|
|
--- a/include/unistd.h
|
|
+++ b/include/unistd.h
|
|
@@ -190,6 +190,7 @@ int syncfs(int);
|
|
int euidaccess(const char *, int);
|
|
int eaccess(const char *, int);
|
|
ssize_t copy_file_range(int, off_t *, int, off_t *, size_t, unsigned);
|
|
+pid_t gettid(void);
|
|
#endif
|
|
|
|
#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
|
|
diff --git a/src/linux/gettid.c b/src/linux/gettid.c
|
|
new file mode 100644
|
|
index 000000000..70767137e
|
|
--- /dev/null
|
|
+++ b/src/linux/gettid.c
|
|
@@ -0,0 +1,8 @@
|
|
+#define _GNU_SOURCE
|
|
+#include <unistd.h>
|
|
+#include "pthread_impl.h"
|
|
+
|
|
+pid_t gettid(void)
|
|
+{
|
|
+ return __pthread_self()->tid;
|
|
+}
|