mirror of
https://sourceware.org/git/glibc.git
synced 2025-10-12 19:04:54 +03:00
Linux: Add the pthread_gettid_np function (bug 27880)
Current Bionic has this function, with enhanced error checking (the undefined case terminates the process). Reviewed-by: Joseph Myers <josmyers@redhat.com>
This commit is contained in:
2
NEWS
2
NEWS
@@ -16,6 +16,8 @@ Major new features:
|
||||
|
||||
- Power and absolute-value functions: rsqrt.
|
||||
|
||||
* On Linux, the pthread_gettid_np function has been added.
|
||||
|
||||
Deprecated and removed features, and other changes affecting compatibility:
|
||||
|
||||
[Add deprecations, removals and changes affecting compatibility here]
|
||||
|
@@ -239,6 +239,24 @@ especially regarding reuse of the IDs of threads which have exited.
|
||||
This function is specific to Linux.
|
||||
@end deftypefun
|
||||
|
||||
@deftypefun pid_t pthread_gettid_np (pthread_t @var{thread})
|
||||
@standards{Linux, pthread.h}
|
||||
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
|
||||
This function returns the same value that @code{gettid} would return if
|
||||
executed on the running thread @var{thread}.
|
||||
|
||||
If @var{thread} is no longer running but it is joinable, it is
|
||||
unspecified whether this function returns @minus{}1, or if it returns
|
||||
the thread ID of the thread while it was running. If @var{thread} is
|
||||
not running and is not joinable, the behavior is undefined.
|
||||
|
||||
@strong{Portability Note:} Linux thread IDs can be reused rather quickly,
|
||||
so this function differs from the @code{pthread_getunique_np} function
|
||||
found on other systems.
|
||||
|
||||
This function is specific to Linux.
|
||||
@end deftypefun
|
||||
|
||||
@node Creating a Process
|
||||
@section Creating a Process
|
||||
|
||||
|
@@ -124,6 +124,7 @@ routines = \
|
||||
pthread_getname \
|
||||
pthread_getschedparam \
|
||||
pthread_getspecific \
|
||||
pthread_gettid_np \
|
||||
pthread_join \
|
||||
pthread_join_common \
|
||||
pthread_key_create \
|
||||
@@ -326,6 +327,7 @@ tests = \
|
||||
tst-pthread-timedlock-lockloop \
|
||||
tst-pthread_exit-nothreads \
|
||||
tst-pthread_exit-nothreads-static \
|
||||
tst-pthread_gettid_np \
|
||||
tst-robust-fork \
|
||||
tst-robustpi1 \
|
||||
tst-robustpi2 \
|
||||
|
@@ -378,6 +378,9 @@ libc {
|
||||
tss_get;
|
||||
tss_set;
|
||||
}
|
||||
GLIBC_2.42 {
|
||||
pthread_gettid_np;
|
||||
}
|
||||
GLIBC_PRIVATE {
|
||||
__libc_alloca_cutoff;
|
||||
__lll_lock_wake_private;
|
||||
|
30
nptl/pthread_gettid_np.c
Normal file
30
nptl/pthread_gettid_np.c
Normal file
@@ -0,0 +1,30 @@
|
||||
/* Get the Linux TID from a pthread_t handle.
|
||||
Copyright (C) 2025 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <pthreadP.h>
|
||||
|
||||
pid_t
|
||||
pthread_gettid_np (pthread_t threadid)
|
||||
{
|
||||
/* The kernel may concurrently set this field. */
|
||||
pid_t tid = atomic_load_relaxed (&((struct pthread *) threadid)->tid);
|
||||
if (tid <= 0)
|
||||
return -1;
|
||||
return tid;
|
||||
}
|
79
nptl/tst-pthread_gettid_np.c
Normal file
79
nptl/tst-pthread_gettid_np.c
Normal file
@@ -0,0 +1,79 @@
|
||||
/* Test for pthread_gettid_np.
|
||||
Copyright (C) 2025 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <pthread.h>
|
||||
#include <sched.h>
|
||||
#include <signal.h>
|
||||
#include <support/check.h>
|
||||
#include <support/xthread.h>
|
||||
#include <unistd.h>
|
||||
|
||||
static pthread_barrier_t barrier;
|
||||
|
||||
static pid_t thread_tid;
|
||||
|
||||
static void *
|
||||
thread_func (void *ignored)
|
||||
{
|
||||
thread_tid = gettid ();
|
||||
TEST_VERIFY (thread_tid != getpid ());
|
||||
TEST_COMPARE (thread_tid, pthread_gettid_np (pthread_self ()));
|
||||
xpthread_barrier_wait (&barrier);
|
||||
/* The main thread calls pthread_gettid_np here. */
|
||||
xpthread_barrier_wait (&barrier);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int
|
||||
do_test (void)
|
||||
{
|
||||
TEST_COMPARE (pthread_gettid_np (pthread_self ()), getpid ());
|
||||
TEST_COMPARE (pthread_gettid_np (pthread_self ()), gettid ());
|
||||
|
||||
xpthread_barrier_init (&barrier, NULL, 2);
|
||||
|
||||
pthread_t thr = xpthread_create (NULL, thread_func, NULL);
|
||||
xpthread_barrier_wait (&barrier);
|
||||
TEST_COMPARE (thread_tid, pthread_gettid_np (thr));
|
||||
xpthread_barrier_wait (&barrier);
|
||||
|
||||
while (true)
|
||||
{
|
||||
/* Check if the kernel thread is still running. */
|
||||
if (tgkill (getpid (), thread_tid, 0))
|
||||
{
|
||||
TEST_COMPARE (errno, ESRCH);
|
||||
break;
|
||||
}
|
||||
|
||||
pid_t tid = pthread_gettid_np (thr);
|
||||
if (tid != thread_tid)
|
||||
{
|
||||
TEST_COMPARE (tid, -1);
|
||||
break;
|
||||
}
|
||||
TEST_COMPARE (sched_yield (), 0);
|
||||
}
|
||||
|
||||
TEST_VERIFY (xpthread_join (thr) == NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#include <support/test-driver.c>
|
@@ -1317,6 +1317,11 @@ extern int pthread_getcpuclockid (pthread_t __thread_id,
|
||||
__THROW __nonnull ((2));
|
||||
#endif
|
||||
|
||||
#ifdef __USE_GNU
|
||||
/* Return the Linux TID for THREAD_ID. Returns -1 on failure. */
|
||||
extern pid_t pthread_gettid_np (pthread_t __thread_id);
|
||||
#endif
|
||||
|
||||
|
||||
/* Install handlers to be called when a new process is created with FORK.
|
||||
The PREPARE handler is called in the parent process just before performing
|
||||
|
@@ -2750,3 +2750,4 @@ GLIBC_2.39 stdc_trailing_zeros_ull F
|
||||
GLIBC_2.39 stdc_trailing_zeros_us F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
|
@@ -3097,6 +3097,7 @@ GLIBC_2.4 wprintf F
|
||||
GLIBC_2.4 wscanf F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
GLIBC_2.5 __readlinkat_chk F
|
||||
GLIBC_2.5 inet6_opt_append F
|
||||
GLIBC_2.5 inet6_opt_find F
|
||||
|
@@ -2511,3 +2511,4 @@ GLIBC_2.39 stdc_trailing_zeros_ull F
|
||||
GLIBC_2.39 stdc_trailing_zeros_us F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
|
@@ -2803,6 +2803,7 @@ GLIBC_2.4 xprt_register F
|
||||
GLIBC_2.4 xprt_unregister F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
GLIBC_2.5 __readlinkat_chk F
|
||||
GLIBC_2.5 inet6_opt_append F
|
||||
GLIBC_2.5 inet6_opt_find F
|
||||
|
@@ -2800,6 +2800,7 @@ GLIBC_2.4 xprt_register F
|
||||
GLIBC_2.4 xprt_unregister F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
GLIBC_2.5 __readlinkat_chk F
|
||||
GLIBC_2.5 inet6_opt_append F
|
||||
GLIBC_2.5 inet6_opt_find F
|
||||
|
@@ -2787,3 +2787,4 @@ GLIBC_2.39 stdc_trailing_zeros_ull F
|
||||
GLIBC_2.39 stdc_trailing_zeros_us F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
|
@@ -2824,6 +2824,7 @@ GLIBC_2.4 unshare F
|
||||
GLIBC_2.41 cacheflush F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
GLIBC_2.5 __readlinkat_chk F
|
||||
GLIBC_2.5 inet6_opt_append F
|
||||
GLIBC_2.5 inet6_opt_find F
|
||||
|
@@ -3007,6 +3007,7 @@ GLIBC_2.4 unlinkat F
|
||||
GLIBC_2.4 unshare F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
GLIBC_2.5 __readlinkat_chk F
|
||||
GLIBC_2.5 inet6_opt_append F
|
||||
GLIBC_2.5 inet6_opt_find F
|
||||
|
@@ -2271,3 +2271,4 @@ GLIBC_2.39 stdc_trailing_zeros_ull F
|
||||
GLIBC_2.39 stdc_trailing_zeros_us F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
|
@@ -2783,6 +2783,7 @@ GLIBC_2.4 xprt_register F
|
||||
GLIBC_2.4 xprt_unregister F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
GLIBC_2.5 __readlinkat_chk F
|
||||
GLIBC_2.5 inet6_opt_append F
|
||||
GLIBC_2.5 inet6_opt_find F
|
||||
|
@@ -2950,6 +2950,7 @@ GLIBC_2.4 unlinkat F
|
||||
GLIBC_2.4 unshare F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
GLIBC_2.5 __readlinkat_chk F
|
||||
GLIBC_2.5 inet6_opt_append F
|
||||
GLIBC_2.5 inet6_opt_find F
|
||||
|
@@ -2836,3 +2836,4 @@ GLIBC_2.39 stdc_trailing_zeros_ull F
|
||||
GLIBC_2.39 stdc_trailing_zeros_us F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
|
@@ -2833,3 +2833,4 @@ GLIBC_2.39 stdc_trailing_zeros_ull F
|
||||
GLIBC_2.39 stdc_trailing_zeros_us F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
|
@@ -2911,6 +2911,7 @@ GLIBC_2.4 unlinkat F
|
||||
GLIBC_2.4 unshare F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
GLIBC_2.5 __readlinkat_chk F
|
||||
GLIBC_2.5 inet6_opt_append F
|
||||
GLIBC_2.5 inet6_opt_find F
|
||||
|
@@ -2909,6 +2909,7 @@ GLIBC_2.4 unlinkat F
|
||||
GLIBC_2.4 unshare F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
GLIBC_2.5 __readlinkat_chk F
|
||||
GLIBC_2.5 inet6_opt_append F
|
||||
GLIBC_2.5 inet6_opt_find F
|
||||
|
@@ -2917,6 +2917,7 @@ GLIBC_2.4 unlinkat F
|
||||
GLIBC_2.4 unshare F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
GLIBC_2.5 __readlinkat_chk F
|
||||
GLIBC_2.5 inet6_opt_append F
|
||||
GLIBC_2.5 inet6_opt_find F
|
||||
|
@@ -2819,6 +2819,7 @@ GLIBC_2.4 unlinkat F
|
||||
GLIBC_2.4 unshare F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
GLIBC_2.5 __readlinkat_chk F
|
||||
GLIBC_2.5 inet6_opt_append F
|
||||
GLIBC_2.5 inet6_opt_find F
|
||||
|
@@ -2261,3 +2261,4 @@ GLIBC_2.40 setcontext F
|
||||
GLIBC_2.40 swapcontext F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
|
@@ -3140,6 +3140,7 @@ GLIBC_2.4 wprintf F
|
||||
GLIBC_2.4 wscanf F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
GLIBC_2.5 __readlinkat_chk F
|
||||
GLIBC_2.5 inet6_opt_append F
|
||||
GLIBC_2.5 inet6_opt_find F
|
||||
|
@@ -3185,6 +3185,7 @@ GLIBC_2.4 wprintf F
|
||||
GLIBC_2.4 wscanf F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
GLIBC_2.5 __readlinkat_chk F
|
||||
GLIBC_2.5 inet6_opt_append F
|
||||
GLIBC_2.5 inet6_opt_find F
|
||||
|
@@ -2894,6 +2894,7 @@ GLIBC_2.4 wprintf F
|
||||
GLIBC_2.4 wscanf F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
GLIBC_2.5 __readlinkat_chk F
|
||||
GLIBC_2.5 inet6_opt_append F
|
||||
GLIBC_2.5 inet6_opt_find F
|
||||
|
@@ -2970,3 +2970,4 @@ GLIBC_2.39 stdc_trailing_zeros_ull F
|
||||
GLIBC_2.39 stdc_trailing_zeros_us F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
|
@@ -2514,3 +2514,4 @@ GLIBC_2.39 stdc_trailing_zeros_us F
|
||||
GLIBC_2.40 __riscv_hwprobe F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
|
@@ -2714,3 +2714,4 @@ GLIBC_2.39 stdc_trailing_zeros_us F
|
||||
GLIBC_2.40 __riscv_hwprobe F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
|
@@ -3138,6 +3138,7 @@ GLIBC_2.4 wprintf F
|
||||
GLIBC_2.4 wscanf F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
GLIBC_2.5 __readlinkat_chk F
|
||||
GLIBC_2.5 inet6_opt_append F
|
||||
GLIBC_2.5 inet6_opt_find F
|
||||
|
@@ -2931,6 +2931,7 @@ GLIBC_2.4 wprintf F
|
||||
GLIBC_2.4 wscanf F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
GLIBC_2.5 __readlinkat_chk F
|
||||
GLIBC_2.5 inet6_opt_append F
|
||||
GLIBC_2.5 inet6_opt_find F
|
||||
|
@@ -2830,6 +2830,7 @@ GLIBC_2.4 unlinkat F
|
||||
GLIBC_2.4 unshare F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
GLIBC_2.5 __readlinkat_chk F
|
||||
GLIBC_2.5 inet6_opt_append F
|
||||
GLIBC_2.5 inet6_opt_find F
|
||||
|
@@ -2827,6 +2827,7 @@ GLIBC_2.4 unlinkat F
|
||||
GLIBC_2.4 unshare F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
GLIBC_2.5 __readlinkat_chk F
|
||||
GLIBC_2.5 inet6_opt_append F
|
||||
GLIBC_2.5 inet6_opt_find F
|
||||
|
@@ -3159,6 +3159,7 @@ GLIBC_2.4 wprintf F
|
||||
GLIBC_2.4 wscanf F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
GLIBC_2.5 __readlinkat_chk F
|
||||
GLIBC_2.5 inet6_opt_append F
|
||||
GLIBC_2.5 inet6_opt_find F
|
||||
|
@@ -2795,6 +2795,7 @@ GLIBC_2.4 unlinkat F
|
||||
GLIBC_2.4 unshare F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
GLIBC_2.5 __readlinkat_chk F
|
||||
GLIBC_2.5 inet6_opt_append F
|
||||
GLIBC_2.5 inet6_opt_find F
|
||||
|
@@ -2746,6 +2746,7 @@ GLIBC_2.4 unlinkat F
|
||||
GLIBC_2.4 unshare F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
GLIBC_2.5 __readlinkat_chk F
|
||||
GLIBC_2.5 inet6_opt_append F
|
||||
GLIBC_2.5 inet6_opt_find F
|
||||
|
@@ -2765,3 +2765,4 @@ GLIBC_2.39 stdc_trailing_zeros_ull F
|
||||
GLIBC_2.39 stdc_trailing_zeros_us F
|
||||
GLIBC_2.41 sched_getattr F
|
||||
GLIBC_2.41 sched_setattr F
|
||||
GLIBC_2.42 pthread_gettid_np F
|
||||
|
Reference in New Issue
Block a user