On Tue, Jul 23, 2024 at 10:52 PM Peter Eisentraut <pe...@eisentraut.org> wrote: > Let's look at what this code actually does. It just takes the current > time and then loops through all possible weekdays and months to collect > and cache the localized names. The current time or time zone doesn't > actually matter for this, we just need to fill in the struct tm a bit > for strftime() to be happy. We could probably replace this with > gmtime() to avoid the question about time zone state. (We probably > don't even need to call time() beforehand, we could just use time zero. > But the comment says "We use times close to current time as data for > strftime().", which is probably prudent.) (Since we are caching the > results for the session, we're already not dealing with the hilarious > hypothetical situation where the weekday and month names depend on the > actual time, in case that is a concern.)
I think you could even just use a struct tm filled in with an example date? Hmm, but it's annoying to choose one, and annoying that POSIX says there may be other members of the struct, so yeah, I think gmtime_r(0, tm) makes sense. It can't be that important, because we aren't even using dates consistent with tm_wday, so we're assuming that strftime("%a") only looks at tm_wday. This change complements CF #5170's change strftime()->strftime_l(), to make the function fully thread-safe. Someone could also rewrite it to call nl_langinfo_l({ABDAY,ABMON,DAY,MON}_1 + n, locale) directly, or GetLocaleInfoEx(locale_name, LOCALE_S{ABBREVDAY,ABBREVMONTH,DAY,MONTH}NAME1 + n, ...) on Window, but that'd be more code churn.