]> Savannah Git Hosting - gnulib.git/commitdiff
setlocale: Make calls with NULL argument multithread-safe.
authorBruno Haible <bruno@clisp.org>
Wed, 18 Dec 2019 13:35:27 +0000 (14:35 +0100)
committerBruno Haible <bruno@clisp.org>
Wed, 18 Dec 2019 13:35:27 +0000 (14:35 +0100)
* lib/setlocale.c: Include <errno.h>.
(setlocale_mtsafe): New function.
(setlocale_unixlike): Invoke setlocale_mtsafe instead of setlocale.
(setlocale_improved): Renamed from rpl_setlocale.
* m4/setlocale.m4 (gl_FUNC_SETLOCALE): Require gl_FUNC_SETLOCALE_NULL.
Set and define NEED_SETLOCALE_IMPROVED and NEED_SETLOCALE_MTSAFE. Set
LIB_SETLOCALE.
* modules/setlocale (Depends-on): Add setlocale-null. Update conditions.
(Link): New section.
* tests/locale.c: Undefine setlocale.
* tests/test-setlocale_null-one.c: Likewise.
* tests/test-setlocale_null-all.c: Likewise.
* modules/setlocale-tests (Makefile.am): Link the test programs with
$(LIB_SETLOCALE).
* modules/astrxfrm-tests (Makefile.am): Likewise.
* modules/btowc-tests (Makefile.am): Likewise.
* modules/c-ctype-tests (Makefile.am): Likewise.
* modules/c-snprintf-tests (Makefile.am): Likewise.
* modules/c-strcase-tests (Makefile.am): Likewise.
* modules/c-vasprintf-tests (Makefile.am): Likewise.
* modules/c-vsnprintf-tests (Makefile.am): Likewise.
* modules/c-xvasprintf-tests (Makefile.am): Likewise.
* modules/dfa-tests (Makefile.am): Likewise.
* modules/duplocale-tests (Makefile.am): Likewise.
* modules/hard-locale-tests (Makefile.am): Likewise.
* modules/localcharset-tests (Makefile.am): Likewise.
* modules/localename-tests (Makefile.am): Likewise.
* modules/mbmemcasecmp-tests (Makefile.am): Likewise.
* modules/mbmemcasecoll-tests (Makefile.am): Likewise.
* modules/mbrtowc-tests (Makefile.am): Likewise.
* modules/mbscasecmp-tests (Makefile.am): Likewise.
* modules/mbscasestr-tests (Makefile.am): Likewise.
* modules/mbschr-tests (Makefile.am): Likewise.
* modules/mbscspn-tests (Makefile.am): Likewise.
* modules/mbsinit-tests (Makefile.am): Likewise.
* modules/mbsncasecmp-tests (Makefile.am): Likewise.
* modules/mbsnrtowcs-tests (Makefile.am): Likewise.
* modules/mbspbrk-tests (Makefile.am): Likewise.
* modules/mbspcasecmp-tests (Makefile.am): Likewise.
* modules/mbsrchr-tests (Makefile.am): Likewise.
* modules/mbsrtowcs-tests (Makefile.am): Likewise.
* modules/mbsspn-tests (Makefile.am): Likewise.
* modules/mbsstr-tests (Makefile.am): Likewise.
* modules/nl_langinfo-tests (Makefile.am): Likewise.
* modules/quotearg-tests (Makefile.am): Likewise.
* modules/regex-tests (Makefile.am): Likewise.
* modules/strfmon_l-tests (Makefile.am): Likewise.
* modules/strtod-tests (Makefile.am): Likewise.
* modules/strtold-tests (Makefile.am): Likewise.
* modules/unicase/locale-language-tests (Makefile.am): Likewise.
* modules/unicase/ulc-casecmp-tests (Makefile.am): Likewise.
* modules/unicase/ulc-casecoll-tests (Makefile.am): Likewise.
* modules/unigbrk/ulc-grapheme-breaks-tests (Makefile.am): Likewise.
* modules/unistdio/u8-vasnprintf-tests (Makefile.am): Likewise.
* modules/unistdio/u16-vasnprintf-tests (Makefile.am): Likewise.
* modules/unistdio/u32-vasnprintf-tests (Makefile.am): Likewise.
* modules/unistdio/ulc-vasnprintf-tests (Makefile.am): Likewise.
* modules/uniwbrk/ulc-wordbreaks-tests (Makefile.am): Likewise.
* modules/vasnprintf-posix-tests (Makefile.am): Likewise.
* modules/wcrtomb-tests (Makefile.am): Likewise.
* modules/wcsnrtombs-tests (Makefile.am): Likewise.
* modules/wcsrtombs-tests (Makefile.am): Likewise.
* modules/wcwidth-tests (Makefile.am): Likewise.
* doc/posix-functions/setlocale.texi: Mention that the multithread-
safety fix is also available in module 'setlocale'.

58 files changed:
ChangeLog
doc/posix-functions/setlocale.texi
lib/setlocale.c
m4/setlocale.m4
modules/astrxfrm-tests
modules/btowc-tests
modules/c-ctype-tests
modules/c-snprintf-tests
modules/c-strcase-tests
modules/c-vasprintf-tests
modules/c-vsnprintf-tests
modules/c-xvasprintf-tests
modules/dfa-tests
modules/duplocale-tests
modules/hard-locale-tests
modules/localcharset-tests
modules/localename-tests
modules/mbmemcasecmp-tests
modules/mbmemcasecoll-tests
modules/mbrtowc-tests
modules/mbscasecmp-tests
modules/mbscasestr-tests
modules/mbschr-tests
modules/mbscspn-tests
modules/mbsinit-tests
modules/mbsncasecmp-tests
modules/mbsnrtowcs-tests
modules/mbspbrk-tests
modules/mbspcasecmp-tests
modules/mbsrchr-tests
modules/mbsrtowcs-tests
modules/mbsspn-tests
modules/mbsstr-tests
modules/nl_langinfo-tests
modules/quotearg-tests
modules/regex-tests
modules/setlocale
modules/setlocale-tests
modules/strfmon_l-tests
modules/strtod-tests
modules/strtold-tests
modules/unicase/locale-language-tests
modules/unicase/ulc-casecmp-tests
modules/unicase/ulc-casecoll-tests
modules/unigbrk/ulc-grapheme-breaks-tests
modules/unistdio/u16-vasnprintf-tests
modules/unistdio/u32-vasnprintf-tests
modules/unistdio/u8-vasnprintf-tests
modules/unistdio/ulc-vasnprintf-tests
modules/uniwbrk/ulc-wordbreaks-tests
modules/vasnprintf-posix-tests
modules/wcrtomb-tests
modules/wcsnrtombs-tests
modules/wcsrtombs-tests
modules/wcwidth-tests
tests/locale.c
tests/test-setlocale_null-all.c
tests/test-setlocale_null-one.c

index e2c33fb163b2674d4f6c82fde564dbdd78aa6e61..7d8b1c04e885940a7c83aafc8280ed8a69b43403 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,72 @@
+2019-12-18  Bruno Haible  <bruno@clisp.org>
+
+       setlocale: Make calls with NULL argument multithread-safe.
+       * lib/setlocale.c: Include <errno.h>.
+       (setlocale_mtsafe): New function.
+       (setlocale_unixlike): Invoke setlocale_mtsafe instead of setlocale.
+       (setlocale_improved): Renamed from rpl_setlocale.
+       * m4/setlocale.m4 (gl_FUNC_SETLOCALE): Require gl_FUNC_SETLOCALE_NULL.
+       Set and define NEED_SETLOCALE_IMPROVED and NEED_SETLOCALE_MTSAFE. Set
+       LIB_SETLOCALE.
+       * modules/setlocale (Depends-on): Add setlocale-null. Update conditions.
+       (Link): New section.
+       * tests/locale.c: Undefine setlocale.
+       * tests/test-setlocale_null-one.c: Likewise.
+       * tests/test-setlocale_null-all.c: Likewise.
+       * modules/setlocale-tests (Makefile.am): Link the test programs with
+       $(LIB_SETLOCALE).
+       * modules/astrxfrm-tests (Makefile.am): Likewise.
+       * modules/btowc-tests (Makefile.am): Likewise.
+       * modules/c-ctype-tests (Makefile.am): Likewise.
+       * modules/c-snprintf-tests (Makefile.am): Likewise.
+       * modules/c-strcase-tests (Makefile.am): Likewise.
+       * modules/c-vasprintf-tests (Makefile.am): Likewise.
+       * modules/c-vsnprintf-tests (Makefile.am): Likewise.
+       * modules/c-xvasprintf-tests (Makefile.am): Likewise.
+       * modules/dfa-tests (Makefile.am): Likewise.
+       * modules/duplocale-tests (Makefile.am): Likewise.
+       * modules/hard-locale-tests (Makefile.am): Likewise.
+       * modules/localcharset-tests (Makefile.am): Likewise.
+       * modules/localename-tests (Makefile.am): Likewise.
+       * modules/mbmemcasecmp-tests (Makefile.am): Likewise.
+       * modules/mbmemcasecoll-tests (Makefile.am): Likewise.
+       * modules/mbrtowc-tests (Makefile.am): Likewise.
+       * modules/mbscasecmp-tests (Makefile.am): Likewise.
+       * modules/mbscasestr-tests (Makefile.am): Likewise.
+       * modules/mbschr-tests (Makefile.am): Likewise.
+       * modules/mbscspn-tests (Makefile.am): Likewise.
+       * modules/mbsinit-tests (Makefile.am): Likewise.
+       * modules/mbsncasecmp-tests (Makefile.am): Likewise.
+       * modules/mbsnrtowcs-tests (Makefile.am): Likewise.
+       * modules/mbspbrk-tests (Makefile.am): Likewise.
+       * modules/mbspcasecmp-tests (Makefile.am): Likewise.
+       * modules/mbsrchr-tests (Makefile.am): Likewise.
+       * modules/mbsrtowcs-tests (Makefile.am): Likewise.
+       * modules/mbsspn-tests (Makefile.am): Likewise.
+       * modules/mbsstr-tests (Makefile.am): Likewise.
+       * modules/nl_langinfo-tests (Makefile.am): Likewise.
+       * modules/quotearg-tests (Makefile.am): Likewise.
+       * modules/regex-tests (Makefile.am): Likewise.
+       * modules/strfmon_l-tests (Makefile.am): Likewise.
+       * modules/strtod-tests (Makefile.am): Likewise.
+       * modules/strtold-tests (Makefile.am): Likewise.
+       * modules/unicase/locale-language-tests (Makefile.am): Likewise.
+       * modules/unicase/ulc-casecmp-tests (Makefile.am): Likewise.
+       * modules/unicase/ulc-casecoll-tests (Makefile.am): Likewise.
+       * modules/unigbrk/ulc-grapheme-breaks-tests (Makefile.am): Likewise.
+       * modules/unistdio/u8-vasnprintf-tests (Makefile.am): Likewise.
+       * modules/unistdio/u16-vasnprintf-tests (Makefile.am): Likewise.
+       * modules/unistdio/u32-vasnprintf-tests (Makefile.am): Likewise.
+       * modules/unistdio/ulc-vasnprintf-tests (Makefile.am): Likewise.
+       * modules/uniwbrk/ulc-wordbreaks-tests (Makefile.am): Likewise.
+       * modules/vasnprintf-posix-tests (Makefile.am): Likewise.
+       * modules/wcrtomb-tests (Makefile.am): Likewise.
+       * modules/wcsnrtombs-tests (Makefile.am): Likewise.
+       * modules/wcsrtombs-tests (Makefile.am): Likewise.
+       * modules/wcwidth-tests (Makefile.am): Likewise.
+       * doc/posix-functions/setlocale.texi: Mention that the multithread-
+       safety fix is also available in module 'setlocale'.
+
 2019-12-18  Bruno Haible  <bruno@clisp.org>
 
        hard-locale: Make multithread-safe.
index cd172c0b855657bcd6c69372bda6f2318d6c17fd..d8282b6a34fc73697116083bd1cd64a01c846305 100644 (file)
@@ -26,14 +26,15 @@ always fails.  The replacement, however, supports only the locale names
 @code{"C"} and @code{"POSIX"}.
 @end itemize
 
-Portability problems fixed by Gnulib module @code{setlocale-null}:
+Portability problems fixed by Gnulib module @code{setlocale} or @code{setlocale-null}:
 @itemize
 @item
 Invocations of @code{setlocale (..., NULL)} are not multithread-safe on some
 platforms:
 musl libc, macOS, FreeBSD, NetBSD, OpenBSD, AIX, Haiku, Cygwin.
-To make these invocations multithread-safe, you need to change the code to
-invoke @code{setlocale_null} instead.
+To make these invocations multithread-safe, you need the Gnulib module
+@code{setlocale}, or you need to change the code to invoke @code{setlocale_null}
+instead.
 @end itemize
 
 Portability problems not fixed by Gnulib:
index fbabe99efde90e1df537a3e3cf0699e1dc0245a9..da28a1a4a32d1759e70fef4740b05ad9e7c9b631 100644 (file)
@@ -29,6 +29,7 @@
 /* Specification.  */
 #include <locale.h>
 
+#include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -51,6 +52,141 @@ extern void gl_locale_name_canonicalize (char *name);
 
 # undef setlocale
 
+/* Which of the replacements to activate?  */
+# if NEED_SETLOCALE_IMPROVED
+#  define setlocale_improved rpl_setlocale
+# elif NEED_SETLOCALE_MTSAFE
+#  define setlocale_mtsafe rpl_setlocale
+# else
+#  error "This file should only be compiled if NEED_SETLOCALE_IMPROVED || NEED_SETLOCALE_MTSAFE."
+# endif
+
+/* Like setlocale, but guaranteed to be multithread-safe if LOCALE == NULL.  */
+# if !SETLOCALE_NULL_ALL_MTSAFE || !SETLOCALE_NULL_ONE_MTSAFE /* i.e. if NEED_SETLOCALE_MTSAFE */
+
+#  if NEED_SETLOCALE_IMPROVED
+static
+#  endif
+char *
+setlocale_mtsafe (int category, const char *locale)
+{
+  if (locale == NULL)
+    {
+      /* This call must be multithread-safe.  To achieve this without using
+         thread-local storage:
+           1. We use a specific static buffer for each possible CATEGORY
+              argument.  So that different threads can call setlocale_mtsafe
+              with different CATEGORY arguments, without interfering.
+           2. We use a simple strcpy or memcpy to fill this static buffer.
+              Filling it through, for example, strcpy + strcat would not be
+              guaranteed to leave the buffer's contents intact if another thread
+              is currently accessing it.  If necessary, the contents is first
+              assembled in a stack-allocated buffer.  */
+      if (category == LC_ALL)
+        {
+#  if SETLOCALE_NULL_ALL_MTSAFE
+          return setlocale (LC_ALL, NULL);
+#  else
+          char buf[SETLOCALE_NULL_ALL_MAX];
+          static char resultbuf[SETLOCALE_NULL_ALL_MAX];
+
+          if (setlocale_null (LC_ALL, buf, sizeof (buf)))
+            return (char *) "C";
+          strcpy (resultbuf, buf);
+          return resultbuf;
+#  endif
+        }
+      else
+        {
+#  if SETLOCALE_NULL_ONE_MTSAFE
+          return setlocale (category, NULL);
+#  else
+          enum
+            {
+              LC_CTYPE_INDEX,
+              LC_NUMERIC_INDEX,
+              LC_TIME_INDEX,
+              LC_COLLATE_INDEX,
+              LC_MONETARY_INDEX,
+              LC_MESSAGES_INDEX,
+#   ifdef LC_PAPER
+              LC_PAPER_INDEX,
+#   endif
+#   ifdef LC_NAME
+              LC_NAME_INDEX,
+#   endif
+#   ifdef LC_ADDRESS
+              LC_ADDRESS_INDEX,
+#   endif
+#   ifdef LC_TELEPHONE
+              LC_TELEPHONE_INDEX,
+#   endif
+#   ifdef LC_MEASUREMENT
+              LC_MEASUREMENT_INDEX,
+#   endif
+#   ifdef LC_IDENTIFICATION
+              LC_IDENTIFICATION_INDEX,
+#   endif
+              LC_INDICES_COUNT
+            }
+            i;
+          char buf[SETLOCALE_NULL_MAX];
+          static char resultbuf[LC_INDICES_COUNT][SETLOCALE_NULL_MAX];
+          int err;
+
+          err = setlocale_null (category, buf, sizeof (buf));
+          if (err == EINVAL)
+            return NULL;
+          if (err)
+            return (char *) "C";
+
+          switch (category)
+            {
+            case LC_CTYPE:          i = LC_CTYPE_INDEX;          break;
+            case LC_NUMERIC:        i = LC_NUMERIC_INDEX;        break;
+            case LC_TIME:           i = LC_TIME_INDEX;           break;
+            case LC_COLLATE:        i = LC_COLLATE_INDEX;        break;
+            case LC_MONETARY:       i = LC_MONETARY_INDEX;       break;
+            case LC_MESSAGES:       i = LC_MESSAGES_INDEX;       break;
+#   ifdef LC_PAPER
+            case LC_PAPER:          i = LC_PAPER_INDEX;          break;
+#   endif
+#   ifdef LC_NAME
+            case LC_NAME:           i = LC_NAME_INDEX;           break;
+#   endif
+#   ifdef LC_ADDRESS
+            case LC_ADDRESS:        i = LC_ADDRESS_INDEX;        break;
+#   endif
+#   ifdef LC_TELEPHONE
+            case LC_TELEPHONE:      i = LC_TELEPHONE_INDEX;      break;
+#   endif
+#   ifdef LC_MEASUREMENT
+            case LC_MEASUREMENT:    i = LC_MEASUREMENT_INDEX;    break;
+#   endif
+#   ifdef LC_IDENTIFICATION
+            case LC_IDENTIFICATION: i = LC_IDENTIFICATION_INDEX; break;
+#   endif
+            default:
+              /* If you get here, a #ifdef LC_xxx is missing.  */
+              abort ();
+            }
+
+          strcpy (resultbuf[i], buf);
+          return resultbuf[i];
+#  endif
+        }
+    }
+  else
+    return setlocale (category, locale);
+}
+# else /* !NEED_SETLOCALE_MTSAFE */
+
+#  define setlocale_mtsafe setlocale
+
+# endif /* NEED_SETLOCALE_MTSAFE */
+
+# if NEED_SETLOCALE_IMPROVED
+
 /* Return string representation of locale category CATEGORY.  */
 static const char *
 category_to_name (int category)
@@ -85,7 +221,7 @@ category_to_name (int category)
   return retval;
 }
 
-# if defined _WIN32 && ! defined __CYGWIN__
+#  if defined _WIN32 && ! defined __CYGWIN__
 
 /* The native Windows setlocale() function expects locale names of the form
    "German" or "German_Germany" or "DEU", but not "de" or "de_DE".  We need
@@ -652,7 +788,7 @@ setlocale_unixlike (int category, const char *locale)
     locale = "C";
 
   /* First, try setlocale with the original argument unchanged.  */
-  result = setlocale (category, locale);
+  result = setlocale_mtsafe (category, locale);
   if (result != NULL)
     return result;
 
@@ -794,13 +930,13 @@ setlocale_unixlike (int category, const char *locale)
   return NULL;
 }
 
-# elif defined __ANDROID__
+#  elif defined __ANDROID__
 
 /* Like setlocale, but accept also the locale names "C" and "POSIX".  */
 static char *
 setlocale_unixlike (int category, const char *locale)
 {
-  char *result = setlocale (category, locale);
+  char *result = setlocale_mtsafe (category, locale);
   if (result == NULL)
     switch (category)
       {
@@ -825,13 +961,13 @@ setlocale_unixlike (int category, const char *locale)
       }
   return result;
 }
-#  define setlocale setlocale_unixlike
+#   define setlocale setlocale_unixlike
 
-# else
-#  define setlocale_unixlike setlocale
-# endif
+#  else
+#   define setlocale_unixlike setlocale_mtsafe
+#  endif
 
-# if LC_MESSAGES == 1729
+#  if LC_MESSAGES == 1729
 
 /* The system does not store an LC_MESSAGES locale category.  Do it here.  */
 static char lc_messages_name[64] = "C";
@@ -853,11 +989,11 @@ setlocale_single (int category, const char *locale)
     return setlocale_unixlike (category, locale);
 }
 
-# else
-#  define setlocale_single setlocale_unixlike
-# endif
+#  else
+#   define setlocale_single setlocale_unixlike
+#  endif
 
-# if defined __APPLE__ && defined __MACH__
+#  if defined __APPLE__ && defined __MACH__
 
 /* Mapping from language to main territory where that language is spoken.  */
 static char const locales_with_principal_territory[][6 + 1] =
@@ -1115,7 +1251,7 @@ langcmp (const char *locale1, const char *locale2)
 static const char *
 get_main_locale_with_same_language (const char *locale)
 {
-#  define table locales_with_principal_territory
+#   define table locales_with_principal_territory
   /* The table is sorted.  Perform a binary search.  */
   size_t hi = sizeof (table) / sizeof (table[0]);
   size_t lo = 0;
@@ -1142,7 +1278,7 @@ get_main_locale_with_same_language (const char *locale)
           return table[mid];
         }
     }
-#  undef table
+#   undef table
   return NULL;
 }
 
@@ -1344,7 +1480,7 @@ get_main_locale_with_same_territory (const char *locale)
 {
   if (strrchr (locale, '_') != NULL)
     {
-#  define table locales_with_principal_language
+#   define table locales_with_principal_language
       /* The table is sorted.  Perform a binary search.  */
       size_t hi = sizeof (table) / sizeof (table[0]);
       size_t lo = 0;
@@ -1371,15 +1507,15 @@ get_main_locale_with_same_territory (const char *locale)
               return table[mid];
             }
         }
-#  undef table
+#   undef table
     }
   return NULL;
 }
 
-# endif
+#  endif
 
 char *
-rpl_setlocale (int category, const char *locale)
+setlocale_improved (int category, const char *locale)
 {
   if (locale != NULL && locale[0] == '\0')
     {
@@ -1431,14 +1567,14 @@ rpl_setlocale (int category, const char *locale)
                 goto fail;
               i = 0;
             }
-# if defined _WIN32 && ! defined __CYGWIN__
+#  if defined _WIN32 && ! defined __CYGWIN__
           /* On native Windows, setlocale(LC_ALL,...) may succeed but set the
              LC_CTYPE category to an invalid value ("C") when it does not
              support the specified encoding.  Report a failure instead.  */
           if (strchr (base_name, '.') != NULL
               && strcmp (setlocale (LC_CTYPE, NULL), "C") == 0)
             goto fail;
-# endif
+#  endif
 
           for (; i < sizeof (categories) / sizeof (categories[0]); i++)
             {
@@ -1452,12 +1588,12 @@ rpl_setlocale (int category, const char *locale)
               /* If name is the same as base_name, it has already been set
                  through the setlocale call before the loop.  */
               if (strcmp (name, base_name) != 0
-# if LC_MESSAGES == 1729
+#  if LC_MESSAGES == 1729
                   || cat == LC_MESSAGES
-# endif
+#  endif
                  )
                 if (setlocale_single (cat, name) == NULL)
-# if defined __APPLE__ && defined __MACH__
+#  if defined __APPLE__ && defined __MACH__
                   {
                     /* On Mac OS X 10.13, some locales can be set through
                        System Preferences > Language & Region, that are not
@@ -1473,11 +1609,11 @@ rpl_setlocale (int category, const char *locale)
                       warn = (setlocale_single (cat, "UTF-8") == NULL);
                     else if (cat == LC_MESSAGES)
                       {
-#  if HAVE_CFLOCALECOPYPREFERREDLANGUAGES || HAVE_CFPREFERENCESCOPYAPPVALUE /* MacOS X 10.4 or newer */
+#   if HAVE_CFLOCALECOPYPREFERREDLANGUAGES || HAVE_CFPREFERENCESCOPYAPPVALUE /* MacOS X 10.4 or newer */
                         /* Take the primary language preference.  */
-#   if HAVE_CFLOCALECOPYPREFERREDLANGUAGES /* MacOS X 10.5 or newer */
+#    if HAVE_CFLOCALECOPYPREFERREDLANGUAGES /* MacOS X 10.5 or newer */
                         CFArrayRef prefArray = CFLocaleCopyPreferredLanguages ();
-#   elif HAVE_CFPREFERENCESCOPYAPPVALUE /* MacOS X 10.4 or newer */
+#    elif HAVE_CFPREFERENCESCOPYAPPVALUE /* MacOS X 10.4 or newer */
                         CFTypeRef preferences =
                           CFPreferencesCopyAppValue (CFSTR ("AppleLanguages"),
                                                      kCFPreferencesCurrentApplication);
@@ -1485,7 +1621,7 @@ rpl_setlocale (int category, const char *locale)
                             && CFGetTypeID (preferences) == CFArrayGetTypeID ())
                           {
                             CFArrayRef prefArray = (CFArrayRef)preferences;
-#   endif
+#    endif
                             int n = CFArrayGetCount (prefArray);
                             if (n > 0)
                               {
@@ -1519,19 +1655,19 @@ rpl_setlocale (int category, const char *locale)
                                       }
                                   }
                               }
-#   if HAVE_CFLOCALECOPYPREFERREDLANGUAGES /* MacOS X 10.5 or newer */
+#    if HAVE_CFLOCALECOPYPREFERREDLANGUAGES /* MacOS X 10.5 or newer */
                         CFRelease (prefArray);
-#   elif HAVE_CFPREFERENCESCOPYAPPVALUE /* MacOS X 10.4 or newer */
+#    elif HAVE_CFPREFERENCESCOPYAPPVALUE /* MacOS X 10.4 or newer */
                           }
-#   endif
-#  else
+#    endif
+#   else
                         const char *last_try =
                           get_main_locale_with_same_language (name);
 
                         if (last_try == NULL
                             || setlocale_single (cat, last_try) == NULL)
                           warn = 1;
-#  endif
+#   endif
                       }
                     else
                       {
@@ -1570,9 +1706,9 @@ rpl_setlocale (int category, const char *locale)
                                    category_to_name (cat), name);
                       }
                   }
-# else
+#  else
                   goto fail;
-# endif
+#  endif
             }
 
           /* All steps were successful.  */
@@ -1597,7 +1733,7 @@ rpl_setlocale (int category, const char *locale)
     }
   else
     {
-# if defined _WIN32 && ! defined __CYGWIN__
+#  if defined _WIN32 && ! defined __CYGWIN__
       if (category == LC_ALL && locale != NULL && strchr (locale, '.') != NULL)
         {
           char *saved_locale;
@@ -1632,9 +1768,11 @@ rpl_setlocale (int category, const char *locale)
           return setlocale (LC_ALL, NULL);
         }
       else
-# endif
+#  endif
         return setlocale_single (category, locale);
     }
 }
 
+# endif /* NEED_SETLOCALE_IMPROVED */
+
 #endif
index dba68c4e4ffcf30fb0252b1db315bec967be56fd..14f22b2bf798ce99e3687f70c26cb7a8987a66df 100644 (file)
@@ -1,4 +1,4 @@
-# setlocale.m4 serial 6
+# setlocale.m4 serial 7
 dnl Copyright (C) 2011-2019 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -7,16 +7,20 @@ dnl with or without modifications, as long as this notice is preserved.
 AC_DEFUN([gl_FUNC_SETLOCALE],
 [
   AC_REQUIRE([gl_LOCALE_H_DEFAULTS])
+  AC_REQUIRE([gl_FUNC_SETLOCALE_NULL])
   AC_REQUIRE([AC_CANONICAL_HOST])
+
+  dnl Test whether we need to improve on the general working of setlocale.
+  NEED_SETLOCALE_IMPROVED=0
   case "$host_os" in
     dnl On native Windows systems, setlocale(category,NULL) does not look at
     dnl the environment variables LC_ALL, category, and LANG.
-    mingw*) REPLACE_SETLOCALE=1 ;;
+    mingw*) NEED_SETLOCALE_IMPROVED=1 ;;
     dnl On Cygwin 1.5.x, setlocale always succeeds but setlocale(LC_CTYPE,NULL)
     dnl is then still "C".
     cygwin*)
       case `uname -r` in
-        1.5.*) REPLACE_SETLOCALE=1 ;;
+        1.5.*) NEED_SETLOCALE_IMPROVED=1 ;;
       esac
       ;;
     dnl On Android 4.3, setlocale(category,"C") always fails.
@@ -42,10 +46,33 @@ int main ()
         ])
       case "$gl_cv_func_setlocale_works" in
         *yes) ;;
-        *) REPLACE_SETLOCALE=1 ;;
+        *) NEED_SETLOCALE_IMPROVED=1 ;;
       esac
       ;;
   esac
+  AC_DEFINE_UNQUOTED([NEED_SETLOCALE_IMPROVED], [$NEED_SETLOCALE_IMPROVED],
+    [Define to 1 to enable general improvements of setlocale.])
+
+  dnl Test whether we need a multithread-safe setlocale(category,NULL).
+  NEED_SETLOCALE_MTSAFE=0
+  if test $SETLOCALE_NULL_ALL_MTSAFE = 0 || test $SETLOCALE_NULL_ONE_MTSAFE = 0; then
+    NEED_SETLOCALE_MTSAFE=1
+  fi
+  AC_DEFINE_UNQUOTED([NEED_SETLOCALE_MTSAFE], [$NEED_SETLOCALE_MTSAFE],
+    [Define to 1 to enable a multithread-safety fix of setlocale.])
+
+  if test $NEED_SETLOCALE_IMPROVED = 1 || test $NEED_SETLOCALE_MTSAFE = 1; then
+    REPLACE_SETLOCALE=1
+  fi
+
+  if test $NEED_SETLOCALE_MTSAFE = 1; then
+    LIB_SETLOCALE="$LIB_SETLOCALE_NULL"
+  else
+    LIB_SETLOCALE=
+  fi
+  dnl LIB_SETLOCALE is expected to be '-pthread' or '-lpthread' on AIX with gcc
+  dnl or xlc, and empty otherwise.
+  AC_SUBST([LIB_SETLOCALE])
 ])
 
 # Prerequisites of lib/setlocale.c.
index af8c1003ed3494b0c0aea86843aa0d76b40de996..b113e34a318caca7cc906c9ec587b84a549335c9 100644 (file)
@@ -9,3 +9,4 @@ configure.ac:
 Makefile.am:
 TESTS += test-astrxfrm
 check_PROGRAMS += test-astrxfrm
+test_astrxfrm_LDADD = $(LDADD) $(LIB_SETLOCALE)
index 66196b1332c3590920ff313e5555ae0fa7f8be84..e36cc61c42d4e05f8a2bca40e44bb5496665cd08 100644 (file)
@@ -18,4 +18,4 @@ Makefile.am:
 TESTS += test-btowc1.sh test-btowc2.sh
 TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@' LOCALE_FR_UTF8='@LOCALE_FR_UTF8@'
 check_PROGRAMS += test-btowc
-
+test_btowc_LDADD = $(LDADD) $(LIB_SETLOCALE)
index e66a4cca87a70c459b7d0956b1f5717bf9178e81..02706b00de8ac1d8c9fbfdb21dfa1660a962eaca 100644 (file)
@@ -11,3 +11,4 @@ configure.ac:
 Makefile.am:
 TESTS += test-c-ctype
 check_PROGRAMS += test-c-ctype
+test_c_ctype_LDADD = $(LDADD) $(LIB_SETLOCALE)
index 86d6a1420c129bded9c4012433a2abbed9c1159f..231a4fdb66ebfe8b758907ad7d93f59ba4b2b39f 100644 (file)
@@ -13,5 +13,6 @@ gt_LOCALE_FR
 
 Makefile.am:
 TESTS += test-c-snprintf.sh
-check_PROGRAMS += test-c-snprintf
 TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@'
+check_PROGRAMS += test-c-snprintf
+test_c_snprintf_LDADD = $(LDADD) $(LIB_SETLOCALE)
index 5802f41eb154c528a232981bc54ffe9e3e1a2934..7cdb29cef28cb711303fa4d38b2926acaeb31a2c 100644 (file)
@@ -19,3 +19,5 @@ Makefile.am:
 TESTS += test-c-strcase.sh
 TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@' LOCALE_TR_UTF8='@LOCALE_TR_UTF8@'
 check_PROGRAMS += test-c-strcasecmp test-c-strncasecmp
+test_c_strcasecmp_LDADD = $(LDADD) $(LIB_SETLOCALE)
+test_c_strncasecmp_LDADD = $(LDADD) $(LIB_SETLOCALE)
index 940956366cfecc58681f697e612c03b453fd75c4..b82fc8b7e1712e15aa4fd548d9c083f5736036e4 100644 (file)
@@ -13,5 +13,6 @@ gt_LOCALE_FR
 
 Makefile.am:
 TESTS += test-c-vasprintf.sh
-check_PROGRAMS += test-c-vasprintf
 TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@'
+check_PROGRAMS += test-c-vasprintf
+test_c_vasprintf_LDADD = $(LDADD) $(LIB_SETLOCALE)
index 6a76092ddd5ffc9b6d441b5bbe03c3058cbc2014..542d8d98f32f33550895cf55b617eeaf0e56a147 100644 (file)
@@ -13,5 +13,6 @@ gt_LOCALE_FR
 
 Makefile.am:
 TESTS += test-c-vsnprintf.sh
-check_PROGRAMS += test-c-vsnprintf
 TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@'
+check_PROGRAMS += test-c-vsnprintf
+test_c_vsnprintf_LDADD = $(LDADD) $(LIB_SETLOCALE)
index a118de0a679aa53c3bb719e204d69be1caf13a06..75ce919410030405a19cac9b16f77ca665bf1b45 100644 (file)
@@ -14,6 +14,6 @@ gt_LOCALE_FR
 
 Makefile.am:
 TESTS += test-c-xvasprintf.sh
-check_PROGRAMS += test-c-xvasprintf
-test_c_xvasprintf_LDADD = $(LDADD) @LIBINTL@
 TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@'
+check_PROGRAMS += test-c-xvasprintf
+test_c_xvasprintf_LDADD = $(LDADD) $(LIB_SETLOCALE) @LIBINTL@
index ee4354a268dd9daa8b509405516540b03b3dfc1c..0128dca2b0a40492b75e88f41beff03e72c3da60 100644 (file)
@@ -18,4 +18,4 @@ TESTS +=                      \
   dfa-match.sh
 
 check_PROGRAMS += dfa-match-aux
-dfa_match_aux_LDADD = $(LDADD) @LIBINTL@ $(LIBTHREAD)
+dfa_match_aux_LDADD = $(LDADD) $(LIB_SETLOCALE) @LIBINTL@ $(LIBTHREAD)
index 6545c4e33aefbb7d3d1d997ab4bc7b3f048b89b4..e30810982a89d8b8687b0903f2ab256489301973 100644 (file)
@@ -15,4 +15,4 @@ gt_FUNC_USELOCALE
 Makefile.am:
 TESTS += test-duplocale
 check_PROGRAMS += test-duplocale
-test_duplocale_LDADD = $(LDADD) @LIB_DUPLOCALE@
+test_duplocale_LDADD = $(LDADD) $(LIB_SETLOCALE) @LIB_DUPLOCALE@
index a501781d8d50ba266290e1767b7f14a735eed494..ddd101f1752baf0766b77fa29973c472145a9398 100644 (file)
@@ -16,4 +16,4 @@ Makefile.am:
 TESTS += test-hard-locale
 check_PROGRAMS += test-hard-locale
 noinst_PROGRAMS += locale
-test_hard_locale_LDADD = $(LDADD) @LIB_HARD_LOCALE@
+test_hard_locale_LDADD = $(LDADD) $(LIB_SETLOCALE) @LIB_HARD_LOCALE@
index 52e4c60d59e8daac9be987f1c77e06d209f1fd50..70d5cfd551849103b424a53f2dba7496cb33e689 100644 (file)
@@ -7,3 +7,4 @@ configure.ac:
 
 Makefile.am:
 noinst_PROGRAMS += test-localcharset
+test_localcharset_LDADD = $(LDADD) $(LIB_SETLOCALE)
index 4940965d03d1226ac63819ee0e6058bafcbd9e25..4b9a28a65c2475bc069b25c6d7bd1c8f73fe6247 100644 (file)
@@ -15,5 +15,5 @@ AC_CHECK_FUNCS_ONCE([newlocale])
 Makefile.am:
 TESTS += test-localename
 check_PROGRAMS += test-localename
-test_localename_LDADD = $(LDADD) @INTL_MACOSX_LIBS@ $(LIBTHREAD)
+test_localename_LDADD = $(LDADD) $(LIB_SETLOCALE) @INTL_MACOSX_LIBS@ $(LIBTHREAD)
 
index 29c8cf68fe38b100a54f1dbc395d98221b4ef1f9..16a11231c24639cb18e3cb8dafd61bf068e21d87 100644 (file)
@@ -25,4 +25,4 @@ TESTS_ENVIRONMENT += \
   LOCALE_FR_UTF8='@LOCALE_FR_UTF8@' \
   LOCALE_TR_UTF8='@LOCALE_TR_UTF8@'
 check_PROGRAMS += test-mbmemcasecmp
-test_mbmemcasecmp_LDADD = $(LDADD) $(LIBTHREAD)
+test_mbmemcasecmp_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBTHREAD)
index fb308d993d43c8d22a0a16cb1d842147465eb06b..56a3db0af2f6d3936d778c622cfbb69e473afddc 100644 (file)
@@ -25,4 +25,4 @@ TESTS_ENVIRONMENT += \
   LOCALE_FR_UTF8='@LOCALE_FR_UTF8@' \
   LOCALE_TR_UTF8='@LOCALE_TR_UTF8@'
 check_PROGRAMS += test-mbmemcasecoll
-test_mbmemcasecoll_LDADD = $(LDADD) $(LIBTHREAD)
+test_mbmemcasecoll_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBTHREAD)
index a2839cbd72aa9e68c8d5f86930e68d15310c110b..86008d867d76efd544508796d83327427c60ce62 100644 (file)
@@ -41,4 +41,4 @@ TESTS_ENVIRONMENT += \
   LOCALE_JA='@LOCALE_JA@' \
   LOCALE_ZH_CN='@LOCALE_ZH_CN@'
 check_PROGRAMS += test-mbrtowc test-mbrtowc-w32
-test_mbrtowc_LDADD = $(LDADD) $(LIBTHREAD)
+test_mbrtowc_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBTHREAD)
index 8548050dd681703a528e2ba5037ca98bfaa5d977..9f77064c3b17a2d102c4e06c5ce17f223477462f 100644 (file)
@@ -15,4 +15,4 @@ Makefile.am:
 TESTS += test-mbscasecmp.sh
 TESTS_ENVIRONMENT += LOCALE_TR_UTF8='@LOCALE_TR_UTF8@'
 check_PROGRAMS += test-mbscasecmp
-test_mbscasecmp_LDADD = $(LDADD) $(LIBTHREAD)
+test_mbscasecmp_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBTHREAD)
index bc2df73cc78097585695ca24f51c32ba968ded08..3395c1fd8cb78051059fde9b24e76a61a3302196 100644 (file)
@@ -25,6 +25,6 @@ TESTS += test-mbscasestr1 test-mbscasestr2.sh test-mbscasestr3.sh test-mbscasest
 TESTS_ENVIRONMENT += LOCALE_FR_UTF8='@LOCALE_FR_UTF8@' LOCALE_TR_UTF8='@LOCALE_TR_UTF8@' LOCALE_ZH_CN='@LOCALE_ZH_CN@'
 check_PROGRAMS += test-mbscasestr1 test-mbscasestr2 test-mbscasestr3 test-mbscasestr4
 test_mbscasestr1_LDADD = $(LDADD) $(LIBTHREAD)
-test_mbscasestr2_LDADD = $(LDADD) $(LIBTHREAD)
-test_mbscasestr3_LDADD = $(LDADD) $(LIBTHREAD)
-test_mbscasestr4_LDADD = $(LDADD) $(LIBTHREAD)
+test_mbscasestr2_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBTHREAD)
+test_mbscasestr3_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBTHREAD)
+test_mbscasestr4_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBTHREAD)
index f04e03c5d436265eb8801038a21ac8f7c1af8264..33ee83fdcf694f85ba23d463a9daddab73af1766 100644 (file)
@@ -15,4 +15,4 @@ Makefile.am:
 TESTS += test-mbschr.sh
 TESTS_ENVIRONMENT += LOCALE_ZH_CN='@LOCALE_ZH_CN@'
 check_PROGRAMS += test-mbschr
-test_mbschr_LDADD = $(LDADD) $(LIBTHREAD)
+test_mbschr_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBTHREAD)
index a6eada177b637e6b3b90be8beeaae06f9190e53b..8c4a3d154dad6d9f3f5a4e8b7a50ce40834e1f29 100644 (file)
@@ -15,4 +15,4 @@ Makefile.am:
 TESTS += test-mbscspn.sh
 TESTS_ENVIRONMENT += LOCALE_FR_UTF8='@LOCALE_FR_UTF8@'
 check_PROGRAMS += test-mbscspn
-test_mbscspn_LDADD = $(LDADD) $(LIBTHREAD)
+test_mbscspn_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBTHREAD)
index e509efed3f815e5943ddd9b89a14c090992116ff..0674e9c610644dfeedc42f63c387b3f030256d97 100644 (file)
@@ -17,4 +17,4 @@ Makefile.am:
 TESTS += test-mbsinit.sh
 TESTS_ENVIRONMENT += LOCALE_FR_UTF8='@LOCALE_FR_UTF8@'
 check_PROGRAMS += test-mbsinit
-test_mbsinit_LDADD = $(LDADD) $(LIBTHREAD)
+test_mbsinit_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBTHREAD)
index ad04325bd9c18ba82bedd2dbf76f3fee67aba991..050201a5c2400e48ecdd29e0dde5683a85c8cde1 100644 (file)
@@ -15,4 +15,4 @@ Makefile.am:
 TESTS += test-mbsncasecmp.sh
 TESTS_ENVIRONMENT += LOCALE_TR_UTF8='@LOCALE_TR_UTF8@'
 check_PROGRAMS += test-mbsncasecmp
-test_mbsncasecmp_LDADD = $(LDADD) $(LIBTHREAD)
+test_mbsncasecmp_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBTHREAD)
index ac67c854bb0c9a7b5758b69fade32f54295bb565..4d90f17a81d72de1860fe9f7883ea7c70491a2c6 100644 (file)
@@ -31,4 +31,4 @@ TESTS_ENVIRONMENT += \
   LOCALE_JA='@LOCALE_JA@' \
   LOCALE_ZH_CN='@LOCALE_ZH_CN@'
 check_PROGRAMS += test-mbsnrtowcs
-test_mbsnrtowcs_LDADD = $(LDADD) $(LIBTHREAD)
+test_mbsnrtowcs_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBTHREAD)
index 587ff5dcc3c0a1c642e7664ea03e283c4c0d16d4..902e5b39c5466600a1e63876974989080f26c9ec 100644 (file)
@@ -15,4 +15,4 @@ Makefile.am:
 TESTS += test-mbspbrk.sh
 TESTS_ENVIRONMENT += LOCALE_FR_UTF8='@LOCALE_FR_UTF8@'
 check_PROGRAMS += test-mbspbrk
-test_mbspbrk_LDADD = $(LDADD) $(LIBTHREAD)
+test_mbspbrk_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBTHREAD)
index e1b87c36a2dbcef5d945e064a5155ba3db6ec41e..e6f11ffa4dffad664fccef63f9340f2e212c4241 100644 (file)
@@ -15,4 +15,4 @@ Makefile.am:
 TESTS += test-mbspcasecmp.sh
 TESTS_ENVIRONMENT += LOCALE_TR_UTF8='@LOCALE_TR_UTF8@'
 check_PROGRAMS += test-mbspcasecmp
-test_mbspcasecmp_LDADD = $(LDADD) $(LIBTHREAD)
+test_mbspcasecmp_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBTHREAD)
index 326d566d6fb85c683e8fdfa4c9becd1d1af67c1e..1d9780426d00bf615ed8295509b5b223b013a720 100644 (file)
@@ -15,4 +15,4 @@ Makefile.am:
 TESTS += test-mbsrchr.sh
 TESTS_ENVIRONMENT += LOCALE_ZH_CN='@LOCALE_ZH_CN@'
 check_PROGRAMS += test-mbsrchr
-test_mbsrchr_LDADD = $(LDADD) $(LIBTHREAD)
+test_mbsrchr_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBTHREAD)
index 24dfa3f78b6000418e6d6cab1e7be4dd73663bea..3de9d73f6170e71700149de74b8d0036963f1bbb 100644 (file)
@@ -31,4 +31,4 @@ TESTS_ENVIRONMENT += \
   LOCALE_JA='@LOCALE_JA@' \
   LOCALE_ZH_CN='@LOCALE_ZH_CN@'
 check_PROGRAMS += test-mbsrtowcs
-test_mbsrtowcs_LDADD = $(LDADD) $(LIBTHREAD)
+test_mbsrtowcs_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBTHREAD)
index 8a5fe23396a4410aca71afeb0bd3f3b60a1ec3f5..994a7062e6de5eafce3a84da4a5dd2991fdad251 100644 (file)
@@ -15,4 +15,4 @@ Makefile.am:
 TESTS += test-mbsspn.sh
 TESTS_ENVIRONMENT += LOCALE_FR_UTF8='@LOCALE_FR_UTF8@'
 check_PROGRAMS += test-mbsspn
-test_mbsspn_LDADD = $(LDADD) $(LIBTHREAD)
+test_mbsspn_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBTHREAD)
index a0a878b1f0192d18d41ef007b400466e681c3b3a..739e51deec92a8e1373e6c783788294b6695ca7b 100644 (file)
@@ -21,5 +21,5 @@ TESTS += test-mbsstr1 test-mbsstr2.sh test-mbsstr3.sh
 TESTS_ENVIRONMENT += LOCALE_FR_UTF8='@LOCALE_FR_UTF8@' LOCALE_ZH_CN='@LOCALE_ZH_CN@'
 check_PROGRAMS += test-mbsstr1 test-mbsstr2 test-mbsstr3
 test_mbsstr1_LDADD = $(LDADD) $(LIBTHREAD)
-test_mbsstr2_LDADD = $(LDADD) $(LIBTHREAD)
-test_mbsstr3_LDADD = $(LDADD) $(LIBTHREAD)
+test_mbsstr2_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBTHREAD)
+test_mbsstr3_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBTHREAD)
index db0a57d1dee9815ad8c028813c673d45474a31f5..9474bbd86f6502608549e2f1d7cad06884fe2369 100644 (file)
@@ -20,4 +20,4 @@ Makefile.am:
 TESTS += test-nl_langinfo.sh test-nl_langinfo-mt
 TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@' LOCALE_FR_UTF8='@LOCALE_FR_UTF8@'
 check_PROGRAMS += test-nl_langinfo test-nl_langinfo-mt
-test_nl_langinfo_mt_LDADD = $(LDADD) $(LIBMULTITHREAD) $(LIB_NANOSLEEP)
+test_nl_langinfo_mt_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBMULTITHREAD) $(LIB_NANOSLEEP)
index 61aa27ce74c58f1f435323c05b6963c370e09c1a..486956affcaf82e4f7c0ae31b091e3ca240e4836 100644 (file)
@@ -27,4 +27,4 @@ Makefile.am:
 TESTS += test-quotearg.sh
 TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@' LOCALE_FR_UTF8='@LOCALE_FR_UTF8@'
 check_PROGRAMS += test-quotearg
-test_quotearg_LDADD = $(LDADD) @LIBINTL@ $(LIBTHREAD)
+test_quotearg_LDADD = $(LDADD) $(LIB_SETLOCALE) @LIBINTL@ $(LIBTHREAD)
index 0782303655d3555766e643e5eeb2b54a5b6c9619..e8821ec52d8a82b6176c9ce95f9fb3d849b253fe 100644 (file)
@@ -11,4 +11,4 @@ configure.ac:
 Makefile.am:
 TESTS += test-regex
 check_PROGRAMS += test-regex
-test_regex_LDADD = $(LDADD) @LIBINTL@ $(LIBTHREAD)
+test_regex_LDADD = $(LDADD) $(LIB_SETLOCALE) @LIBINTL@ $(LIBTHREAD)
index 5d5ed81dcac4fd4c78c6b5c0ef60ad9ba05ce092..cc92e1a8bc9a76fb5b3cdf2aa6eaed5d27513732 100644 (file)
@@ -7,7 +7,8 @@ m4/setlocale.m4
 
 Depends-on:
 locale
-localename      [test $REPLACE_SETLOCALE = 1]
+localename      [test $NEED_SETLOCALE_IMPROVED = 1]
+setlocale-null  [test $NEED_SETLOCALE_MTSAFE = 1]
 
 configure.ac:
 gl_FUNC_SETLOCALE
@@ -22,6 +23,9 @@ Makefile.am:
 Include:
 <locale.h>
 
+Link:
+$(LIB_SETLOCALE)
+
 License:
 LGPL
 
index 8c35c9d82c3b64de2bed1b1b8267e56a1ede16c4..25129f92ef700171b36e6ff3d68d9b05dc7f83da 100644 (file)
@@ -27,3 +27,5 @@ TESTS_ENVIRONMENT += \
   LOCALE_JA='@LOCALE_JA@' \
   LOCALE_ZH_CN='@LOCALE_ZH_CN@'
 check_PROGRAMS += test-setlocale1 test-setlocale2
+test_setlocale1_LDADD = $(LDADD) @LIB_SETLOCALE@
+test_setlocale2_LDADD = $(LDADD) @LIB_SETLOCALE@
index 871962c6f9687305ad3e4c9ccebaef9437a04626..cf2d6a2fa3505579243b04abdc6147a66cebfc58 100644 (file)
@@ -10,3 +10,4 @@ configure.ac:
 Makefile.am:
 TESTS += test-strfmon_l
 check_PROGRAMS += test-strfmon_l
+test_strfmon_l_LDADD = $(LDADD) $(LIB_SETLOCALE)
index e3cd57f66e03ab982bd60debcf1e14e0d92e7216..03966580f9368338605a8ad82e2d5429ce7c60c0 100644 (file)
@@ -26,3 +26,4 @@ TESTS_ENVIRONMENT += \
   LOCALE_FR='@LOCALE_FR@' \
   LOCALE_FR_UTF8='@LOCALE_FR_UTF8@'
 check_PROGRAMS += test-strtod1
+test_strtod1_LDADD = $(LDADD) $(LIB_SETLOCALE)
index c58e52c2ab6da671b5387664719aa684ded06ea1..dc82f50a086301d56aa7d4339b1fe9c158c3c38f 100644 (file)
@@ -26,3 +26,4 @@ TESTS_ENVIRONMENT += \
   LOCALE_FR='@LOCALE_FR@' \
   LOCALE_FR_UTF8='@LOCALE_FR_UTF8@'
 check_PROGRAMS += test-strtold1
+test_strtold1_LDADD = $(LDADD) $(LIB_SETLOCALE)
index 2cf5926963507c946e94525b4478a34207e5dabb..1399e526928cd96dd80713b82075c111b0aee726 100644 (file)
@@ -23,4 +23,4 @@ TESTS += unicase/test-locale-language.sh
 TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@' LOCALE_FR_UTF8='@LOCALE_FR_UTF8@' LOCALE_JA='@LOCALE_JA@' LOCALE_TR_UTF8='@LOCALE_TR_UTF8@' LOCALE_ZH_CN='@LOCALE_ZH_CN@'
 check_PROGRAMS += test-locale-language
 test_locale_language_SOURCES = unicase/test-locale-language.c
-test_locale_language_LDADD = $(LDADD) $(LIBUNISTRING) @INTL_MACOSX_LIBS@ $(LIBTHREAD)
+test_locale_language_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBUNISTRING) @INTL_MACOSX_LIBS@ $(LIBTHREAD)
index 0d78fbe256b67f92f4ff1a04f1f4fdb1d8caee86..08a8620d5f2a1183d7d10e0f9d5d50403a49b427 100644 (file)
@@ -22,5 +22,5 @@ TESTS_ENVIRONMENT += \
   LOCALE_FR_UTF8='@LOCALE_FR_UTF8@'
 check_PROGRAMS += test-ulc-casecmp
 test_ulc_casecmp_SOURCES = unicase/test-ulc-casecmp.c
-test_ulc_casecmp_LDADD = $(LDADD) $(LIBUNISTRING) @LIBICONV@
+test_ulc_casecmp_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBUNISTRING) @LIBICONV@
 
index bd2e59b82dbb58b877ed31216d23098b47e57297..16108726515e97bd78f7f3cedea8800aa9e2b3e3 100644 (file)
@@ -22,5 +22,5 @@ TESTS_ENVIRONMENT += \
   LOCALE_FR_UTF8='@LOCALE_FR_UTF8@'
 check_PROGRAMS += test-ulc-casecoll
 test_ulc_casecoll_SOURCES = unicase/test-ulc-casecoll.c
-test_ulc_casecoll_LDADD = $(LDADD) $(LIBUNISTRING) @LIBICONV@
+test_ulc_casecoll_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBUNISTRING) @LIBICONV@
 
index 187e26f05b46a5e90628218ebff0229f79bc5081..a6dacd000160b46959e3f59835ca33e11b879b3b 100644 (file)
@@ -16,4 +16,4 @@ TESTS += unigbrk/test-ulc-grapheme-breaks.sh
 TESTS_ENVIRONMENT += LOCALE_AR='@LOCALE_AR@'
 check_PROGRAMS += test-ulc-grapheme-breaks
 test_ulc_grapheme_breaks_SOURCES = unigbrk/test-ulc-grapheme-breaks.c
-test_ulc_grapheme_breaks_LDADD = $(LDADD) $(LIBUNISTRING) @LIBICONV@
+test_ulc_grapheme_breaks_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBUNISTRING) @LIBICONV@
index 3dc3cb008341fe753d32ad852b26be5420f67e6a..45e3ab22003b84c4dc47fd488f32c0370f3bd18f 100644 (file)
@@ -28,6 +28,6 @@ check_PROGRAMS += test-u16-vasnprintf1 test-u16-vasnprintf2 test-u16-vasnprintf3
 test_u16_vasnprintf1_SOURCES = unistdio/test-u16-vasnprintf1.c
 test_u16_vasnprintf1_LDADD = $(LDADD) $(LIBUNISTRING) @LIBICONV@
 test_u16_vasnprintf2_SOURCES = unistdio/test-u16-vasnprintf2.c
-test_u16_vasnprintf2_LDADD = $(LDADD) $(LIBUNISTRING) @LIBICONV@
+test_u16_vasnprintf2_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBUNISTRING) @LIBICONV@
 test_u16_vasnprintf3_SOURCES = unistdio/test-u16-vasnprintf3.c
-test_u16_vasnprintf3_LDADD = $(LDADD) $(LIBUNISTRING) @LIBICONV@
+test_u16_vasnprintf3_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBUNISTRING) @LIBICONV@
index 555319b4a128bc8236e15821db70535f4a80dd4d..7343c328e65b15ec465c7132da2df20d4662d1ed 100644 (file)
@@ -28,6 +28,6 @@ check_PROGRAMS += test-u32-vasnprintf1 test-u32-vasnprintf2 test-u32-vasnprintf3
 test_u32_vasnprintf1_SOURCES = unistdio/test-u32-vasnprintf1.c
 test_u32_vasnprintf1_LDADD = $(LDADD) $(LIBUNISTRING) @LIBICONV@
 test_u32_vasnprintf2_SOURCES = unistdio/test-u32-vasnprintf2.c
-test_u32_vasnprintf2_LDADD = $(LDADD) $(LIBUNISTRING) @LIBICONV@
+test_u32_vasnprintf2_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBUNISTRING) @LIBICONV@
 test_u32_vasnprintf3_SOURCES = unistdio/test-u32-vasnprintf3.c
-test_u32_vasnprintf3_LDADD = $(LDADD) $(LIBUNISTRING) @LIBICONV@
+test_u32_vasnprintf3_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBUNISTRING) @LIBICONV@
index 8d5e29512d52b7fd74e1256cf6b9216b584efaf5..70c98203264e5d66900a7852861444a01efd38a8 100644 (file)
@@ -28,6 +28,6 @@ check_PROGRAMS += test-u8-vasnprintf1 test-u8-vasnprintf2 test-u8-vasnprintf3
 test_u8_vasnprintf1_SOURCES = unistdio/test-u8-vasnprintf1.c
 test_u8_vasnprintf1_LDADD = $(LDADD) $(LIBUNISTRING) @LIBICONV@
 test_u8_vasnprintf2_SOURCES = unistdio/test-u8-vasnprintf2.c
-test_u8_vasnprintf2_LDADD = $(LDADD) $(LIBUNISTRING) @LIBICONV@
+test_u8_vasnprintf2_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBUNISTRING) @LIBICONV@
 test_u8_vasnprintf3_SOURCES = unistdio/test-u8-vasnprintf3.c
-test_u8_vasnprintf3_LDADD = $(LDADD) $(LIBUNISTRING) @LIBICONV@
+test_u8_vasnprintf3_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBUNISTRING) @LIBICONV@
index b72c1888a77adf438aae5e82d6d1b62c2b919ee2..0af236161dd2c5c94425422d1d498b5b79b712e2 100644 (file)
@@ -24,6 +24,6 @@ check_PROGRAMS += test-ulc-vasnprintf1 test-ulc-vasnprintf2 test-ulc-vasnprintf3
 test_ulc_vasnprintf1_SOURCES = unistdio/test-ulc-vasnprintf1.c
 test_ulc_vasnprintf1_LDADD = $(LDADD) $(LIBUNISTRING) @LIBICONV@ $(LIBTHREAD)
 test_ulc_vasnprintf2_SOURCES = unistdio/test-ulc-vasnprintf2.c
-test_ulc_vasnprintf2_LDADD = $(LDADD) $(LIBUNISTRING) @LIBICONV@ $(LIBTHREAD)
+test_ulc_vasnprintf2_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBUNISTRING) @LIBICONV@ $(LIBTHREAD)
 test_ulc_vasnprintf3_SOURCES = unistdio/test-ulc-vasnprintf3.c
-test_ulc_vasnprintf3_LDADD = $(LDADD) $(LIBUNISTRING) @LIBICONV@ $(LIBTHREAD)
+test_ulc_vasnprintf3_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBUNISTRING) @LIBICONV@ $(LIBTHREAD)
index 19f1ee681136619d89a59117c5a54df55102d84f..cfb866b503bda0164872c74b76488b084624e519 100644 (file)
@@ -16,5 +16,5 @@ TESTS += uniwbrk/test-ulc-wordbreaks.sh
 TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@'
 check_PROGRAMS += test-ulc-wordbreaks
 test_ulc_wordbreaks_SOURCES = uniwbrk/test-ulc-wordbreaks.c
-test_ulc_wordbreaks_LDADD = $(LDADD) $(LIBUNISTRING) @LIBICONV@
+test_ulc_wordbreaks_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBUNISTRING) @LIBICONV@
 
index 6ba745bf14b7b188520ef305545d9bc134cb1c15..2ea2791ddfeab06b639bb79dc7a2bbe94d87f561 100644 (file)
@@ -24,3 +24,5 @@ Makefile.am:
 TESTS += test-vasnprintf-posix test-vasnprintf-posix2.sh test-vasnprintf-posix3
 TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@' LOCALE_FR_UTF8='@LOCALE_FR_UTF8@'
 check_PROGRAMS += test-vasnprintf-posix test-vasnprintf-posix2 test-vasnprintf-posix3
+test_vasnprintf_posix2_LDADD = $(LDADD) $(LIB_SETLOCALE)
+test_vasnprintf_posix3_LDADD = $(LDADD) $(LIB_SETLOCALE)
index 32f9d3a7f079ac0caf5ea95e8b008cafbdaf726c..43c28e8d531b639b4a744f2c8f8dc52550f6eab5 100644 (file)
@@ -35,4 +35,4 @@ TESTS_ENVIRONMENT += \
   LOCALE_JA='@LOCALE_JA@' \
   LOCALE_ZH_CN='@LOCALE_ZH_CN@'
 check_PROGRAMS += test-wcrtomb test-wcrtomb-w32
-
+test_wcrtomb_LDADD = $(LDADD) $(LIB_SETLOCALE)
index 877dd17584543882efad2d0ec2a2b58ccf7ce75a..adeda4e9d1264361403cdeb9feb7b73985df7d4c 100644 (file)
@@ -28,4 +28,4 @@ TESTS_ENVIRONMENT += \
   LOCALE_JA='@LOCALE_JA@' \
   LOCALE_ZH_CN='@LOCALE_ZH_CN@'
 check_PROGRAMS += test-wcsnrtombs
-
+test_wcsnrtombs_LDADD = $(LDADD) $(LIB_SETLOCALE)
index 4b6bf5417240879bf9a3c023a97112a1914bf957..2f52f68b2095a9994575ff3f4ba555a09c4a1a92 100644 (file)
@@ -28,4 +28,4 @@ TESTS_ENVIRONMENT += \
   LOCALE_JA='@LOCALE_JA@' \
   LOCALE_ZH_CN='@LOCALE_ZH_CN@'
 check_PROGRAMS += test-wcsrtombs
-
+test_wcsrtombs_LDADD = $(LDADD) $(LIB_SETLOCALE)
index 9606674b900e22e1548b57371b668d112c377d72..875d18f8d3ad0a24db7be2d73ba7a9bc93092556 100644 (file)
@@ -12,4 +12,4 @@ configure.ac:
 Makefile.am:
 TESTS += test-wcwidth
 check_PROGRAMS += test-wcwidth
-test_wcwidth_LDADD = $(LDADD) $(LIBUNISTRING)
+test_wcwidth_LDADD = $(LDADD) $(LIB_SETLOCALE) $(LIBUNISTRING)
index ac587ad252aac34abc62ccff5b135a0568bf4339..52f50f854ed7c66a7923378dcd460b87d0d2545f 100644 (file)
 #include <stdio.h>
 #include <stdlib.h>
 
+/* We want to use the system's setlocale() function here, not the gnulib
+   override.  */
+#undef setlocale
+
 /* Specification:
    <https://pubs.opengroup.org/onlinepubs/9699919799/utilities/locale.html>
    Here we implement only the invocation without any command-line options.  */
index b3ebb13ab96af77ee1fb9da5c3b3915e6812203c..45eb27edd55aa73e2b705f0cf089545327c27403 100644 (file)
 
 #include "glthread/thread.h"
 
+/* We want to use the system's setlocale() function here, not the gnulib
+   override.  */
+#undef setlocale
+
 
 /* Some common locale names.  */
 
index 1aa5eaa49e1c01c42082c779e58faea3d8c7dfb9..9e9bc12e8e91731b20302c1b48a9a05db647428c 100644 (file)
 
 #include "glthread/thread.h"
 
+/* We want to use the system's setlocale() function here, not the gnulib
+   override.  */
+#undef setlocale
+
 
 /* Some common locale names.  */