Cache the C locale object.
authorBruno Haible <bruno@clisp.org>
Thu, 22 Jan 2009 11:07:16 +0000 (12:07 +0100)
committerBruno Haible <bruno@clisp.org>
Thu, 22 Jan 2009 11:07:16 +0000 (12:07 +0100)
ChangeLog
lib/c-strtod.c
m4/c-strtod.m4

index a6e5634..e5d7238 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2009-01-22  Bruno Haible  <bruno@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.
+
 2009-01-21  Bruno Haible  <bruno@clisp.org>
 
        * lib/getloadavg.c (getloadavg): Check c_strtod result against error
index 0f97528..3d0fae9 100644 (file)
 # 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 @@ C_STRTOD (char const *nptr, char **endptr)
 
 #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
 
index 0514f2d..ba95435 100644 (file)
@@ -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 @@ AC_DEFUN([gl_C_STRTOD],
 
   dnl Prerequisites of lib/c-strtod.c.
   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+  AC_REQUIRE([AC_C_INLINE])
   :
 ])
 
@@ -49,5 +51,7 @@ AC_DEFUN([gl_C_STRTOLD],
   dnl Prerequisites of lib/c-strtold.c.
   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
   AC_REQUIRE([gl_C99_STRTOLD])
+
+  AC_REQUIRE([AC_C_INLINE])
   :
 ])