From 562ed134d6cfa9956a72ff0d1c2e7aa84474c7c0 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 18 Jun 2024 08:21:44 -0700 Subject: [PATCH] nstrftime: tweak volatile access * lib/strftime.c (utc_timezone): Avoid unnecessary access to volatile. --- ChangeLog | 5 +++++ lib/strftime.c | 14 ++++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0c39edd886..1d5c743711 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2024-06-18 Paul Eggert + + nstrftime: tweak volatile access + * lib/strftime.c (utc_timezone): Avoid unnecessary access to volatile. + 2024-06-18 Bruno Haible nstrftime: Fix crash on NetBSD 10.0. diff --git a/lib/strftime.c b/lib/strftime.c index ffc1670f23..e21a356e80 100644 --- a/lib/strftime.c +++ b/lib/strftime.c @@ -405,9 +405,10 @@ c_locale (void) #if HAVE_NATIVE_TIME_Z -/* Cache for the UTC time zone object. - Marked volatile so that different threads see the same value - (avoids locking). */ +/* On NetBSD a null tz has undefined behavior, so use a non-null tz. + Cache the UTC time zone object in a volatile variable for improved + thread safety. This is good enough in practice, although in theory + stdatomic.h should be used. */ static volatile timezone_t utc_timezone_cache; /* Return the UTC time zone object, or (timezone_t) 0 with errno set @@ -415,9 +416,10 @@ static volatile timezone_t utc_timezone_cache; static timezone_t utc_timezone (void) { - if (!utc_timezone_cache) - utc_timezone_cache = tzalloc ("UTC"); - return utc_timezone_cache; + timezone_t tz = utc_timezone_cache; + if (!tz) + utc_timezone_cache = tz = tzalloc ("UTC0"); + return tz; } #endif -- 2.39.5