On Sun, 15.12.13 16:24, Shawn Landden (sh...@churchofgit.com) wrote: > Also make thread_local available w/o including <threads.h>. > (as the latter hasn't been implemented, but this part is trivial)
Thanks! Applied! > --- > 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 | 11 +++++++++++ > src/shared/util.c | 6 +++--- > src/shared/virt.c | 8 ++++---- > 9 files changed, 29 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..362d62b 100644 > --- a/src/shared/macro.h > +++ b/src/shared/macro.h > @@ -27,6 +27,17 @@ > #include <sys/uio.h> > #include <inttypes.h> > > +#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 _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@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel