diff --git a/meson.build b/meson.build index 1e49d52718..d27796e85e 100644 --- a/meson.build +++ b/meson.build @@ -712,6 +712,7 @@ foreach header : ['crypt.h', 'linux/memfd.h', 'linux/vm_sockets.h', 'sys/auxv.h', + 'threads.h', 'valgrind/memcheck.h', 'valgrind/valgrind.h', 'linux/time_types.h', diff --git a/src/basic/capability-util.c b/src/basic/capability-util.c index fa74b5b9c6..df04d461ad 100644 --- a/src/basic/capability-util.c +++ b/src/basic/capability-util.c @@ -13,6 +13,7 @@ #include "log.h" #include "macro.h" #include "missing_prctl.h" +#include "missing_threads.h" #include "parse-util.h" #include "user-util.h" #include "util.h" diff --git a/src/basic/cgroup-util.c b/src/basic/cgroup-util.c index 17c0170b82..0b4731f050 100644 --- a/src/basic/cgroup-util.c +++ b/src/basic/cgroup-util.c @@ -23,6 +23,7 @@ #include "login-util.h" #include "macro.h" #include "missing_magic.h" +#include "missing_threads.h" #include "mkdir.h" #include "parse-util.h" #include "path-util.h" diff --git a/src/basic/log.c b/src/basic/log.c index cd420f0153..f22bbc1bb5 100644 --- a/src/basic/log.c +++ b/src/basic/log.c @@ -23,6 +23,7 @@ #include "log.h" #include "macro.h" #include "missing_syscall.h" +#include "missing_threads.h" #include "parse-util.h" #include "proc-cmdline.h" #include "process-util.h" diff --git a/src/basic/macro.h b/src/basic/macro.h index e6f89608f4..f5d63ce408 100644 --- a/src/basic/macro.h +++ b/src/basic/macro.h @@ -356,20 +356,6 @@ static inline int __coverity_check_and_return__(int condition) { p != (typeof(p)) POINTER_MAX; \ p = *(++_l)) -/* Define C11 thread_local attribute even on older gcc compiler - * version */ -#ifndef thread_local -/* - * Don't break on glibc < 2.16 that doesn't define __STDC_NO_THREADS__ - * see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53769 - */ -#if __STDC_VERSION__ >= 201112L && !(defined(__STDC_NO_THREADS__) || (defined(__GNU_LIBRARY__) && __GLIBC__ == 2 && __GLIBC_MINOR__ < 16)) -#define thread_local _Thread_local -#else -#define thread_local __thread -#endif -#endif - #define DEFINE_TRIVIAL_DESTRUCTOR(name, type, func) \ static inline void name(type *p) { \ func(p); \ diff --git a/src/basic/memory-util.c b/src/basic/memory-util.c index 2983762117..84b5b2d5cb 100644 --- a/src/basic/memory-util.c +++ b/src/basic/memory-util.c @@ -3,6 +3,7 @@ #include #include "memory-util.h" +#include "missing_threads.h" size_t page_size(void) { static thread_local size_t pgsz = 0; diff --git a/src/basic/missing_threads.h b/src/basic/missing_threads.h new file mode 100644 index 0000000000..fb3b72249b --- /dev/null +++ b/src/basic/missing_threads.h @@ -0,0 +1,15 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +#pragma once + +/* If threads.h doesn't exist, then define our own thread_local to match C11's thread_local. */ +#if HAVE_THREADS_H +# include +#elif !(defined(thread_local)) +/* Don't break on glibc < 2.16 that doesn't define __STDC_NO_THREADS__ + * see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53769 */ +# if __STDC_VERSION__ >= 201112L && !(defined(__STDC_NO_THREADS__) || (defined(__GNU_LIBRARY__) && __GLIBC__ == 2 && __GLIBC_MINOR__ < 16)) +# define thread_local _Thread_local +# else +# define thread_local __thread +# endif +#endif diff --git a/src/basic/process-util.c b/src/basic/process-util.c index 8a38f46897..850aac238e 100644 --- a/src/basic/process-util.c +++ b/src/basic/process-util.c @@ -34,6 +34,7 @@ #include "memory-util.h" #include "missing_sched.h" #include "missing_syscall.h" +#include "missing_threads.h" #include "namespace-util.h" #include "path-util.h" #include "process-util.h" diff --git a/src/basic/random-util.c b/src/basic/random-util.c index a9fe25432c..d83e172447 100644 --- a/src/basic/random-util.c +++ b/src/basic/random-util.c @@ -28,6 +28,7 @@ #include "io-util.h" #include "missing_random.h" #include "missing_syscall.h" +#include "missing_threads.h" #include "parse-util.h" #include "random-util.h" #include "siphash24.h" diff --git a/src/basic/signal-util.c b/src/basic/signal-util.c index b61c18b2de..fdbe7f43ac 100644 --- a/src/basic/signal-util.c +++ b/src/basic/signal-util.c @@ -5,6 +5,7 @@ #include "errno-util.h" #include "macro.h" +#include "missing_threads.h" #include "parse-util.h" #include "signal-util.h" #include "stdio-util.h" diff --git a/src/basic/time-util.c b/src/basic/time-util.c index 0ad8de4b9a..16cc9a4934 100644 --- a/src/basic/time-util.c +++ b/src/basic/time-util.c @@ -17,6 +17,7 @@ #include "io-util.h" #include "log.h" #include "macro.h" +#include "missing_threads.h" #include "missing_timerfd.h" #include "parse-util.h" #include "path-util.h" diff --git a/src/basic/virt.c b/src/basic/virt.c index 699815f702..43970bdb54 100644 --- a/src/basic/virt.c +++ b/src/basic/virt.c @@ -16,6 +16,7 @@ #include "fd-util.h" #include "fileio.h" #include "macro.h" +#include "missing_threads.h" #include "process-util.h" #include "stat-util.h" #include "string-table.h" diff --git a/src/libsystemd/sd-bus/sd-bus.c b/src/libsystemd/sd-bus/sd-bus.c index 287d7d4753..fcc2948751 100644 --- a/src/libsystemd/sd-bus/sd-bus.c +++ b/src/libsystemd/sd-bus/sd-bus.c @@ -36,6 +36,7 @@ #include "macro.h" #include "memory-util.h" #include "missing_syscall.h" +#include "missing_threads.h" #include "parse-util.h" #include "path-util.h" #include "process-util.h" diff --git a/src/libsystemd/sd-event/sd-event.c b/src/libsystemd/sd-event/sd-event.c index b15678d0f7..00bf6ac1e5 100644 --- a/src/libsystemd/sd-event/sd-event.c +++ b/src/libsystemd/sd-event/sd-event.c @@ -18,6 +18,7 @@ #include "macro.h" #include "memory-util.h" #include "missing_syscall.h" +#include "missing_threads.h" #include "prioq.h" #include "process-util.h" #include "set.h" diff --git a/src/libsystemd/sd-id128/sd-id128.c b/src/libsystemd/sd-id128/sd-id128.c index 09c3401ca1..4f687fa083 100644 --- a/src/libsystemd/sd-id128/sd-id128.c +++ b/src/libsystemd/sd-id128/sd-id128.c @@ -14,6 +14,7 @@ #include "io-util.h" #include "macro.h" #include "missing_syscall.h" +#include "missing_threads.h" #include "random-util.h" #include "user-util.h" #include "util.h" diff --git a/src/libsystemd/sd-resolve/sd-resolve.c b/src/libsystemd/sd-resolve/sd-resolve.c index fdc09ff20f..a2d5b62c0e 100644 --- a/src/libsystemd/sd-resolve/sd-resolve.c +++ b/src/libsystemd/sd-resolve/sd-resolve.c @@ -22,6 +22,7 @@ #include "list.h" #include "memory-util.h" #include "missing_syscall.h" +#include "missing_threads.h" #include "process-util.h" #include "resolve-private.h" #include "socket-util.h" diff --git a/src/login/logind-inhibit.c b/src/login/logind-inhibit.c index dbb58e4ac3..b20861c04b 100644 --- a/src/login/logind-inhibit.c +++ b/src/login/logind-inhibit.c @@ -17,6 +17,7 @@ #include "io-util.h" #include "logind-dbus.h" #include "logind-inhibit.h" +#include "missing_threads.h" #include "mkdir-label.h" #include "parse-util.h" #include "path-util.h" diff --git a/src/network/networkd-route-util.c b/src/network/networkd-route-util.c index d7a80ed40f..44cdddfab9 100644 --- a/src/network/networkd-route-util.c +++ b/src/network/networkd-route-util.c @@ -3,6 +3,7 @@ #include #include "alloc-util.h" +#include "missing_threads.h" #include "networkd-address.h" #include "networkd-link.h" #include "networkd-manager.h" diff --git a/src/nss-systemd/nss-systemd.c b/src/nss-systemd/nss-systemd.c index e87f1d31b3..fdc334659f 100644 --- a/src/nss-systemd/nss-systemd.c +++ b/src/nss-systemd/nss-systemd.c @@ -9,6 +9,7 @@ #include "fd-util.h" #include "log.h" #include "macro.h" +#include "missing_threads.h" #include "nss-systemd.h" #include "nss-util.h" #include "pthread-util.h" diff --git a/src/shared/cgroup-setup.c b/src/shared/cgroup-setup.c index a1fabc73c1..e797eaee74 100644 --- a/src/shared/cgroup-setup.c +++ b/src/shared/cgroup-setup.c @@ -8,6 +8,7 @@ #include "fd-util.h" #include "fileio.h" #include "fs-util.h" +#include "missing_threads.h" #include "mkdir.h" #include "parse-util.h" #include "path-util.h" diff --git a/src/shared/psi-util.c b/src/shared/psi-util.c index a3b553cb44..af8e278bd0 100644 --- a/src/shared/psi-util.c +++ b/src/shared/psi-util.c @@ -8,6 +8,7 @@ #include "extract-word.h" #include "fd-util.h" #include "fileio.h" +#include "missing_threads.h" #include "parse-util.h" #include "psi-util.h" #include "string-util.h" diff --git a/src/shared/uid-alloc-range.c b/src/shared/uid-alloc-range.c index dcecdbe343..1953119422 100644 --- a/src/shared/uid-alloc-range.c +++ b/src/shared/uid-alloc-range.c @@ -3,6 +3,7 @@ #include "chase-symlinks.h" #include "fd-util.h" #include "fileio.h" +#include "missing_threads.h" #include "string-util.h" #include "uid-alloc-range.h" #include "user-util.h"