1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-24 00:23:06 +03:00

Revert "Tidy up locale thread safety in ECPG library."

This reverts commit 8e993bff53.

It causes various build failures on the buildfarm, to be investigated.

Discussion: https://postgr.es/m/CWZBBRR6YA8D.8EHMDRGLCKCD%40neon.tech
This commit is contained in:
Peter Eisentraut
2025-03-28 21:27:37 +01:00
parent 6be53c2767
commit 3c8e463b0d
18 changed files with 148 additions and 192 deletions

View File

@@ -109,36 +109,6 @@
#undef vprintf
#undef printf
#if defined(FRONTEND)
/*
* Frontend code might be multi-threaded. When calling the system snprintf()
* for floats, we have to use either the non-standard snprintf_l() variant, or
* save-and-restore the calling thread's locale using uselocale(), depending on
* availability.
*/
#if defined(HAVE_SNPRINTF_L)
/* At least macOS and the BSDs have the snprintf_l() extension. */
#define USE_SNPRINTF_L
#elif defined(WIN32)
/* Windows has a version with a different name and argument order. */
#define snprintf_l(str, size, loc, format, ...) _snprintf_l(str, size, format, loc, __VA_ARGS__)
#define USE_SNPRINTF_L
#else
/* We have to do a thread-safe save-and-restore around snprintf(). */
#define NEED_USE_LOCALE
#endif
#else
/*
* Backend code doesn't need to worry about locales here, because LC_NUMERIC is
* set to "C" in main() and doesn't change. Plain old snprintf() is always OK
* without uselocale().
*
* XXX If the backend were multithreaded, we would have to be 100% certain that
* no one is calling setlocale() concurrently, even transiently, to be able to
* keep this small optimization.
*/
#endif
/*
* Info about where the formatted output is going.
*
@@ -1250,9 +1220,6 @@ fmtfloat(double value, char type, int forcesign, int leftjust,
* according to == but not according to memcmp.
*/
static const double dzero = 0.0;
#ifdef NEED_USE_LOCALE
locale_t save_locale = uselocale(PG_C_LOCALE);
#endif
if (adjust_sign((value < 0.0 ||
(value == 0.0 &&
@@ -1274,11 +1241,7 @@ fmtfloat(double value, char type, int forcesign, int leftjust,
fmt[2] = '*';
fmt[3] = type;
fmt[4] = '\0';
#ifdef USE_SNPRINTF_L
vallen = snprintf_l(convert, sizeof(convert), PG_C_LOCALE, fmt, prec, value);
#else
vallen = snprintf(convert, sizeof(convert), fmt, prec, value);
#endif
}
else
{
@@ -1287,11 +1250,6 @@ fmtfloat(double value, char type, int forcesign, int leftjust,
fmt[2] = '\0';
vallen = snprintf(convert, sizeof(convert), fmt, value);
}
#ifdef NEED_USE_LOCALE
uselocale(save_locale);
#endif
if (vallen < 0)
goto fail;
@@ -1414,25 +1372,12 @@ pg_strfromd(char *str, size_t count, int precision, double value)
}
else
{
#ifdef NEED_USE_LOCALE
locale_t save_locale = uselocale(PG_C_LOCALE);
#endif
fmt[0] = '%';
fmt[1] = '.';
fmt[2] = '*';
fmt[3] = 'g';
fmt[4] = '\0';
#ifdef USE_SNPRINTF_L
vallen = snprintf_l(convert, sizeof(convert), PG_C_LOCALE, fmt, precision, value);
#else
vallen = snprintf(convert, sizeof(convert), fmt, precision, value);
#endif
#ifdef NEED_USE_LOCALE
uselocale(save_locale);
#endif
if (vallen < 0)
{
target.failed = true;