diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2020-05-14 17:02:38 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2020-07-07 14:10:58 -0300 |
commit | 9deec7c8bab24659e78172dd850f4ca37c57940c (patch) | |
tree | e55e909e60b9995054203a428c394d27862620d5 /sysdeps/generic | |
parent | f26d456b98abf02b3ff92f1a3c0d4473b7ffd85c (diff) | |
download | glibc-9deec7c8bab24659e78172dd850f4ca37c57940c.zip glibc-9deec7c8bab24659e78172dd850f4ca37c57940c.tar.gz glibc-9deec7c8bab24659e78172dd850f4ca37c57940c.tar.bz2 |
string: Remove old TLS usage on strsignal
The per-thread state is refactored two use two strategies:
1. The default one uses a TLS structure, which will be placed in the
static TLS space (using __thread keyword).
2. Linux allocates via struct pthread and access it through THREAD_*
macros.
The default strategy has the disadvantage of increasing libc.so static
TLS consumption and thus decreasing the possible surplus used in
some scenarios (which might be mitigated by BZ#25051 fix).
It is used only on Hurd, where accessing the thread storage in the in
single thread case is not straightforward (afaiu, Hurd developers could
correct me here).
The fallback static allocation used for allocation failure is also
removed: defining its size is problematic without synchronizing with
translated messages (to avoid partial translation) and the resulting
usage is not thread-safe.
Checked on x86-64-linux-gnu, i686-linux-gnu, powerpc64le-linux-gnu,
and s390x-linux-gnu.
Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Diffstat (limited to 'sysdeps/generic')
-rw-r--r-- | sysdeps/generic/Makefile | 1 | ||||
-rw-r--r-- | sysdeps/generic/tls-internal-struct.h | 27 | ||||
-rw-r--r-- | sysdeps/generic/tls-internal.c | 21 | ||||
-rw-r--r-- | sysdeps/generic/tls-internal.h | 39 |
4 files changed, 88 insertions, 0 deletions
diff --git a/sysdeps/generic/Makefile b/sysdeps/generic/Makefile index bd4f942..1240d99 100644 --- a/sysdeps/generic/Makefile +++ b/sysdeps/generic/Makefile @@ -16,6 +16,7 @@ # <https://www.gnu.org/licenses/>. ifeq ($(subdir),string) +sysdep_routines += tls-internal CFLAGS-wordcopy.c += -Wno-uninitialized endif diff --git a/sysdeps/generic/tls-internal-struct.h b/sysdeps/generic/tls-internal-struct.h new file mode 100644 index 0000000..33a9079e --- /dev/null +++ b/sysdeps/generic/tls-internal-struct.h @@ -0,0 +1,27 @@ +/* Per-thread state. Generic version. + Copyright (C) 2020 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 _TLS_INTERNAL_STRUCT_H +#define _TLS_INTERNAL_STRUCT_H 1 + +struct tls_internal_t +{ + char *strsignal_buf; +}; + +#endif diff --git a/sysdeps/generic/tls-internal.c b/sysdeps/generic/tls-internal.c new file mode 100644 index 0000000..14b914e --- /dev/null +++ b/sysdeps/generic/tls-internal.c @@ -0,0 +1,21 @@ +/* Per-thread state. Generic version. + Copyright (C) 2020 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/>. */ + +#include <tls-internal.h> + +__thread struct tls_internal_t __tls_internal; diff --git a/sysdeps/generic/tls-internal.h b/sysdeps/generic/tls-internal.h new file mode 100644 index 0000000..1f6a117 --- /dev/null +++ b/sysdeps/generic/tls-internal.h @@ -0,0 +1,39 @@ +/* Per-thread state. Generic version. + Copyright (C) 2020 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 _TLS_INTERNAL_H +#define _TLS_INTERNAL_H 1 + +#include <stdlib.h> +#include <tls-internal-struct.h> + +extern __thread struct tls_internal_t __tls_internal attribute_hidden; + +static inline struct tls_internal_t * +__glibc_tls_internal (void) +{ + return &__tls_internal; +} + +static inline void +__glibc_tls_internal_free (void) +{ + free (__tls_internal.strsignal_buf); +} + +#endif |