This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
perl.h: Add ENV_LOCALE (UN)?LOCK macros
authorKarl Williamson <khw@cpan.org>
Mon, 16 Mar 2020 03:33:19 +0000 (21:33 -0600)
committerKarl Williamson <khw@cpan.org>
Thu, 19 Mar 2020 00:05:49 +0000 (18:05 -0600)
These are eventually intended to lock both the environment and locale
mutexes, but it is too late in the current development cycle to do that.
Instead these are, for now, equivalent to a plain ENV mutex.
(On many modern platforms, the locale mutex is a no-op, so not doing it
is not actually a problem.)

In the meantime, this gives significant better thread safety than what
has been in effect.

perl.h

diff --git a/perl.h b/perl.h
index c734548..79ef068 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -2923,6 +2923,21 @@ typedef struct padname PADNAME;
 #  define ENV_TERM       NOOP;
 #endif
 
+/* Some critical sections need to lock both the locale and the environment.
+ * XXX khw intends to change this to lock both mutexes, but that brings up
+ * issues of potential deadlock, so should be done at the beginning of a
+ * development cycle.  So for now, it just locks the environment.  Note that
+ * many modern platforms are locale-thread-safe anyway, so locking the locale
+ * mutex is a no-op anyway */
+#define ENV_LOCALE_LOCK     ENV_LOCK
+#define ENV_LOCALE_UNLOCK   ENV_UNLOCK
+
+/* And some critical sections care only that no one else is writing either the
+ * locale nor the environment.  XXX Again this is for the future.  This can be
+ * simulated with using COND_WAIT in thread.h */
+#define ENV_LOCALE_READ_LOCK     ENV_LOCALE_LOCK
+#define ENV_LOCALE_READ_UNLOCK   ENV_LOCALE_UNLOCK
+
 #if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
     /* having sigaction(2) means that the OS supports both 1-arg and 3-arg
      * signal handlers. But the perl core itself only fully supports 1-arg