diff options
author | Florian Weimer <fweimer@redhat.com> | 2021-07-12 18:43:32 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2021-07-12 18:43:32 +0200 |
commit | aaacde11f2e814814fdd19dfb683e76f1dede4d5 (patch) | |
tree | 6521bf547f60de04b02c84e542e87daccb4636e9 | |
parent | 8235f9311bddbe4cf8ff1fa8f72f41aa77e27e00 (diff) | |
download | glibc-aaacde11f2e814814fdd19dfb683e76f1dede4d5.zip glibc-aaacde11f2e814814fdd19dfb683e76f1dede4d5.tar.gz glibc-aaacde11f2e814814fdd19dfb683e76f1dede4d5.tar.bz2 |
Reduce <limits.h> pollution due to dynamic PTHREAD_STACK_MIN
<limits.h> used to be a header file with no declarations.
GCC's libgomp includes it in a #pragma GCC visibility hidden block.
Including <unistd.h> from <limits.h> (indirectly) declares everything
in <unistd.h> with hidden visibility, resulting in linker failures.
This commit avoids C declarations in assembler mode and only declares
__sysconf in <limits.h> (and not the entire contents of <unistd.h>).
The __sysconf symbol is already part of the ABI. PTHREAD_STACK_MIN
is no longer defined for __USE_DYNAMIC_STACK_SIZE && __ASSEMBLER__
because there is no possible definition.
Additionally, PTHREAD_STACK_MIN is now defined by <pthread.h> for
__USE_MISC because this is what developers expect based on the macro
name. It also helps to avoid libgomp linker failures in GCC because
libgomp includes <pthread.h> before its visibility hacks.
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
-rw-r--r-- | include/bits/local_lim.h | 7 | ||||
-rw-r--r-- | nptl/tst-minstack-exit.c | 3 | ||||
-rw-r--r-- | sysdeps/nptl/pthread.h | 4 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/Makefile | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/bits/local_lim.h | 10 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/bits/pthread_stack_min-dynamic.h | 31 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/include/bits/pthread_stack_min-dynamic.h | 7 |
7 files changed, 47 insertions, 17 deletions
diff --git a/include/bits/local_lim.h b/include/bits/local_lim.h deleted file mode 100644 index 46d82dc..0000000 --- a/include/bits/local_lim.h +++ /dev/null @@ -1,7 +0,0 @@ -/* Don't define PTHREAD_STACK_MIN to sysconf (_SC_THREAD_STACK_MIN) for - glibc build. */ -#if !defined _ISOMAC -# undef __USE_DYNAMIC_STACK_SIZE -#endif - -#include_next <bits/local_lim.h> diff --git a/nptl/tst-minstack-exit.c b/nptl/tst-minstack-exit.c index 4e7dc3e..e577924 100644 --- a/nptl/tst-minstack-exit.c +++ b/nptl/tst-minstack-exit.c @@ -24,6 +24,9 @@ #include <support/check.h> #include <support/xthread.h> +_Static_assert (__SC_THREAD_STACK_MIN_VALUE == _SC_THREAD_STACK_MIN, + "__SC_THREAD_STACK_MIN_VALUE is correct"); + static void * threadfunc (void *closure) { diff --git a/sysdeps/nptl/pthread.h b/sysdeps/nptl/pthread.h index 52e2ead..f1b7f2b 100644 --- a/sysdeps/nptl/pthread.h +++ b/sysdeps/nptl/pthread.h @@ -29,7 +29,9 @@ #include <bits/types/struct_timespec.h> #include <bits/types/__sigset_t.h> #include <bits/types/struct___jmp_buf_tag.h> - +#ifdef __USE_MISC +# include <bits/pthread_stack_min-dynamic.h> +#endif /* Detach state. */ enum diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index 7d43dc9..8257e5b 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -109,7 +109,7 @@ sysdep_headers += sys/mount.h sys/acct.h \ bits/types/struct_semid64_ds_helper.h \ bits/types/struct_shmid64_ds.h \ bits/types/struct_shmid64_ds_helper.h \ - bits/pthread_stack_min.h + bits/pthread_stack_min.h bits/pthread_stack_min-dynamic.h tests += tst-clone tst-clone2 tst-clone3 tst-fanotify tst-personality \ tst-quota tst-sync_file_range tst-sysconf-iov_max tst-ttyname \ diff --git a/sysdeps/unix/sysv/linux/bits/local_lim.h b/sysdeps/unix/sysv/linux/bits/local_lim.h index 0b1c7f4..b8f8923 100644 --- a/sysdeps/unix/sysv/linux/bits/local_lim.h +++ b/sysdeps/unix/sysv/linux/bits/local_lim.h @@ -77,14 +77,8 @@ priority level. */ #define AIO_PRIO_DELTA_MAX 20 -/* Minimum size for a thread. We are free to choose a reasonable value. */ -#undef PTHREAD_STACK_MIN -#if defined __USE_DYNAMIC_STACK_SIZE && __USE_DYNAMIC_STACK_SIZE -# include <unistd.h> -# define PTHREAD_STACK_MIN sysconf (_SC_THREAD_STACK_MIN) -#else -# include <bits/pthread_stack_min.h> -#endif +/* Arrange for the definition of PTHREAD_STACK_MIN. */ +#include <bits/pthread_stack_min-dynamic.h> /* Maximum number of timer expiration overruns. */ #define DELAYTIMER_MAX 2147483647 diff --git a/sysdeps/unix/sysv/linux/bits/pthread_stack_min-dynamic.h b/sysdeps/unix/sysv/linux/bits/pthread_stack_min-dynamic.h new file mode 100644 index 0000000..5f5fc5f --- /dev/null +++ b/sysdeps/unix/sysv/linux/bits/pthread_stack_min-dynamic.h @@ -0,0 +1,31 @@ +/* Definition of PTHREAD_STACK_MIN, possibly dynamic. + Copyright (C) 2021 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 + <https://www.gnu.org/licenses/>. */ + +#ifndef PTHREAD_STACK_MIN +# if defined __USE_DYNAMIC_STACK_SIZE && __USE_DYNAMIC_STACK_SIZE +# ifndef __ASSEMBLER__ +# define __SC_THREAD_STACK_MIN_VALUE 75 +__BEGIN_DECLS +extern long int __sysconf (int __name) __THROW; +__END_DECLS +# define PTHREAD_STACK_MIN __sysconf (__SC_THREAD_STACK_MIN_VALUE) +# endif +# else +# include <bits/pthread_stack_min.h> +# endif +#endif diff --git a/sysdeps/unix/sysv/linux/include/bits/pthread_stack_min-dynamic.h b/sysdeps/unix/sysv/linux/include/bits/pthread_stack_min-dynamic.h new file mode 100644 index 0000000..d66f584 --- /dev/null +++ b/sysdeps/unix/sysv/linux/include/bits/pthread_stack_min-dynamic.h @@ -0,0 +1,7 @@ +/* Don't define PTHREAD_STACK_MIN to __sysconf (_SC_THREAD_STACK_MIN) + for glibc build. */ +#ifdef _ISOMAC +# include <sysdeps/unix/sysv/linux/bits/pthread_stack_min-dynamic.h> +#else +# include <bits/pthread_stack_min.h> +#endif |