Paolo Bonzini wrote: > > + c_locale = newlocale (LC_ALL_MASK, "C", (locale_t)0); > > Can we cache c_locale in a static variable?
This would make sense for speed, yes. (Think of calling c_strtod in a loop, like it is done in getloadavg.c.) Here is a proposed patch. OK, Jim? 2009-01-21 Bruno Haible <br...@clisp.org> 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. --- lib/c-strtod.c.orig 2009-01-21 23:51:32.000000000 +0100 +++ lib/c-strtod.c 2009-01-21 23:51:01.000000000 +0100 @@ -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 --- m4/c-strtod.m4.orig 2009-01-21 23:51:32.000000000 +0100 +++ m4/c-strtod.m4 2009-01-21 23:48:25.000000000 +0100 @@ -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]) : ])