diff --git a/configure.ac b/configure.ac index b329b4ea7..76f2e1026 100644 --- a/configure.ac +++ b/configure.ac @@ -629,7 +629,7 @@ AC_CHECK_DECLS([PR_SET_NO_NEW_PRIVS], [], [], [#include ]) AC_CHECK_DECLS([PR_GET_NO_NEW_PRIVS], [], [], [#include ]) # Check for some headers -AC_CHECK_HEADERS([pty.h sys/memfd.h sys/personality.h sys/resource.h sys/signalfd.h sys/timerfd.h utmpx.h]) +AC_CHECK_HEADERS([pty.h sys/memfd.h sys/personality.h sys/resource.h sys/signalfd.h sys/timerfd.h utmpx.h threads.h]) AC_CHECK_HEADER([ifaddrs.h], AM_CONDITIONAL(HAVE_IFADDRS_H, true) diff --git a/src/lxc/compiler.h b/src/lxc/compiler.h index 5d45955d0..353677a5e 100644 --- a/src/lxc/compiler.h +++ b/src/lxc/compiler.h @@ -12,14 +12,23 @@ #include "config.h" -#ifndef thread_local -#if __STDC_VERSION__ >= 201112L && \ - !(defined(__STDC_NO_THREADS__) || \ - (defined(__GNU_LIBRARY__) && __GLIBC__ == 2 && __GLIBC_MINOR__ < 16)) -#define thread_local _Thread_local +#if defined(HAVE_THREADS_H) + #include + #define THREAD_LOCAL_STORAGE_SUPPORTED +#elif defined(thread_local) + #define THREAD_LOCAL_STORAGE_SUPPORTED #else -#define thread_local __thread -#endif + #if __STDC_VERSION__ >= 201112L && \ + !(defined(__STDC_NO_THREADS__) || \ + (defined(__GNU_LIBRARY__) && __GLIBC__ == 2 && __GLIBC_MINOR__ < 16)) + #define thread_local _Thread_local + + #define THREAD_LOCAL_STORAGE_SUPPORTED + #else + #define thread_local __thread + + #define THREAD_LOCAL_STORAGE_SUPPORTED + #endif #endif #if __GNUC__ >= 7 diff --git a/src/lxc/conf.c b/src/lxc/conf.c index 5c133bbb1..bceb2cebc 100644 --- a/src/lxc/conf.c +++ b/src/lxc/conf.c @@ -36,6 +36,7 @@ #include "af_unix.h" #include "caps.h" #include "cgroups/cgroup.h" +#include "compiler.h" #include "conf.h" #include "config.h" #include "confile.h" @@ -99,11 +100,14 @@ lxc_log_define(conf, lxc); -/* The lxc_conf of the container currently being worked on in an API call. +/* + * The lxc_conf of the container currently being worked on in an API call. * This is used in the error calls. */ -#ifdef HAVE_TLS +#if defined(THREAD_LOCAL_STORAGE_SUPPORTED) thread_local struct lxc_conf *current_config; +#elif defined(ENFORCE_THREAD_SAFETY) +#error ENFORCE_THREAD_SAFETY was set but cannot be guaranteed due to missing TLS #else struct lxc_conf *current_config; #endif diff --git a/src/lxc/conf.h b/src/lxc/conf.h index b93c65276..939e47d75 100644 --- a/src/lxc/conf.h +++ b/src/lxc/conf.h @@ -474,10 +474,12 @@ struct lxc_conf { __hidden extern int write_id_mapping(enum idtype idtype, pid_t pid, const char *buf, size_t buf_size) __access_r(3, 4); -#ifdef HAVE_TLS +#if defined(THREAD_LOCAL_STORAGE_SUPPORTED) extern thread_local struct lxc_conf *current_config; +#elif defined(ENFORCE_THREAD_SAFETY) +#error ENFORCE_THREAD_SAFETY was set but cannot be guaranteed due to missing TLS #else -extern struct lxc_conf *current_config; +struct lxc_conf *current_config; #endif __hidden extern int run_lxc_hooks(const char *name, char *hook, struct lxc_conf *conf, char *argv[]); diff --git a/src/lxc/initutils.c b/src/lxc/initutils.c index 4a0aa41db..c6206bff5 100644 --- a/src/lxc/initutils.c +++ b/src/lxc/initutils.c @@ -54,8 +54,10 @@ const char *lxc_global_config_value(const char *option_name) }; /* placed in the thread local storage pool for non-bionic targets */ -#ifdef HAVE_TLS +#if defined(THREAD_LOCAL_STORAGE_SUPPORTED) static thread_local const char *values[sizeof(options) / sizeof(options[0])] = {0}; +#elif defined(ENFORCE_THREAD_SAFETY) + #error ENFORCE_THREAD_SAFETY was set but cannot be guaranteed due to missing TLS #else static const char *values[sizeof(options) / sizeof(options[0])] = {0}; #endif