Message ID | 87sgx8bqv2.fsf@oldenburg2.str.redhat.com |
---|---|
State | New |
Headers | show |
Series | Linux: Add gettid system call wrapper [BZ #6399] | expand |
On 1/31/19 1:53 PM, Florian Weimer wrote: > This repost changes the symbol version to GLIBC_2.30 and updates the > C-SKY ABI list as well. > > I would welcome a couple of acks that this indeed the direction in which > we want to move. I'm going to review this again, with an eye towards establishing consensus. Firstly, there has been a long-standing complaint that we should not expose any details that imply a threading model in which the userspace thread is expected to stay on the same kernel thread. This is not a valid complaint today. We set all kinds of parameters on the thread via the tid and the syscalls support that, and so the userspace thread will always be tied to that tid until it exits. This kind of model is not going away. Secondly, my complaint has been that any change adding gettid should have documentation updates. You have gone through the manual and clarified all of the APIs for which this is required, and I appreciate that. This meeds my criteria for inclusion. Since this is being added only for the Linux API, and not the GNU API, I see no problem with this since it doesn't need to be implemented by the other operating systems that glibc supports, in this case Hurd (or kFreeBSD, the other OS port I know about). We know that NaCl is no longer supported, so that doesn't restrict us in any way either. I have reviewed all of the comments in bug 6399, and as always it surprises me to see the speed with which we move, this was filed by Michael in 2008. Florian I appreciate your contributions to such long standing issues as this. The most salient point around 2015 is made by Nicholas Miell in which he points out that all pid_t/tid APIs are inherently flawed because of the reuse race conditions, but this does not materially impact exposing gettid(). However it does raise the interesting point, that if we accept tid reuse why not accept the patch for pthread_thread_number_np()? https://sourceware.org/ml/libc-alpha/2018-03/msg00030.html I'm digressing here a bit, but wanted to draw an analog between the two functions. The bigger problem is that gettid() is Linux-specific while pthread_thread_number_np() is a GNU API. So there is more stringent requirements to get it right. Perhaps we should just be looking at a fd-based API to extend things. Reviewing the rest of the comments up to 2018 does not show any further sustained objections against the inclusion of the patches. Therefore I believe we have a set of patches here which can be applied to master for release in 2.30. I looked for libc-alpha discussions on the inclusion of gettid(), but didn't find any that blocked consensus. The following documents were useful in my own review: "Glibc and the kernel user-space API" (2013) https://lwn.net/Articles/534682/ "RFC: POSIX timers and threads in a realtime context" (2015) https://sourceware.org/ml/libc-alpha/2015-10/msg00068.html - Wherein it's clear gettid would help. "Principles for Syscall Wrappers" (2015) https://lwn.net/Articles/711058/ "C library system-call wrappers, or the lack thereof" https://news.ycombinator.com/item?id=18439100 "Re: Official Linux system wrapper library?" https://lkml.org/lkml/2018/11/14/810 "Re: support for calling Linux syscalls directly" https://sourceware.org/ml/libc-alpha/2013-02/msg00030.html - gettid on the "Strong candidates" list. OK for master if you fix the copyright years to 2019. Reviewed-by: Carlos O'Donell <carlos@redhat.com> > --- > 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. > > 2019-01-31 Florian Weimer <fweimer@redhat.com> > > [BZ #6399] OK. What a wonderfully low bug number to close :-) > Linux: Add gettid system call wrapper. OK. > * 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. OK. > > diff --git a/NEWS b/NEWS > index 38ffd10c09..bdd1eaccd0 100644 > --- a/NEWS > +++ b/NEWS > @@ -9,7 +9,7 @@ Version 2.30 > > Major new features: > > - [Add new features here] > +* On Linux, the gettid function has been added. OK. > > Deprecated and removed features, and other changes affecting compatibility: > > diff --git a/manual/process.texi b/manual/process.texi > index 652b0001b5..5728bde2cb 100644 > --- a/manual/process.texi > +++ b/manual/process.texi > @@ -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. OK. > + > +This function is specific to Linux. > +@end deftypefun > + > @node Creating a Process > @section Creating a Process > > diff --git a/posix/Makefile b/posix/Makefile > index cfd914ff21..9307ecb3b0 100644 > --- a/posix/Makefile > +++ b/posix/Makefile > @@ -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 OK. > > routines := \ > uname \ > diff --git a/posix/bits/unistd_ext.h b/posix/bits/unistd_ext.h > new file mode 100644 > index 0000000000..8019cfa758 > --- /dev/null > +++ b/posix/bits/unistd_ext.h > @@ -0,0 +1,21 @@ > +/* System-specific extensions of <unistd.h>, generic version. OK. > + Copyright (C) 2018 Free Software Foundation, Inc. Wrong year. > + 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 OK. > diff --git a/posix/unistd.h b/posix/unistd.h > index f67452122b..55a989f7bb 100644 > --- a/posix/unistd.h > +++ b/posix/unistd.h > @@ -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> OK. > + > __END_DECLS > > #endif /* unistd.h */ > diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile > index 5f8c2c7c7d..52ac6ad484 100644 > --- a/sysdeps/unix/sysv/linux/Makefile > +++ b/sysdeps/unix/sysv/linux/Makefile > @@ -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 OK. > 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) OK. > + > endif # $(subdir) == misc > > ifeq ($(subdir),time) > diff --git a/sysdeps/unix/sysv/linux/Versions b/sysdeps/unix/sysv/linux/Versions > index f1e12d9c69..5166ccff25 100644 > --- a/sysdeps/unix/sysv/linux/Versions > +++ b/sysdeps/unix/sysv/linux/Versions > @@ -174,6 +174,9 @@ libc { > GLIBC_2.29 { > getcpu; > } > + GLIBC_2.30 { > + gettid; > + } OK. > GLIBC_PRIVATE { > # functions used in other libraries > __syscall_rt_sigqueueinfo; > diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist > index 9c330f325e..f3b44d723f 100644 > --- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist > @@ -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 OK. > diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist > index f630fa4c6f..fe0de20b2b 100644 > --- a/sysdeps/unix/sysv/linux/alpha/libc.abilist > +++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist > @@ -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 > diff --git a/sysdeps/unix/sysv/linux/arm/libc.abilist b/sysdeps/unix/sysv/linux/arm/libc.abilist > index b96f45590f..f451fefac9 100644 > --- a/sysdeps/unix/sysv/linux/arm/libc.abilist > +++ b/sysdeps/unix/sysv/linux/arm/libc.abilist > @@ -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 > diff --git a/sysdeps/unix/sysv/linux/bits/unistd_ext.h b/sysdeps/unix/sysv/linux/bits/unistd_ext.h > new file mode 100644 > index 0000000000..8d7a8a07d0 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/bits/unistd_ext.h > @@ -0,0 +1,36 @@ > +/* System-specific extensions of <unistd.h>, Linux version. > + Copyright (C) 2018 Free Software Foundation, Inc. Wrong year. > + 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; OK. I'll note that we do have POSIX rules for switching between underlying fd/stream so I wonder if we can't some day define such rules for threads or if they are even required. > + > +#endif > diff --git a/sysdeps/unix/sysv/linux/csky/libc.abilist b/sysdeps/unix/sysv/linux/csky/libc.abilist > index 019044c3cd..018d02b414 100644 > --- a/sysdeps/unix/sysv/linux/csky/libc.abilist > +++ b/sysdeps/unix/sysv/linux/csky/libc.abilist > @@ -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 > diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist > index 088a8ee369..fc3c5d5c27 100644 > --- a/sysdeps/unix/sysv/linux/hppa/libc.abilist > +++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist > @@ -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 > diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist > index f7ff2c57b9..f2b04dbbff 100644 > --- a/sysdeps/unix/sysv/linux/i386/libc.abilist > +++ b/sysdeps/unix/sysv/linux/i386/libc.abilist > @@ -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 > diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist > index becd8b1033..10ecf2e47c 100644 > --- a/sysdeps/unix/sysv/linux/ia64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist > @@ -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 > diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist > index 74e42a5209..814e81b9d2 100644 > --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist > +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist > @@ -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 > diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist > index 4af5a74e8a..68e80372e7 100644 > --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist > +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist > @@ -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 > diff --git a/sysdeps/unix/sysv/linux/microblaze/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/libc.abilist > index ccef673fd2..31178e4f54 100644 > --- a/sysdeps/unix/sysv/linux/microblaze/libc.abilist > +++ b/sysdeps/unix/sysv/linux/microblaze/libc.abilist > @@ -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 > diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist > index 1054bb599e..7074573638 100644 > --- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist > +++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist > @@ -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 > diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist > index 4f5b5ffebf..154f9c77fc 100644 > --- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist > +++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist > @@ -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 > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist > index 943aee58d4..97b8f42d5c 100644 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist > +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist > @@ -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 > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist > index 17a5d17ef9..5b3e85de93 100644 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist > @@ -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 > diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist > index 4d62a540fd..04a130a81c 100644 > --- a/sysdeps/unix/sysv/linux/nios2/libc.abilist > +++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist > @@ -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 > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist > index ecc2d6fa13..d99a835544 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist > @@ -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 > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist > index f5830f9c33..826772777a 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist > @@ -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 > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist > index 633d8f4792..5aa038971b 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist > @@ -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 > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist > index 2c712636ef..c630d0c37d 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist > @@ -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 > diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist > index 195bc8b2cf..da123d3867 100644 > --- a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist > @@ -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 > diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist > index 334def033c..361240400c 100644 > --- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist > +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist > @@ -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 > diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist > index 536f4c4ced..f44f178a08 100644 > --- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist > @@ -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 > diff --git a/sysdeps/unix/sysv/linux/sh/libc.abilist b/sysdeps/unix/sysv/linux/sh/libc.abilist > index 30ae3b6ebb..24a8f934cb 100644 > --- a/sysdeps/unix/sysv/linux/sh/libc.abilist > +++ b/sysdeps/unix/sysv/linux/sh/libc.abilist > @@ -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 > diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist > index 68b107d080..37957959e2 100644 > --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist > +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist > @@ -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 > diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist > index e5b6a4da50..0992349b06 100644 > --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist > @@ -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 > diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list > index e24ea29e35..544ab5d54a 100644 > --- a/sysdeps/unix/sysv/linux/syscalls.list > +++ b/sysdeps/unix/sysv/linux/syscalls.list > @@ -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 > diff --git a/sysdeps/unix/sysv/linux/tst-gettid-kill.c b/sysdeps/unix/sysv/linux/tst-gettid-kill.c > new file mode 100644 > index 0000000000..5005380748 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/tst-gettid-kill.c > @@ -0,0 +1,129 @@ > +/* Verify the interaction of kill and thread groups. OK. > + Copyright (C) 2018 Free Software Foundation, Inc. Wrong year. > + 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; OK. > +} > + > +#include <support/test-driver.c> > diff --git a/sysdeps/unix/sysv/linux/tst-gettid.c b/sysdeps/unix/sysv/linux/tst-gettid.c > new file mode 100644 > index 0000000000..78bbaee4f3 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/tst-gettid.c > @@ -0,0 +1,79 @@ > +/* Smoke test for the gettid system call. OK. > + Copyright (C) 2018 Free Software Foundation, Inc. Wrong year. > + 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> OK. > diff --git a/sysdeps/unix/sysv/linux/tst-setgetname.c b/sysdeps/unix/sysv/linux/tst-setgetname.c > index 23184aae20..c373e61492 100644 > --- a/sysdeps/unix/sysv/linux/tst-setgetname.c > +++ b/sysdeps/unix/sysv/linux/tst-setgetname.c > @@ -43,12 +43,6 @@ > terminator. */ > #define TASK_COMM_LEN 16 > > -long > -gettid (void) > -{ > - return syscall(__NR_gettid); > -} OK. > - > /* On Linux we can read this task's name from /proc. */ > int > get_self_comm (long tid, char *buf, size_t len) > diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist > index 86dfb0c94d..af004fcff6 100644 > --- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist > @@ -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 > diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist > index dd688263aa..84015f0a57 100644 > --- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist > +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist > @@ -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 >
* Carlos O'Donell:
> OK for master if you fix the copyright years to 2019.
Thanks, I've made this change locally.
I will push this some time next week, unless there are objections.
Florian
On 02/02/2019 12:18, Florian Weimer wrote: > * Carlos O'Donell: > >> OK for master if you fix the copyright years to 2019. > > Thanks, I've made this change locally. > > I will push this some time next week, unless there are objections. > > Florian > Hurd build is failing with: In file included from ../include/unistd.h:2, from mach_init.c:20: ../posix/unistd.h:1170:10: fatal error: bits/unistd_ext.h: No such file or directory #include <bits/unistd_ext.h> when building mach_init.c. It seems it adds sysdeps/posix in sysdeps search, but not posix itself: -I../include -I<builddir>/i686-gnu/mach -I<builddir>i686-gnu -I../sysdeps/mach/hurd/i386 -I../sysdeps/mach/hurd/x86 -I../sysdeps/mach/hurd/i386/htl -I../sysdeps/mach/hurd/htl -I../sysdeps/hurd/htl -I../sysdeps/mach/htl -I../sysdeps/htl -I../sysdeps/pthread -I../sysdeps/i386/htl -I../sysdeps/mach/hurd -I../sysdeps/gnu -I../sysdeps/unix/bsd -I../sysdeps/unix/inet -I../sysdeps/mach/i386 -I../sysdeps/mach/include -I../sysdeps/mach -I../sysdeps/i386/i686/fpu -I../sysdeps/i386/i686 -I../sysdeps/i386/fpu -I../sysdeps/x86/fpu/include -I../sysdeps/x86/fpu -I../sysdeps/i386 -I../sysdeps/x86 -I../sysdeps/wordsize-32 -I../sysdeps/ieee754/float128 -I../sysdeps/ieee754/ldbl-96/include -I../sysdeps/ieee754/ldbl-96 -I../sysdeps/ieee754/dbl-64 -I../sysdeps/ieee754/flt-32 -I../sysdeps/hurd/include -I../sysdeps/hurd -I../sysdeps/unix -I../sysdeps/posix -I../sysdeps/ieee754 -I../sysdeps/generic -I../hurd
* Adhemerval Zanella: > On 02/02/2019 12:18, Florian Weimer wrote: >> * Carlos O'Donell: >> >>> OK for master if you fix the copyright years to 2019. >> >> Thanks, I've made this change locally. >> >> I will push this some time next week, unless there are objections. >> >> Florian >> > > Hurd build is failing with: > > In file included from ../include/unistd.h:2, > from mach_init.c:20: > ../posix/unistd.h:1170:10: fatal error: bits/unistd_ext.h: No such file or directory > #include <bits/unistd_ext.h> > > when building mach_init.c. It seems it adds sysdeps/posix in sysdeps > search, but not posix itself: It's a missing wrapper header under include. I will fix it. Thanks, Florian
* Florian Weimer: > * Adhemerval Zanella: > >> On 02/02/2019 12:18, Florian Weimer wrote: >>> * Carlos O'Donell: >>> >>>> OK for master if you fix the copyright years to 2019. >>> >>> Thanks, I've made this change locally. >>> >>> I will push this some time next week, unless there are objections. >>> >>> Florian >>> >> >> Hurd build is failing with: >> >> In file included from ../include/unistd.h:2, >> from mach_init.c:20: >> ../posix/unistd.h:1170:10: fatal error: bits/unistd_ext.h: No such file or directory >> #include <bits/unistd_ext.h> >> >> when building mach_init.c. It seems it adds sysdeps/posix in sysdeps >> search, but not posix itself: > > It's a missing wrapper header under include. I will fix it. This should be the fix: posix: Fix missing wrapper header for <bits/unistd_ext.h> 2019-02-08 Florian Weimer <fweimer@redhat.com> * include/bits/unistd_ext.h: New file. diff --git a/include/bits/unistd_ext.h b/include/bits/unistd_ext.h new file mode 100644 index 0000000000..24e8d09ba8 --- /dev/null +++ b/include/bits/unistd_ext.h @@ -0,0 +1 @@ +#include <posix/bits/unistd_ext.h>
On 2/8/19 9:55 AM, Florian Weimer wrote: > * Florian Weimer: > >> * Adhemerval Zanella: >> >>> On 02/02/2019 12:18, Florian Weimer wrote: >>>> * Carlos O'Donell: >>>> >>>>> OK for master if you fix the copyright years to 2019. >>>> >>>> Thanks, I've made this change locally. >>>> >>>> I will push this some time next week, unless there are objections. >>>> >>>> Florian >>>> >>> >>> Hurd build is failing with: >>> >>> In file included from ../include/unistd.h:2, >>> from mach_init.c:20: >>> ../posix/unistd.h:1170:10: fatal error: bits/unistd_ext.h: No such file or directory >>> #include <bits/unistd_ext.h> >>> >>> when building mach_init.c. It seems it adds sysdeps/posix in sysdeps >>> search, but not posix itself: >> >> It's a missing wrapper header under include. I will fix it. > > This should be the fix: > > posix: Fix missing wrapper header for <bits/unistd_ext.h> > > 2019-02-08 Florian Weimer <fweimer@redhat.com> > > * include/bits/unistd_ext.h: New file. > > diff --git a/include/bits/unistd_ext.h b/include/bits/unistd_ext.h > new file mode 100644 > index 0000000000..24e8d09ba8 > --- /dev/null > +++ b/include/bits/unistd_ext.h > @@ -0,0 +1 @@ > +#include <posix/bits/unistd_ext.h> My bmg of i686-gnu passes with this patch. OK for master. Reviewed-by: Carlos O'Donell <carlos@redhat.com>
* Florian Weimer: > This should be the fix: > > posix: Fix missing wrapper header for <bits/unistd_ext.h> > > 2019-02-08 Florian Weimer <fweimer@redhat.com> > > * include/bits/unistd_ext.h: New file. > > diff --git a/include/bits/unistd_ext.h b/include/bits/unistd_ext.h > new file mode 100644 > index 0000000000..24e8d09ba8 > --- /dev/null > +++ b/include/bits/unistd_ext.h > @@ -0,0 +1 @@ > +#include <posix/bits/unistd_ext.h> Well, it broke the Linux build. It turns out that installed sysdeps headers must only live under sysdeps. I'm testing the fix below. This stuff is way too difficult. Florian Provide <bits/unistd_ext.h> as a sysdeps header exclusively Non-sysdeps headers cannot be overriden by sysdeps headers across the entire build, so it is necessary to turn such extension headers into sysdeps headers themselves. The approach here follows the existing <bits/shm.h> header (although it uses sysdeps/gnu instead of sysdeps/generic). Fixes commit 1d0fc213824eaa2a8f8c4385daaa698ee8fb7c92 ("Linux: Add gettid system call wrapper [BZ #6399]") and commit 8f89ab216f205c2ffd90d1fc8454efdfc0b01dee ("posix: Fix missing wrapper header for <bits/unistd_ext.h>"). 2019-02-08 Florian Weimer <fweimer@redhat.com> * include/bits/unistd_ext.h: Remove file. * posix/bits/unistd_ext.h: Move to ... * sysdeps/generic/bits/unistd_ext.h: ... here. diff --git a/include/bits/unistd_ext.h b/include/bits/unistd_ext.h deleted file mode 100644 index 24e8d09ba8..0000000000 --- a/include/bits/unistd_ext.h +++ /dev/null @@ -1 +0,0 @@ -#include <posix/bits/unistd_ext.h> diff --git a/posix/bits/unistd_ext.h b/sysdeps/generic/bits/unistd_ext.h similarity index 100% rename from posix/bits/unistd_ext.h rename to sysdeps/generic/bits/unistd_ext.h
* Florian Weimer: > * Florian Weimer: > >> This should be the fix: >> >> posix: Fix missing wrapper header for <bits/unistd_ext.h> >> >> 2019-02-08 Florian Weimer <fweimer@redhat.com> >> >> * include/bits/unistd_ext.h: New file. >> >> diff --git a/include/bits/unistd_ext.h b/include/bits/unistd_ext.h >> new file mode 100644 >> index 0000000000..24e8d09ba8 >> --- /dev/null >> +++ b/include/bits/unistd_ext.h >> @@ -0,0 +1 @@ >> +#include <posix/bits/unistd_ext.h> > > Well, it broke the Linux build. It turns out that installed sysdeps > headers must only live under sysdeps. I'm testing the fix below. > > This stuff is way too difficult. > > Florian > > Provide <bits/unistd_ext.h> as a sysdeps header exclusively > > Non-sysdeps headers cannot be overriden by sysdeps headers across the > entire build, so it is necessary to turn such extension headers into > sysdeps headers themselves. The approach here follows the existing > <bits/shm.h> header (although it uses sysdeps/gnu instead of > sysdeps/generic). > > Fixes commit 1d0fc213824eaa2a8f8c4385daaa698ee8fb7c92 ("Linux: Add > gettid system call wrapper [BZ #6399]") and commit > 8f89ab216f205c2ffd90d1fc8454efdfc0b01dee ("posix: Fix missing wrapper > header for <bits/unistd_ext.h>"). > > 2019-02-08 Florian Weimer <fweimer@redhat.com> > > * include/bits/unistd_ext.h: Remove file. > * posix/bits/unistd_ext.h: Move to ... > * sysdeps/generic/bits/unistd_ext.h: ... here. Testing suggests that this does the right thing. The correct header is installed on Hurd and Linux. Thanks, Florian
diff --git a/NEWS b/NEWS index 38ffd10c09..bdd1eaccd0 100644 --- a/NEWS +++ b/NEWS @@ -9,7 +9,7 @@ Version 2.30 Major new features: - [Add new features here] +* On Linux, the gettid function has been added. Deprecated and removed features, and other changes affecting compatibility: diff --git a/manual/process.texi b/manual/process.texi index 652b0001b5..5728bde2cb 100644 --- a/manual/process.texi +++ b/manual/process.texi @@ -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 diff --git a/posix/Makefile b/posix/Makefile index cfd914ff21..9307ecb3b0 100644 --- a/posix/Makefile +++ b/posix/Makefile @@ -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 \ diff --git a/posix/bits/unistd_ext.h b/posix/bits/unistd_ext.h new file mode 100644 index 0000000000..8019cfa758 --- /dev/null +++ b/posix/bits/unistd_ext.h @@ -0,0 +1,21 @@ +/* System-specific extensions of <unistd.h>, generic version. + Copyright (C) 2018 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 diff --git a/posix/unistd.h b/posix/unistd.h index f67452122b..55a989f7bb 100644 --- a/posix/unistd.h +++ b/posix/unistd.h @@ -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 */ diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index 5f8c2c7c7d..52ac6ad484 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -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) diff --git a/sysdeps/unix/sysv/linux/Versions b/sysdeps/unix/sysv/linux/Versions index f1e12d9c69..5166ccff25 100644 --- a/sysdeps/unix/sysv/linux/Versions +++ b/sysdeps/unix/sysv/linux/Versions @@ -174,6 +174,9 @@ libc { GLIBC_2.29 { getcpu; } + GLIBC_2.30 { + gettid; + } GLIBC_PRIVATE { # functions used in other libraries __syscall_rt_sigqueueinfo; diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist index 9c330f325e..f3b44d723f 100644 --- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist +++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist index f630fa4c6f..fe0de20b2b 100644 --- a/sysdeps/unix/sysv/linux/alpha/libc.abilist +++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/arm/libc.abilist b/sysdeps/unix/sysv/linux/arm/libc.abilist index b96f45590f..f451fefac9 100644 --- a/sysdeps/unix/sysv/linux/arm/libc.abilist +++ b/sysdeps/unix/sysv/linux/arm/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/bits/unistd_ext.h b/sysdeps/unix/sysv/linux/bits/unistd_ext.h new file mode 100644 index 0000000000..8d7a8a07d0 --- /dev/null +++ b/sysdeps/unix/sysv/linux/bits/unistd_ext.h @@ -0,0 +1,36 @@ +/* System-specific extensions of <unistd.h>, Linux version. + Copyright (C) 2018 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 diff --git a/sysdeps/unix/sysv/linux/csky/libc.abilist b/sysdeps/unix/sysv/linux/csky/libc.abilist index 019044c3cd..018d02b414 100644 --- a/sysdeps/unix/sysv/linux/csky/libc.abilist +++ b/sysdeps/unix/sysv/linux/csky/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist index 088a8ee369..fc3c5d5c27 100644 --- a/sysdeps/unix/sysv/linux/hppa/libc.abilist +++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist index f7ff2c57b9..f2b04dbbff 100644 --- a/sysdeps/unix/sysv/linux/i386/libc.abilist +++ b/sysdeps/unix/sysv/linux/i386/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist index becd8b1033..10ecf2e47c 100644 --- a/sysdeps/unix/sysv/linux/ia64/libc.abilist +++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist index 74e42a5209..814e81b9d2 100644 --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist index 4af5a74e8a..68e80372e7 100644 --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/microblaze/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/libc.abilist index ccef673fd2..31178e4f54 100644 --- a/sysdeps/unix/sysv/linux/microblaze/libc.abilist +++ b/sysdeps/unix/sysv/linux/microblaze/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist index 1054bb599e..7074573638 100644 --- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist index 4f5b5ffebf..154f9c77fc 100644 --- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist index 943aee58d4..97b8f42d5c 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist index 17a5d17ef9..5b3e85de93 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist index 4d62a540fd..04a130a81c 100644 --- a/sysdeps/unix/sysv/linux/nios2/libc.abilist +++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist index ecc2d6fa13..d99a835544 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist index f5830f9c33..826772777a 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist index 633d8f4792..5aa038971b 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist index 2c712636ef..c630d0c37d 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist index 195bc8b2cf..da123d3867 100644 --- a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist +++ b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist index 334def033c..361240400c 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist index 536f4c4ced..f44f178a08 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/sh/libc.abilist b/sysdeps/unix/sysv/linux/sh/libc.abilist index 30ae3b6ebb..24a8f934cb 100644 --- a/sysdeps/unix/sysv/linux/sh/libc.abilist +++ b/sysdeps/unix/sysv/linux/sh/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist index 68b107d080..37957959e2 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist index e5b6a4da50..0992349b06 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list index e24ea29e35..544ab5d54a 100644 --- a/sysdeps/unix/sysv/linux/syscalls.list +++ b/sysdeps/unix/sysv/linux/syscalls.list @@ -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 diff --git a/sysdeps/unix/sysv/linux/tst-gettid-kill.c b/sysdeps/unix/sysv/linux/tst-gettid-kill.c new file mode 100644 index 0000000000..5005380748 --- /dev/null +++ b/sysdeps/unix/sysv/linux/tst-gettid-kill.c @@ -0,0 +1,129 @@ +/* Verify the interaction of kill and thread groups. + Copyright (C) 2018 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> diff --git a/sysdeps/unix/sysv/linux/tst-gettid.c b/sysdeps/unix/sysv/linux/tst-gettid.c new file mode 100644 index 0000000000..78bbaee4f3 --- /dev/null +++ b/sysdeps/unix/sysv/linux/tst-gettid.c @@ -0,0 +1,79 @@ +/* Smoke test for the gettid system call. + Copyright (C) 2018 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> diff --git a/sysdeps/unix/sysv/linux/tst-setgetname.c b/sysdeps/unix/sysv/linux/tst-setgetname.c index 23184aae20..c373e61492 100644 --- a/sysdeps/unix/sysv/linux/tst-setgetname.c +++ b/sysdeps/unix/sysv/linux/tst-setgetname.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) diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist index 86dfb0c94d..af004fcff6 100644 --- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist @@ -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 diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist index dd688263aa..84015f0a57 100644 --- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist @@ -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