Initialize locale object even in unthreaded perls
authorKarl Williamson <khw@cpan.org>
Tue, 25 Jul 2017 18:46:00 +0000 (12:46 -0600)
committerKarl Williamson <khw@cpan.org>
Sun, 13 Aug 2017 04:53:11 +0000 (22:53 -0600)
This commit will now initialize the thread-safe C locale object if the
POSIX 2008 functions are available, regardless of whether the perl is
threaded or not.  This will allow for a future commit that uses
them, and which is a win on unthreaded builds.

makedef.pl
perl.c
perl.h
perlvars.h

index 6e9ea5f..2af197f 100644 (file)
@@ -399,8 +399,7 @@ unless ($define{'USE_ITHREADS'}) {
                         );
 }
 
-unless (   $define{'USE_ITHREADS'}
-        && $define{'HAS_NEWLOCALE'})
+unless ($define{'HAS_NEWLOCALE'} && ! $define{'NO_POSIX_2008_LOCALE'})
 {
     ++$skip{$_} foreach qw(
         PL_C_locale_obj
diff --git a/perl.c b/perl.c
index 6525f46..3ef2cb0 100644 (file)
--- a/perl.c
+++ b/perl.c
@@ -456,7 +456,7 @@ perl_construct(pTHXx)
     PL_WB_invlist = _new_invlist_C_array(_Perl_WB_invlist);
     PL_LB_invlist = _new_invlist_C_array(_Perl_LB_invlist);
     PL_Assigned_invlist = _new_invlist_C_array(Assigned_invlist);
-#ifdef USE_POSIX_2008_LOCALE
+#ifdef HAS_POSIX_2008_LOCALE
     PL_C_locale_obj = newlocale(LC_ALL_MASK, "C", NULL);
 #endif
 
diff --git a/perl.h b/perl.h
index 46ac02a..f9d7dd0 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -5889,8 +5889,8 @@ typedef struct am_table_short AMTS;
 #ifdef USE_LOCALE
 /* These locale things are all subject to change */
 
-#  if      defined(USE_ITHREADS)                \
-      &&   defined(HAS_NEWLOCALE)               \
+
+#  if      defined(HAS_NEWLOCALE)               \
       &&   defined(LC_ALL_MASK)                 \
       &&   defined(HAS_FREELOCALE)              \
       &&   defined(HAS_USELOCALE)               \
@@ -5900,16 +5900,16 @@ typedef struct am_table_short AMTS;
      * enough to have the Posix 2008 locale functions has LC_ALL.  The test
      * above makes sure that assumption is valid */
 
-#    define USE_POSIX_2008_LOCALE
+#    define HAS_POSIX_2008_LOCALE
 #  endif
 
-#   define LOCALE_INIT   MUTEX_INIT(&PL_locale_mutex)
-
-#   ifdef USE_POSIX_2008_LOCALE
-#       define USE_THREAD_SAFE_LOCALE
-#       define LOCALE_TERM                                                  \
+/* We create a C locale object unconditionally if we have the functions to do
+ * so; hence must destroy it unconditionally at the end */
+#  ifndef HAS_POSIX_2008_LOCALE
+#    define _LOCALE_TERM_POSIX_2008  NOOP
+#  else
+#    define _LOCALE_TERM_POSIX_2008                                         \
                     STMT_START {                                            \
-                        MUTEX_DESTROY(&PL_locale_mutex);                    \
                         if (PL_C_locale_obj) {                              \
                             /* Make sure we aren't using the locale         \
                              * space we are about to free */                \
@@ -5917,13 +5917,28 @@ typedef struct am_table_short AMTS;
                             freelocale(PL_C_locale_obj);                    \
                             PL_C_locale_obj = (locale_t) NULL;              \
                         }                                                   \
-                     } STMT_END
-#   else
-#       define LOCALE_TERM   MUTEX_DESTROY(&PL_locale_mutex)
-#   endif
-
-#   define LOCALE_LOCK   MUTEX_LOCK(&PL_locale_mutex)
-#   define LOCALE_UNLOCK MUTEX_UNLOCK(&PL_locale_mutex)
+                    } STMT_END
+#  endif
+
+#  ifndef USE_ITHREADS
+#    define LOCALE_INIT
+#    define LOCALE_LOCK
+#    define LOCALE_UNLOCK
+#    define LOCALE_TERM  STMT_START { _LOCALE_TERM_POSIX_2008; } STMT_END
+#  else /* Below is do use threads */
+#    define LOCALE_INIT         MUTEX_INIT(&PL_locale_mutex)
+#    define LOCALE_LOCK         MUTEX_LOCK(&PL_locale_mutex)
+#    define LOCALE_UNLOCK       MUTEX_UNLOCK(&PL_locale_mutex)
+#    define LOCALE_TERM                                                     \
+                    STMT_START {                                            \
+                        MUTEX_DESTROY(&PL_locale_mutex);                    \
+                        _LOCALE_TERM_POSIX_2008;                            \
+                    } STMT_END
+#    ifdef HAS_POSIX_2008_LOCALE
+#      define USE_POSIX_2008_LOCALE
+#      define USE_THREAD_SAFE_LOCALE
+#    endif
+#  endif
 
 /* Returns TRUE if the plain locale pragma without a parameter is in effect
  */
index bdc8467..b184b89 100644 (file)
@@ -101,10 +101,11 @@ PERLVARI(G, mmap_page_size, IV, 0)
 PERLVAR(G, hints_mutex, perl_mutex)    /* Mutex for refcounted he refcounting */
 PERLVAR(G, locale_mutex, perl_mutex)   /* Mutex for setlocale() changing */
 
-#   ifdef HAS_NEWLOCALE
-PERLVAR(G, C_locale_obj, locale_t)
-#   endif
+#endif
 
+/* Proxy for HAS_POSIX_2008_LOCALE, since that is not defined in time for this */
+#if defined(HAS_NEWLOCALE) && ! defined(NO_POSIX_2008_LOCALE)
+PERLVAR(G, C_locale_obj, locale_t)
 #endif
 
 #ifdef DEBUGGING