[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: c-strtod: improve error checking
From: |
Bruno Haible |
Subject: |
Re: c-strtod: improve error checking |
Date: |
Wed, 21 Jan 2009 23:55:16 +0100 |
User-agent: |
KMail/1.9.9 |
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 <address@hidden>
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])
:
])
- c-strtod: improve error checking, Bruno Haible, 2009/01/21
- Re: c-strtod: improve error checking, Paolo Bonzini, 2009/01/21
- Re: c-strtod: improve error checking,
Bruno Haible <=
- Re: c-strtod: improve error checking, Jim Meyering, 2009/01/21
- Re: c-strtod: improve error checking, Bruno Haible, 2009/01/21
- Re: c-strtod: improve error checking, Karl Berry, 2009/01/21
- Re: c-strtod: improve error checking, Peter Seebach, 2009/01/21
- Re: c-strtod: improve error checking, Simon Josefsson, 2009/01/21
- Re: NULL macro, Bruno Haible, 2009/01/21
- Re: NULL macro, Simon Josefsson, 2009/01/21