Hi Bruno, On Feb 5 22:22, Corinna Vinschen wrote: > On Feb 5 21:41, Bruno Haible wrote: > > Another option — since we are talking about a single symbol and a single > > platform — would be if the locking for setlocale_null were not necessary > > on Cygwin in the first place. I determined that it is necessary by running > > the unit test gnulib/tests/test-setlocale_null-mt-all.c [3] on Cygwin: > > without the lock, it crashed within less than 1 second. Could the > > implementation of setlocale() in Cygwin be changed in such a way that this > > test does not crash? Then the lock would be necessary. > > Well, we could do that by adding Cygwin-internal locking to setlocale > calls. But that would only be available in the next Cygwin version > of course. > > May I ask what's the idea to provide a thread-safe setlocale? It was > never defined as thread-safe and POSIX explicitely mentions that. Any > application expecting to call setlocale thread-safe is broken by design. > It should use the newlocale/duplocale/uselocale/freelocale API instead, > isn't it?
Ahhh, I finally see what's going on. The problem is not thread-safety as such, but thread-safety when reading the value of the LC_ALL category. Glibc's setlocale isn't entirely thread-safe either, but there's a difference: - GLibc creates the global strings returned by setlocale(LC_xxx, NULL) at the time the locale data is changed. All setlocale(LC_xxx, NULL) calls only return pointer to strings created earlier. - Cygwin or, better, newlib, also return a pointer to global strings. However, while the global strings for the specific categories are created when the locale is changed, the string returned for LC_ALL gets created on the fly when setlocale(LC_ALL, NULL) is called. That's why test-setlocale_null-mt-all fails almost immediately. I created a patch to newlib's setlocale to tweak the LC_ALL string each time the locale is changed, while setlocale(LC_ALL, NULL) just returns the already prepared string. https://cygwin.com/git/?p=newlib-cygwin.git;a=commitdiff;h=23e49b18ce39 This patch will be in the next Cygwin release 3.4.6. I'm just a bit fuzzy what patches will be required for gnulib now... Thanks, Corinna