# HG changeset patch # User Bruno Haible # Date 1232622436 -3600 # Node ID 2017a2abcff4c96684d702b074e6be7850c726e4 # Parent 784aa6a7ca437e7ee7a6ef21b4a0850454e6aa46 Cache the C locale object. diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2009-01-22 Bruno Haible + + Cache the C locale object. + * lib/c-strtod.c (c_locale_cache): New variable. + (c_locale): New function. + (C_STRTOD): Use it, and don't call freelocale. + * m4/c-strtod.m4 (gl_C_STRTOD, gl_C_STRTOLD): Require AC_C_INLINE. + Suggested by Paolo Bonzini. + 2009-01-21 Bruno Haible * lib/getloadavg.c (getloadavg): Check c_strtod result against error diff --git a/lib/c-strtod.c b/lib/c-strtod.c --- a/lib/c-strtod.c +++ b/lib/c-strtod.c @@ -44,6 +44,25 @@ # define STRTOD strtod #endif +#ifdef LC_ALL_MASK + +/* Cache for the C locale object. + Marked volatile so that different threads see the same value + (avoids locking). */ +static volatile locale_t c_locale_cache; + +/* Return the C locale object, or (locale_t) 0 with errno set + if it cannot be created. */ +static inline locale_t +c_locale (void) +{ + if (!c_locale_cache) + c_locale_cache = newlocale (LC_ALL_MASK, "C", (locale_t) 0); + return c_locale_cache; +} + +#endif + DOUBLE C_STRTOD (char const *nptr, char **endptr) { @@ -51,18 +70,11 @@ #ifdef LC_ALL_MASK - locale_t c_locale; - int saved_errno; - - c_locale = newlocale (LC_ALL_MASK, "C", (locale_t) 0); - if (!c_locale) + locale_t locale = c_locale (); + if (!locale) return 0; /* errno is set here */ - r = STRTOD_L (nptr, endptr, c_locale); - - saved_errno = errno; - freelocale (c_locale); - errno = saved_errno; + r = STRTOD_L (nptr, endptr, locale); #else diff --git a/m4/c-strtod.m4 b/m4/c-strtod.m4 --- a/m4/c-strtod.m4 +++ b/m4/c-strtod.m4 @@ -1,4 +1,4 @@ -# c-strtod.m4 serial 10 +# c-strtod.m4 serial 11 # Copyright (C) 2004, 2005, 2006, 2009 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation @@ -39,6 +39,8 @@ dnl Prerequisites of lib/c-strtod.c. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) + + AC_REQUIRE([AC_C_INLINE]) : ]) @@ -49,5 +51,7 @@ dnl Prerequisites of lib/c-strtold.c. AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) AC_REQUIRE([gl_C99_STRTOLD]) + + AC_REQUIRE([AC_C_INLINE]) : ])