conf: fix thread_local support detection

Our detection for TLS wasn't working. Fix it. Fixes: https://github.com/lxc/lxd/issues/8327Signed-off-by: 's avatarChristian Brauner <christian.brauner@ubuntu.com>
parent 90accff3
......@@ -629,7 +629,7 @@ AC_CHECK_DECLS([PR_SET_NO_NEW_PRIVS], [], [], [#include <sys/prctl.h>])
AC_CHECK_DECLS([PR_GET_NO_NEW_PRIVS], [], [], [#include <sys/prctl.h>])
# 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)
......
......@@ -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 <threads.h>
#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
......
......@@ -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
......
......@@ -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[]);
......
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment