mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 12:30:06 +00:00
Linux: Add gettid system call wrapper [BZ #6399]
This commit adds gettid to <unistd.h> on Linux, and not to the kernel-independent GNU API. gettid is now supportable on Linux because too many things assume a 1:1 mapping between libpthread threads and kernel threads. Reviewed-by: Carlos O'Donell <carlos@redhat.com>
This commit is contained in:
parent
f289e656ec
commit
1d0fc21382
70
ChangeLog
70
ChangeLog
@ -1,3 +1,73 @@
|
||||
2019-01-31 Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
[BZ #6399]
|
||||
Linux: Add gettid system call wrapper.
|
||||
* posix/Makefile (headers): Add bits/unistd_ext.h.
|
||||
* posix/bits/unistd_ext.h: New file.
|
||||
* posix/unistd.h: Include it.
|
||||
* manual/process.texi (Process Identification): Document gettid.
|
||||
* sysdeps/unix/sysv/linux/Makefile [subdir == misc] (tests): Add
|
||||
tst-gettid, tst-gettid-kill.
|
||||
(tst-gettid): Link with $(shared-thread-library).
|
||||
* sysdeps/unix/sysv/linux/Version (GLIBC_2.30): Export gettid.
|
||||
* sysdeps/unix/sysv/linux/bits/unistd_ext.h: New file.
|
||||
* sysdeps/unix/sysv/linux/bits/syscalls.list (gettid): Add.
|
||||
* sysdeps/unix/sysv/linux/bits/tst-gettid.c: New file.
|
||||
* sysdeps/unix/sysv/linux/bits/tst-gettid-kill.c: Likewise.
|
||||
* sysdeps/unix/sysv/linux/aarch64/libc.abilist (GLIBC_2.30):
|
||||
Add gettid.
|
||||
* sysdeps/unix/sysv/linux/alpha/libc.abilist (GLIBC_2.30):
|
||||
Likewise.
|
||||
* sysdeps/unix/sysv/linux/arm/libc.abilist (GLIBC_2.30): Likewise.
|
||||
* sysdeps/unix/sysv/linux/csky/libc.abilist (GLIBC_2.30):
|
||||
Likewise.
|
||||
* sysdeps/unix/sysv/linux/hppa/libc.abilist (GLIBC_2.30):
|
||||
Likewise.
|
||||
* sysdeps/unix/sysv/linux/i386/libc.abilist (GLIBC_2.30):
|
||||
Likewise.
|
||||
* sysdeps/unix/sysv/linux/ia64/libc.abilist (GLIBC_2.30):
|
||||
Likewise.
|
||||
* sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist (GLIBC_2.30):
|
||||
Likewise.
|
||||
* sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist (GLIBC_2.30):
|
||||
Likewise.
|
||||
* sysdeps/unix/sysv/linux/microblaze/libc.abilist (GLIBC_2.30):
|
||||
Likewise.
|
||||
* sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
|
||||
(GLIBC_2.30): Likewise.
|
||||
* sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
|
||||
(GLIBC_2.30): Likewise.
|
||||
* sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
|
||||
(GLIBC_2.30): Likewise.
|
||||
* sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
|
||||
(GLIBC_2.30): Likewise.
|
||||
* sysdeps/unix/sysv/linux/nios2/libc.abilist (GLIBC_2.30):
|
||||
Likewise.
|
||||
* sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
|
||||
(GLIBC_2.30): Likewise.
|
||||
* sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
|
||||
(GLIBC_2.30): Likewise.
|
||||
* sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
|
||||
(GLIBC_2.30): Likewise.
|
||||
* sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
|
||||
(GLIBC_2.30): Likewise.
|
||||
* sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist (GLIBC_2.30):
|
||||
Likewise.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist (GLIBC_2.30):
|
||||
Likewise.
|
||||
* sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist (GLIBC_2.30):
|
||||
Likewise.
|
||||
* sysdeps/unix/sysv/linux/sh/libc.abilist (GLIBC_2.30): Likewise.
|
||||
* sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist (GLIBC_2.30):
|
||||
Likewise.
|
||||
* sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist (GLIBC_2.30):
|
||||
Likewise.
|
||||
* sysdeps/unix/sysv/linux/x86_64/64/libc.abilist (GLIBC_2.30):
|
||||
Likewise.
|
||||
* sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist (GLIBC_2.30):
|
||||
Likewise.
|
||||
* sysdeps/unix/sysv/linux/tst-setgetname.c (gettid): Remove.
|
||||
|
||||
2019-02-07 Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
* rt/clock-compat.c (COMPAT_REDIRECT): Turn librt forwarders into
|
||||
|
2
NEWS
2
NEWS
@ -12,6 +12,8 @@ Major new features:
|
||||
* The dynamic linker accepts the --preload argument to preload shared
|
||||
objects, in addition to the LD_PRELOAD environment variable.
|
||||
|
||||
* On Linux, the gettid function has been added.
|
||||
|
||||
Deprecated and removed features, and other changes affecting compatibility:
|
||||
|
||||
* The functions clock_gettime, clock_getres, clock_settime,
|
||||
|
@ -228,6 +228,17 @@ The @code{getppid} function returns the process ID of the parent of the
|
||||
current process.
|
||||
@end deftypefun
|
||||
|
||||
@deftypefun pid_t gettid (void)
|
||||
@standards{Linux, unistd.h}
|
||||
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
|
||||
The @code{gettid} function returns the thread ID of the current
|
||||
thread. The returned value is obtained from the Linux kernel and is
|
||||
not subject to caching. See the discussion of thread IDs above,
|
||||
especially regarding reuse of the IDs of threads which have exited.
|
||||
|
||||
This function is specific to Linux.
|
||||
@end deftypefun
|
||||
|
||||
@node Creating a Process
|
||||
@section Creating a Process
|
||||
|
||||
|
@ -31,7 +31,8 @@ headers := sys/utsname.h sys/times.h sys/wait.h sys/types.h unistd.h \
|
||||
bits/local_lim.h tar.h bits/utsname.h bits/confname.h \
|
||||
bits/waitflags.h bits/waitstatus.h sys/unistd.h sched.h \
|
||||
bits/sched.h bits/cpu-set.h re_comp.h wait.h bits/environments.h \
|
||||
cpio.h spawn.h bits/unistd.h bits/types/struct_sched_param.h
|
||||
cpio.h spawn.h bits/unistd.h bits/types/struct_sched_param.h \
|
||||
bits/unistd_ext.h
|
||||
|
||||
routines := \
|
||||
uname \
|
||||
|
21
posix/bits/unistd_ext.h
Normal file
21
posix/bits/unistd_ext.h
Normal file
@ -0,0 +1,21 @@
|
||||
/* System-specific extensions of <unistd.h>, generic version.
|
||||
Copyright (C) 2019 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; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _UNISTD_H
|
||||
# error "Never include <bits/unistd_ext.h> directly; use <unistd.h> instead."
|
||||
#endif
|
@ -1166,6 +1166,9 @@ int getentropy (void *__buffer, size_t __length) __wur;
|
||||
# include <bits/unistd.h>
|
||||
#endif
|
||||
|
||||
/* System-specific extensions. */
|
||||
#include <bits/unistd_ext.h>
|
||||
|
||||
__END_DECLS
|
||||
|
||||
#endif /* unistd.h */
|
||||
|
@ -53,10 +53,9 @@ sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h \
|
||||
tests += tst-clone tst-clone2 tst-clone3 tst-fanotify tst-personality \
|
||||
tst-quota tst-sync_file_range tst-sysconf-iov_max tst-ttyname \
|
||||
test-errno-linux tst-memfd_create tst-mlock2 tst-pkey \
|
||||
tst-rlimit-infinity tst-ofdlocks
|
||||
tst-rlimit-infinity tst-ofdlocks tst-gettid tst-gettid-kill
|
||||
tests-internal += tst-ofdlocks-compat
|
||||
|
||||
|
||||
# Generate the list of SYS_* macros for the system calls (__NR_*
|
||||
# macros). The file syscall-names.list contains all possible system
|
||||
# call names, and the generated header file produces SYS_* macros for
|
||||
@ -114,6 +113,9 @@ $(objpfx)tst-mman-consts.out: ../sysdeps/unix/sysv/linux/tst-mman-consts.py
|
||||
$(CPPFLAGS))" \
|
||||
< /dev/null > $@ 2>&1; $(evaluate-test)
|
||||
|
||||
$(objpfx)tst-gettid: $(shared-thread-library)
|
||||
$(objpfx)tst-gettid-kill: $(shared-thread-library)
|
||||
|
||||
endif # $(subdir) == misc
|
||||
|
||||
ifeq ($(subdir),time)
|
||||
|
@ -174,6 +174,9 @@ libc {
|
||||
GLIBC_2.29 {
|
||||
getcpu;
|
||||
}
|
||||
GLIBC_2.30 {
|
||||
gettid;
|
||||
}
|
||||
GLIBC_PRIVATE {
|
||||
# functions used in other libraries
|
||||
__syscall_rt_sigqueueinfo;
|
||||
|
@ -2141,3 +2141,4 @@ GLIBC_2.28 thrd_yield F
|
||||
GLIBC_2.29 getcpu F
|
||||
GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
|
||||
GLIBC_2.29 posix_spawn_file_actions_addfchdir_np F
|
||||
GLIBC_2.30 gettid F
|
||||
|
@ -2204,6 +2204,7 @@ GLIBC_2.3.4 setipv4sourcefilter F
|
||||
GLIBC_2.3.4 setsourcefilter F
|
||||
GLIBC_2.3.4 xdr_quad_t F
|
||||
GLIBC_2.3.4 xdr_u_quad_t F
|
||||
GLIBC_2.30 gettid F
|
||||
GLIBC_2.4 _IO_fprintf F
|
||||
GLIBC_2.4 _IO_printf F
|
||||
GLIBC_2.4 _IO_sprintf F
|
||||
|
@ -126,6 +126,7 @@ GLIBC_2.28 thrd_yield F
|
||||
GLIBC_2.29 getcpu F
|
||||
GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
|
||||
GLIBC_2.29 posix_spawn_file_actions_addfchdir_np F
|
||||
GLIBC_2.30 gettid F
|
||||
GLIBC_2.4 _Exit F
|
||||
GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
|
||||
GLIBC_2.4 _IO_2_1_stdin_ D 0xa0
|
||||
|
36
sysdeps/unix/sysv/linux/bits/unistd_ext.h
Normal file
36
sysdeps/unix/sysv/linux/bits/unistd_ext.h
Normal file
@ -0,0 +1,36 @@
|
||||
/* System-specific extensions of <unistd.h>, Linux version.
|
||||
Copyright (C) 2019 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; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _UNISTD_H
|
||||
# error "Never include <bits/unistd_ext.h> directly; use <unistd.h> instead."
|
||||
#endif
|
||||
|
||||
#ifdef __USE_GNU
|
||||
|
||||
/* Return the kernel thread ID (TID) of the current thread. The
|
||||
returned value is not subject to caching. Most Linux system calls
|
||||
accept a TID in place of a PID. Using the TID to change properties
|
||||
of a thread that has been created using pthread_create can lead to
|
||||
undefined behavior (comparable to manipulating file descriptors
|
||||
directly that have not been created explicitly). Note that a TID
|
||||
uniquely identifies a thread only while this thread is running; a
|
||||
TID can be reused once a thread has exited, even if the thread is
|
||||
not detached and has not been joined. */
|
||||
extern __pid_t gettid (void) __THROW;
|
||||
|
||||
#endif
|
@ -2085,3 +2085,4 @@ GLIBC_2.29 xdrstdio_create F
|
||||
GLIBC_2.29 xencrypt F
|
||||
GLIBC_2.29 xprt_register F
|
||||
GLIBC_2.29 xprt_unregister F
|
||||
GLIBC_2.30 gettid F
|
||||
|
@ -2037,6 +2037,7 @@ GLIBC_2.3.4 setipv4sourcefilter F
|
||||
GLIBC_2.3.4 setsourcefilter F
|
||||
GLIBC_2.3.4 xdr_quad_t F
|
||||
GLIBC_2.3.4 xdr_u_quad_t F
|
||||
GLIBC_2.30 gettid F
|
||||
GLIBC_2.4 __confstr_chk F
|
||||
GLIBC_2.4 __fgets_chk F
|
||||
GLIBC_2.4 __fgets_unlocked_chk F
|
||||
|
@ -2203,6 +2203,7 @@ GLIBC_2.3.4 setsourcefilter F
|
||||
GLIBC_2.3.4 vm86 F
|
||||
GLIBC_2.3.4 xdr_quad_t F
|
||||
GLIBC_2.3.4 xdr_u_quad_t F
|
||||
GLIBC_2.30 gettid F
|
||||
GLIBC_2.4 __confstr_chk F
|
||||
GLIBC_2.4 __fgets_chk F
|
||||
GLIBC_2.4 __fgets_unlocked_chk F
|
||||
|
@ -2069,6 +2069,7 @@ GLIBC_2.3.4 setipv4sourcefilter F
|
||||
GLIBC_2.3.4 setsourcefilter F
|
||||
GLIBC_2.3.4 xdr_quad_t F
|
||||
GLIBC_2.3.4 xdr_u_quad_t F
|
||||
GLIBC_2.30 gettid F
|
||||
GLIBC_2.4 __confstr_chk F
|
||||
GLIBC_2.4 __fgets_chk F
|
||||
GLIBC_2.4 __fgets_unlocked_chk F
|
||||
|
@ -127,6 +127,7 @@ GLIBC_2.28 thrd_yield F
|
||||
GLIBC_2.29 getcpu F
|
||||
GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
|
||||
GLIBC_2.29 posix_spawn_file_actions_addfchdir_np F
|
||||
GLIBC_2.30 gettid F
|
||||
GLIBC_2.4 _Exit F
|
||||
GLIBC_2.4 _IO_2_1_stderr_ D 0x98
|
||||
GLIBC_2.4 _IO_2_1_stdin_ D 0x98
|
||||
|
@ -2146,6 +2146,7 @@ GLIBC_2.3.4 setipv4sourcefilter F
|
||||
GLIBC_2.3.4 setsourcefilter F
|
||||
GLIBC_2.3.4 xdr_quad_t F
|
||||
GLIBC_2.3.4 xdr_u_quad_t F
|
||||
GLIBC_2.30 gettid F
|
||||
GLIBC_2.4 __confstr_chk F
|
||||
GLIBC_2.4 __fgets_chk F
|
||||
GLIBC_2.4 __fgets_unlocked_chk F
|
||||
|
@ -2133,3 +2133,4 @@ GLIBC_2.28 thrd_yield F
|
||||
GLIBC_2.29 getcpu F
|
||||
GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
|
||||
GLIBC_2.29 posix_spawn_file_actions_addfchdir_np F
|
||||
GLIBC_2.30 gettid F
|
||||
|
@ -2120,6 +2120,7 @@ GLIBC_2.3.4 setipv4sourcefilter F
|
||||
GLIBC_2.3.4 setsourcefilter F
|
||||
GLIBC_2.3.4 xdr_quad_t F
|
||||
GLIBC_2.3.4 xdr_u_quad_t F
|
||||
GLIBC_2.30 gettid F
|
||||
GLIBC_2.4 __confstr_chk F
|
||||
GLIBC_2.4 __fgets_chk F
|
||||
GLIBC_2.4 __fgets_unlocked_chk F
|
||||
|
@ -2118,6 +2118,7 @@ GLIBC_2.3.4 setipv4sourcefilter F
|
||||
GLIBC_2.3.4 setsourcefilter F
|
||||
GLIBC_2.3.4 xdr_quad_t F
|
||||
GLIBC_2.3.4 xdr_u_quad_t F
|
||||
GLIBC_2.30 gettid F
|
||||
GLIBC_2.4 __confstr_chk F
|
||||
GLIBC_2.4 __fgets_chk F
|
||||
GLIBC_2.4 __fgets_unlocked_chk F
|
||||
|
@ -2126,6 +2126,7 @@ GLIBC_2.3.4 setipv4sourcefilter F
|
||||
GLIBC_2.3.4 setsourcefilter F
|
||||
GLIBC_2.3.4 xdr_quad_t F
|
||||
GLIBC_2.3.4 xdr_u_quad_t F
|
||||
GLIBC_2.30 gettid F
|
||||
GLIBC_2.4 __confstr_chk F
|
||||
GLIBC_2.4 __fgets_chk F
|
||||
GLIBC_2.4 __fgets_unlocked_chk F
|
||||
|
@ -2120,6 +2120,7 @@ GLIBC_2.3.4 setipv4sourcefilter F
|
||||
GLIBC_2.3.4 setsourcefilter F
|
||||
GLIBC_2.3.4 xdr_quad_t F
|
||||
GLIBC_2.3.4 xdr_u_quad_t F
|
||||
GLIBC_2.30 gettid F
|
||||
GLIBC_2.4 __confstr_chk F
|
||||
GLIBC_2.4 __fgets_chk F
|
||||
GLIBC_2.4 __fgets_unlocked_chk F
|
||||
|
@ -2174,3 +2174,4 @@ GLIBC_2.28 thrd_yield F
|
||||
GLIBC_2.29 getcpu F
|
||||
GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
|
||||
GLIBC_2.29 posix_spawn_file_actions_addfchdir_np F
|
||||
GLIBC_2.30 gettid F
|
||||
|
@ -2164,6 +2164,7 @@ GLIBC_2.3.4 siglongjmp F
|
||||
GLIBC_2.3.4 swapcontext F
|
||||
GLIBC_2.3.4 xdr_quad_t F
|
||||
GLIBC_2.3.4 xdr_u_quad_t F
|
||||
GLIBC_2.30 gettid F
|
||||
GLIBC_2.4 _IO_fprintf F
|
||||
GLIBC_2.4 _IO_printf F
|
||||
GLIBC_2.4 _IO_sprintf F
|
||||
|
@ -2197,6 +2197,7 @@ GLIBC_2.3.4 siglongjmp F
|
||||
GLIBC_2.3.4 swapcontext F
|
||||
GLIBC_2.3.4 xdr_quad_t F
|
||||
GLIBC_2.3.4 xdr_u_quad_t F
|
||||
GLIBC_2.30 gettid F
|
||||
GLIBC_2.4 _IO_fprintf F
|
||||
GLIBC_2.4 _IO_printf F
|
||||
GLIBC_2.4 _IO_sprintf F
|
||||
|
@ -2027,6 +2027,7 @@ GLIBC_2.3.4 siglongjmp F
|
||||
GLIBC_2.3.4 swapcontext F
|
||||
GLIBC_2.3.4 xdr_quad_t F
|
||||
GLIBC_2.3.4 xdr_u_quad_t F
|
||||
GLIBC_2.30 gettid F
|
||||
GLIBC_2.4 _IO_fprintf F
|
||||
GLIBC_2.4 _IO_printf F
|
||||
GLIBC_2.4 _IO_sprintf F
|
||||
|
@ -2231,3 +2231,4 @@ GLIBC_2.28 thrd_yield F
|
||||
GLIBC_2.29 getcpu F
|
||||
GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
|
||||
GLIBC_2.29 posix_spawn_file_actions_addfchdir_np F
|
||||
GLIBC_2.30 gettid F
|
||||
|
@ -2103,3 +2103,4 @@ GLIBC_2.28 thrd_yield F
|
||||
GLIBC_2.29 getcpu F
|
||||
GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
|
||||
GLIBC_2.29 posix_spawn_file_actions_addfchdir_np F
|
||||
GLIBC_2.30 gettid F
|
||||
|
@ -2159,6 +2159,7 @@ GLIBC_2.3.4 setipv4sourcefilter F
|
||||
GLIBC_2.3.4 setsourcefilter F
|
||||
GLIBC_2.3.4 xdr_quad_t F
|
||||
GLIBC_2.3.4 xdr_u_quad_t F
|
||||
GLIBC_2.30 gettid F
|
||||
GLIBC_2.4 _IO_fprintf F
|
||||
GLIBC_2.4 _IO_printf F
|
||||
GLIBC_2.4 _IO_sprintf F
|
||||
|
@ -2063,6 +2063,7 @@ GLIBC_2.3.4 setipv4sourcefilter F
|
||||
GLIBC_2.3.4 setsourcefilter F
|
||||
GLIBC_2.3.4 xdr_quad_t F
|
||||
GLIBC_2.3.4 xdr_u_quad_t F
|
||||
GLIBC_2.30 gettid F
|
||||
GLIBC_2.4 _IO_fprintf F
|
||||
GLIBC_2.4 _IO_printf F
|
||||
GLIBC_2.4 _IO_sprintf F
|
||||
|
@ -2041,6 +2041,7 @@ GLIBC_2.3.4 setipv4sourcefilter F
|
||||
GLIBC_2.3.4 setsourcefilter F
|
||||
GLIBC_2.3.4 xdr_quad_t F
|
||||
GLIBC_2.3.4 xdr_u_quad_t F
|
||||
GLIBC_2.30 gettid F
|
||||
GLIBC_2.4 __confstr_chk F
|
||||
GLIBC_2.4 __fgets_chk F
|
||||
GLIBC_2.4 __fgets_unlocked_chk F
|
||||
|
@ -2153,6 +2153,7 @@ GLIBC_2.3.4 setipv4sourcefilter F
|
||||
GLIBC_2.3.4 setsourcefilter F
|
||||
GLIBC_2.3.4 xdr_quad_t F
|
||||
GLIBC_2.3.4 xdr_u_quad_t F
|
||||
GLIBC_2.30 gettid F
|
||||
GLIBC_2.4 _IO_fprintf F
|
||||
GLIBC_2.4 _IO_printf F
|
||||
GLIBC_2.4 _IO_sprintf F
|
||||
|
@ -2092,6 +2092,7 @@ GLIBC_2.3.4 setipv4sourcefilter F
|
||||
GLIBC_2.3.4 setsourcefilter F
|
||||
GLIBC_2.3.4 xdr_quad_t F
|
||||
GLIBC_2.3.4 xdr_u_quad_t F
|
||||
GLIBC_2.30 gettid F
|
||||
GLIBC_2.4 __confstr_chk F
|
||||
GLIBC_2.4 __fgets_chk F
|
||||
GLIBC_2.4 __fgets_unlocked_chk F
|
||||
|
@ -112,3 +112,4 @@ process_vm_writev EXTRA process_vm_writev i:ipipii process_vm_writev
|
||||
memfd_create EXTRA memfd_create i:si memfd_create
|
||||
pkey_alloc EXTRA pkey_alloc i:ii pkey_alloc
|
||||
pkey_free EXTRA pkey_free i:i pkey_free
|
||||
gettid EXTRA gettid Ei: __gettid gettid
|
||||
|
129
sysdeps/unix/sysv/linux/tst-gettid-kill.c
Normal file
129
sysdeps/unix/sysv/linux/tst-gettid-kill.c
Normal file
@ -0,0 +1,129 @@
|
||||
/* Verify the interaction of kill and thread groups.
|
||||
Copyright (C) 2019 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; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* This test demonstrates that a signal which is sent to a specified
|
||||
thread ID using the kill function is delivered to the entire thread
|
||||
group (as if it had been sent to the process group). */
|
||||
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
#include <support/check.h>
|
||||
#include <support/xsignal.h>
|
||||
#include <support/xthread.h>
|
||||
#include <support/xunistd.h>
|
||||
|
||||
/* Signal set containing SIGUSR1. */
|
||||
static sigset_t sigusr1_set;
|
||||
|
||||
/* Used to synchronize the threads. */
|
||||
static pthread_barrier_t barrier;
|
||||
|
||||
/* TID of the thread to which the signal is sent. */
|
||||
static pid_t target_tid;
|
||||
|
||||
/* Thread which is expected to receive the SIGUSR1 signal. */
|
||||
static pthread_t signal_thread;
|
||||
|
||||
/* Pipe used to block and terminate the signal thread. */
|
||||
static int pipe_signal[2];
|
||||
|
||||
static volatile sig_atomic_t handler_tid;
|
||||
|
||||
static void
|
||||
sigusr1_handler (int signo)
|
||||
{
|
||||
TEST_COMPARE (signo, SIGUSR1);
|
||||
TEST_VERIFY (pthread_self () == signal_thread);
|
||||
TEST_COMPARE (handler_tid, 0);
|
||||
handler_tid = gettid ();
|
||||
TEST_VERIFY (handler_tid > 0);
|
||||
/* Ensure that the read system call in thread_read exits if the
|
||||
signal is delivered before the system call is invoked. */
|
||||
char ch = 'X';
|
||||
xwrite (pipe_signal[1], &ch, 1);
|
||||
}
|
||||
|
||||
/* Thread which calls pause without expecting it to return. The TID
|
||||
of this thread is used as the target in the kill function call. */
|
||||
static void *
|
||||
thread_pause_noreturn (void *closure)
|
||||
{
|
||||
target_tid = gettid ();
|
||||
TEST_VERIFY (target_tid > 0);
|
||||
xpthread_barrier_wait (&barrier);
|
||||
pause ();
|
||||
FAIL_EXIT1 ("The pause function returned");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Thread which is expected to receive the signal. */
|
||||
static void *
|
||||
thread_read_signal (void *closure)
|
||||
{
|
||||
xpthread_sigmask (SIG_UNBLOCK, &sigusr1_set, NULL);
|
||||
xpthread_barrier_wait (&barrier);
|
||||
TEST_VERIFY (target_tid > 0);
|
||||
TEST_VERIFY (gettid () != target_tid);
|
||||
char ch;
|
||||
ssize_t ret = read (pipe_signal[0], &ch, 1);
|
||||
if (ret == 1)
|
||||
/* The signal was delivered before we entered the read system
|
||||
call. */
|
||||
TEST_COMPARE (ch, 'X');
|
||||
else
|
||||
{
|
||||
/* The signal was delivered while blocked in the read system
|
||||
call. */
|
||||
TEST_COMPARE (ret, -1);
|
||||
TEST_COMPARE (errno, EINTR);
|
||||
}
|
||||
TEST_COMPARE (handler_tid, gettid ());
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int
|
||||
do_test (void)
|
||||
{
|
||||
/* Block the SIGUSR1 signal in all threads. */
|
||||
sigemptyset (&sigusr1_set);
|
||||
sigaddset (&sigusr1_set, SIGUSR1);
|
||||
xpthread_sigmask (SIG_BLOCK, &sigusr1_set, NULL);
|
||||
|
||||
xsignal (SIGUSR1, sigusr1_handler);
|
||||
xpipe (pipe_signal);
|
||||
|
||||
xpthread_barrier_init (&barrier, NULL, 3);
|
||||
|
||||
pthread_t target_thread
|
||||
= xpthread_create (NULL, thread_pause_noreturn, NULL);
|
||||
signal_thread = xpthread_create (NULL, thread_read_signal, NULL);
|
||||
xpthread_barrier_wait (&barrier);
|
||||
|
||||
/* Send the SIGUSR1 signal to the thread which has it blocked, and
|
||||
expect it to be delivered to the other thread. */
|
||||
TEST_COMPARE (kill (target_tid, SIGUSR1), 0);
|
||||
|
||||
xpthread_join (signal_thread);
|
||||
xpthread_cancel (target_thread);
|
||||
xpthread_join (target_thread);
|
||||
|
||||
xpthread_barrier_destroy (&barrier);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#include <support/test-driver.c>
|
79
sysdeps/unix/sysv/linux/tst-gettid.c
Normal file
79
sysdeps/unix/sysv/linux/tst-gettid.c
Normal file
@ -0,0 +1,79 @@
|
||||
/* Smoke test for the gettid system call.
|
||||
Copyright (C) 2019 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; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <support/check.h>
|
||||
#include <support/namespace.h>
|
||||
#include <support/xthread.h>
|
||||
#include <support/xunistd.h>
|
||||
|
||||
/* TID of the initial (main) thread. */
|
||||
static pid_t initial_tid;
|
||||
|
||||
/* Check that PID and TID are the same in a subprocess. */
|
||||
static void
|
||||
subprocess (void *closure)
|
||||
{
|
||||
TEST_COMPARE (getpid (), gettid ());
|
||||
TEST_VERIFY (gettid () != initial_tid);
|
||||
}
|
||||
|
||||
/* Check that the TID changes in a new thread. */
|
||||
static void *
|
||||
threadfunc (void *closure)
|
||||
{
|
||||
TEST_VERIFY (getpid () != gettid ());
|
||||
TEST_VERIFY (gettid () != initial_tid);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Check for interactions with vfork. */
|
||||
static void
|
||||
test_vfork (void)
|
||||
{
|
||||
pid_t proc = vfork ();
|
||||
if (proc == 0)
|
||||
{
|
||||
if (getpid () != gettid ())
|
||||
_exit (1);
|
||||
if (gettid () == initial_tid)
|
||||
_exit (2);
|
||||
_exit (0);
|
||||
}
|
||||
int status;
|
||||
xwaitpid (proc, &status, 0);
|
||||
TEST_COMPARE (status, 0);
|
||||
}
|
||||
|
||||
static int
|
||||
do_test (void)
|
||||
{
|
||||
initial_tid = gettid ();
|
||||
|
||||
/* The main thread has the same TID as the PID. */
|
||||
TEST_COMPARE (getpid (), gettid ());
|
||||
|
||||
test_vfork ();
|
||||
|
||||
support_isolate_in_subprocess (subprocess, NULL);
|
||||
|
||||
xpthread_join (xpthread_create (NULL, threadfunc, NULL));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#include <support/test-driver.c>
|
@ -43,12 +43,6 @@
|
||||
terminator. */
|
||||
#define TASK_COMM_LEN 16
|
||||
|
||||
long
|
||||
gettid (void)
|
||||
{
|
||||
return syscall(__NR_gettid);
|
||||
}
|
||||
|
||||
/* On Linux we can read this task's name from /proc. */
|
||||
int
|
||||
get_self_comm (long tid, char *buf, size_t len)
|
||||
|
@ -2050,6 +2050,7 @@ GLIBC_2.3.4 setipv4sourcefilter F
|
||||
GLIBC_2.3.4 setsourcefilter F
|
||||
GLIBC_2.3.4 xdr_quad_t F
|
||||
GLIBC_2.3.4 xdr_u_quad_t F
|
||||
GLIBC_2.30 gettid F
|
||||
GLIBC_2.4 __confstr_chk F
|
||||
GLIBC_2.4 __fgets_chk F
|
||||
GLIBC_2.4 __fgets_unlocked_chk F
|
||||
|
@ -2149,3 +2149,4 @@ GLIBC_2.28 thrd_yield F
|
||||
GLIBC_2.29 getcpu F
|
||||
GLIBC_2.29 posix_spawn_file_actions_addchdir_np F
|
||||
GLIBC_2.29 posix_spawn_file_actions_addfchdir_np F
|
||||
GLIBC_2.30 gettid F
|
||||
|
Loading…
Reference in New Issue
Block a user