diff --git a/src/port/win32setlocale.c b/src/port/win32setlocale.c index cbf109836b..278d836b4d 100644 --- a/src/port/win32setlocale.c +++ b/src/port/win32setlocale.c @@ -164,19 +164,33 @@ map_locale(const struct locale_map * map, const char *locale) return locale; } +static CRITICAL_SECTION setlocale_cs; +static INIT_ONCE init_once; +static BOOL CALLBACK init_setlocale_cs(PINIT_ONCE pInitOnce, PVOID pParam, PVOID pCtx) +{ + InitializeCriticalSection((PCRITICAL_SECTION)pParam); + return TRUE; +} + char * pgwin32_setlocale(int category, const char *locale) { const char *argument; char *result; + if (InitOnceExecuteOnce(&init_once, init_setlocale_cs, (PVOID)&setlocale_cs, NULL) == 0) { + abort(); + } + if (locale == NULL) argument = NULL; else argument = map_locale(locale_map_argument, locale); /* Call the real setlocale() function */ + EnterCriticalSection(&setlocale_cs); result = setlocale(category, argument); + LeaveCriticalSection(&setlocale_cs); /* * setlocale() is specified to return a "char *" that the caller is