Set the locale per-thread instead of globally when generating shaders. Add cross-compatible versions of newlocale, uselocale and freelocale.

This commit fixes a rare race condition when generating shaders because setlocale is global.
This commit is contained in:
Armada
2013-06-15 13:21:57 +02:00
parent 825c5ca09a
commit fc7099a905
5 changed files with 68 additions and 8 deletions

View File

@ -6,6 +6,9 @@
#include <cmath>
#include <assert.h>
#include <locale.h>
#ifdef __APPLE__
#include <xlocale.h>
#endif
#include "LightingShaderGen.h"
#include "PixelShaderGen.h"
@ -513,7 +516,8 @@ const char *WriteLocation(API_TYPE ApiType)
const char *GeneratePixelShaderCode(DSTALPHA_MODE dstAlphaMode, API_TYPE ApiType, u32 components)
{
setlocale(LC_NUMERIC, "C"); // Reset locale for compilation
locale_t locale = newlocale(LC_NUMERIC_MASK, "C", NULL); // New locale for compilation
locale_t old_locale = uselocale(locale); // Apply the locale for this thread
text[sizeof(text) - 1] = 0x7C; // canary
BuildSwapModeTable(); // Needed for WriteStage
@ -886,7 +890,8 @@ const char *GeneratePixelShaderCode(DSTALPHA_MODE dstAlphaMode, API_TYPE ApiType
if (text[sizeof(text) - 1] != 0x7C)
PanicAlert("PixelShader generator - buffer too small, canary has been eaten!");
setlocale(LC_NUMERIC, ""); // restore locale
uselocale(old_locale); // restore locale
freelocale(locale);
return text;
}