[systemd-devel] [PATCH] __thread --> thread_local for C11 compat

Shawn Landden shawn at churchofgit.com
Sun Dec 15 14:56:05 PST 2013


On Sun, Dec 15, 2013 at 1:56 PM, Lennart Poettering
<lennart at poettering.net> wrote:
> On Sun, 15.12.13 13:19, Shawn Landden (shawn at churchofgit.com) wrote:
>
>> also make thread_local available w/o including <threads.h>
>
> Hmm, that looks a bit too early, no? Does gcc even support this? glibc
gcc-4.9 supports _Thread_local
http://gcc.gnu.org/gcc-4.9/changes.html

switching -std=gnu99 to -std=gnu11 in Makefile I can compile
systemd w/o the clause that defines _Thread_local as __thread
and all tests pass.

Perhaps we should add
|| (__GNUC__ == 4 && __GNUC_MINOR__ >= 9)
to the check
> doesn't support threads.h afaics... I couldn't find anything in
> particular regarding C11 TLS support in gcc with google, any link you
> can recommend? Apparently C++11 support is somewhat more existant, but
> C11 support regarding threads appears to be very limited?
>
> My glibc certainly doesn't ship thread.h. Given that gcc __thread and C11
from C11 page 376:

3 The macros are
thread_local
which expands to _Thread_local;

this part of threads.h is pretty simple
> thread_local appear to have different semantics regarding initialization
> I am also a bit afraid of just defining one to the other already at this
> point in time...
>
>> ---
>>  src/libsystemd-bus/sd-bus.c     |  4 ++--
>>  src/libsystemd-bus/sd-event.c   |  2 +-
>>  src/libsystemd-id128/sd-id128.c |  8 ++++----
>>  src/login/logind-inhibit.c      |  2 +-
>>  src/shared/capability.c         |  4 ++--
>>  src/shared/cgroup-util.c        |  2 +-
>>  src/shared/macro.h              | 10 ++++++++++
>>  src/shared/util.c               |  6 +++---
>>  src/shared/virt.c               |  8 ++++----
>>  9 files changed, 28 insertions(+), 18 deletions(-)
>>
>> diff --git a/src/libsystemd-bus/sd-bus.c b/src/libsystemd-bus/sd-bus.c
>> index 4eaceef..64cd663 100644
>> --- a/src/libsystemd-bus/sd-bus.c
>> +++ b/src/libsystemd-bus/sd-bus.c
>> @@ -2815,13 +2815,13 @@ static int bus_default(int (*bus_open)(sd_bus **), sd_bus **default_bus, sd_bus
>>  }
>>
>>  _public_ int sd_bus_default_system(sd_bus **ret) {
>> -        static __thread sd_bus *default_system_bus = NULL;
>> +        static thread_local sd_bus *default_system_bus = NULL;
>>
>>          return bus_default(sd_bus_open_system, &default_system_bus, ret);
>>  }
>>
>>  _public_ int sd_bus_default_user(sd_bus **ret) {
>> -        static __thread sd_bus *default_user_bus = NULL;
>> +        static thread_local sd_bus *default_user_bus = NULL;
>>
>>          return bus_default(sd_bus_open_user, &default_user_bus, ret);
>>  }
>> diff --git a/src/libsystemd-bus/sd-event.c b/src/libsystemd-bus/sd-event.c
>> index 06c84d7..727528b 100644
>> --- a/src/libsystemd-bus/sd-event.c
>> +++ b/src/libsystemd-bus/sd-event.c
>> @@ -2116,7 +2116,7 @@ _public_ int sd_event_get_now_monotonic(sd_event *e, uint64_t *usec) {
>>
>>  _public_ int sd_event_default(sd_event **ret) {
>>
>> -        static __thread sd_event *default_event = NULL;
>> +        static thread_local sd_event *default_event = NULL;
>>          sd_event *e;
>>          int r;
>>
>> diff --git a/src/libsystemd-id128/sd-id128.c b/src/libsystemd-id128/sd-id128.c
>> index 07d2415..9ee40ab 100644
>> --- a/src/libsystemd-id128/sd-id128.c
>> +++ b/src/libsystemd-id128/sd-id128.c
>> @@ -104,8 +104,8 @@ static sd_id128_t make_v4_uuid(sd_id128_t id) {
>>  }
>>
>>  _public_ int sd_id128_get_machine(sd_id128_t *ret) {
>> -        static __thread sd_id128_t saved_machine_id;
>> -        static __thread bool saved_machine_id_valid = false;
>> +        static thread_local sd_id128_t saved_machine_id;
>> +        static thread_local bool saved_machine_id_valid = false;
>>          _cleanup_close_ int fd = -1;
>>          char buf[33];
>>          ssize_t k;
>> @@ -153,8 +153,8 @@ _public_ int sd_id128_get_machine(sd_id128_t *ret) {
>>  }
>>
>>  _public_ int sd_id128_get_boot(sd_id128_t *ret) {
>> -        static __thread sd_id128_t saved_boot_id;
>> -        static __thread bool saved_boot_id_valid = false;
>> +        static thread_local sd_id128_t saved_boot_id;
>> +        static thread_local bool saved_boot_id_valid = false;
>>          _cleanup_close_ int fd = -1;
>>          char buf[36];
>>          ssize_t k;
>> diff --git a/src/login/logind-inhibit.c b/src/login/logind-inhibit.c
>> index ec6a722..042586d 100644
>> --- a/src/login/logind-inhibit.c
>> +++ b/src/login/logind-inhibit.c
>> @@ -413,7 +413,7 @@ bool manager_is_inhibited(
>>  }
>>
>>  const char *inhibit_what_to_string(InhibitWhat w) {
>> -        static __thread char buffer[97];
>> +        static thread_local char buffer[97];
>>          char *p;
>>
>>          if (w < 0 || w >= _INHIBIT_WHAT_MAX)
>> diff --git a/src/shared/capability.c b/src/shared/capability.c
>> index 3219520..f34f6ba 100644
>> --- a/src/shared/capability.c
>> +++ b/src/shared/capability.c
>> @@ -55,8 +55,8 @@ int have_effective_cap(int value) {
>>  }
>>
>>  unsigned long cap_last_cap(void) {
>> -        static __thread unsigned long saved;
>> -        static __thread bool valid = false;
>> +        static thread_local unsigned long saved;
>> +        static thread_local bool valid = false;
>>          unsigned long p;
>>
>>          if (valid)
>> diff --git a/src/shared/cgroup-util.c b/src/shared/cgroup-util.c
>> index 2c2ffc5..309f65d 100644
>> --- a/src/shared/cgroup-util.c
>> +++ b/src/shared/cgroup-util.c
>> @@ -480,7 +480,7 @@ static int join_path(const char *controller, const char *path, const char *suffi
>>
>>  int cg_get_path(const char *controller, const char *path, const char *suffix, char **fs) {
>>          const char *p;
>> -        static __thread bool good = false;
>> +        static thread_local bool good = false;
>>
>>          assert(fs);
>>
>> diff --git a/src/shared/macro.h b/src/shared/macro.h
>> index fd3762e..c0597fa 100644
>> --- a/src/shared/macro.h
>> +++ b/src/shared/macro.h
>> @@ -27,6 +27,16 @@
>>  #include <sys/uio.h>
>>  #include <inttypes.h>
>>
>> +#if __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__)
>> +#else
>> +#  define _Thread_local __thread
>> +#endif
>> +
>> +/* make thread_local available w/o including <threads.h> */
>> +#ifndef thread_local
>> +# define thread_local _Thread_local
>> +#endif
>> +
>>  #define _printf_(a,b) __attribute__ ((format (printf, a, b)))
>>  #define _alloc_(...) __attribute__ ((alloc_size(__VA_ARGS__)))
>>  #define _sentinel_ __attribute__ ((sentinel))
>> diff --git a/src/shared/util.c b/src/shared/util.c
>> index 7c73074..0ce6f70 100644
>> --- a/src/shared/util.c
>> +++ b/src/shared/util.c
>> @@ -86,7 +86,7 @@ static volatile unsigned cached_columns = 0;
>>  static volatile unsigned cached_lines = 0;
>>
>>  size_t page_size(void) {
>> -        static __thread size_t pgsz = 0;
>> +        static thread_local size_t pgsz = 0;
>>          long r;
>>
>>          if (_likely_(pgsz > 0))
>> @@ -4580,7 +4580,7 @@ char *strjoin(const char *x, ...) {
>>  }
>>
>>  bool is_main_thread(void) {
>> -        static __thread int cached = 0;
>> +        static thread_local int cached = 0;
>>
>>          if (_unlikely_(cached == 0))
>>                  cached = getpid() == gettid() ? 1 : -1;
>> @@ -4798,7 +4798,7 @@ static const char *const __signal_table[] = {
>>  DEFINE_PRIVATE_STRING_TABLE_LOOKUP(__signal, int);
>>
>>  const char *signal_to_string(int signo) {
>> -        static __thread char buf[sizeof("RTMIN+")-1 + DECIMAL_STR_MAX(int) + 1];
>> +        static thread_local char buf[sizeof("RTMIN+")-1 + DECIMAL_STR_MAX(int) + 1];
>>          const char *name;
>>
>>          name = __signal_to_string(signo);
>> diff --git a/src/shared/virt.c b/src/shared/virt.c
>> index 4e18638..c79d35d 100644
>> --- a/src/shared/virt.c
>> +++ b/src/shared/virt.c
>> @@ -150,8 +150,8 @@ static int detect_vm_dmi(const char **_id) {
>>  /* Returns a short identifier for the various VM implementations */
>>  int detect_vm(const char **id) {
>>          _cleanup_free_ char *hvtype = NULL, *cpuinfo_contents = NULL;
>> -        static __thread int cached_found = -1;
>> -        static __thread const char *cached_id = NULL;
>> +        static thread_local int cached_found = -1;
>> +        static thread_local const char *cached_id = NULL;
>>          const char *_id = NULL;
>>          int r;
>>
>> @@ -215,8 +215,8 @@ finish:
>>
>>  int detect_container(const char **id) {
>>
>> -        static __thread int cached_found = -1;
>> -        static __thread const char *cached_id = NULL;
>> +        static thread_local int cached_found = -1;
>> +        static thread_local const char *cached_id = NULL;
>>
>>          _cleanup_free_ char *e = NULL;
>>          const char *_id = NULL;
>
>
> Lennart
>
> --
> Lennart Poettering, Red Hat
> _______________________________________________
> systemd-devel mailing list
> systemd-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/systemd-devel


More information about the systemd-devel mailing list