https://github.com/python/cpython/commit/ca56c3a172e4ca08c278ddaf66ac2943a1d93288
commit: ca56c3a172e4ca08c278ddaf66ac2943a1d93288
branch: main
author: AN Long <[email protected]>
committer: erlend-aasland <[email protected]>
date: 2024-03-01T00:04:16+01:00
summary:

gh-103092: Add a mutex to make the PRNG state of rotatingtree concurrent-safe 
(#115301)

files:
A Misc/NEWS.d/next/Library/2024-02-12-11-42-48.gh-issue-103092.sGMKr0.rst
M Modules/_lsprof.c
M Modules/rotatingtree.c
M Tools/c-analyzer/cpython/globals-to-fix.tsv

diff --git 
a/Misc/NEWS.d/next/Library/2024-02-12-11-42-48.gh-issue-103092.sGMKr0.rst 
b/Misc/NEWS.d/next/Library/2024-02-12-11-42-48.gh-issue-103092.sGMKr0.rst
new file mode 100644
index 00000000000000..47701396c81737
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-02-12-11-42-48.gh-issue-103092.sGMKr0.rst
@@ -0,0 +1 @@
+Isolate :mod:`_lsprof` (apply :pep:`687`).
diff --git a/Modules/_lsprof.c b/Modules/_lsprof.c
index f1cee7cb6f66bf..a76c3dea555783 100644
--- a/Modules/_lsprof.c
+++ b/Modules/_lsprof.c
@@ -1005,9 +1005,7 @@ _lsprof_exec(PyObject *module)
 
 static PyModuleDef_Slot _lsprofslots[] = {
     {Py_mod_exec, _lsprof_exec},
-    // XXX gh-103092: fix isolation.
-    {Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED},
-    //{Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
+    {Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
     {0, NULL}
 };
 
diff --git a/Modules/rotatingtree.c b/Modules/rotatingtree.c
index 07e08bc3167c0a..217e495b3d2a9d 100644
--- a/Modules/rotatingtree.c
+++ b/Modules/rotatingtree.c
@@ -1,3 +1,9 @@
+#ifndef Py_BUILD_CORE_BUILTIN
+#  define Py_BUILD_CORE_MODULE 1
+#endif
+
+#include "Python.h"
+#include "pycore_lock.h"
 #include "rotatingtree.h"
 
 #define KEY_LOWER_THAN(key1, key2)  ((char*)(key1) < (char*)(key2))
@@ -10,17 +16,20 @@
 
 static unsigned int random_value = 1;
 static unsigned int random_stream = 0;
+static PyMutex random_mutex = {0};
 
 static int
 randombits(int bits)
 {
     int result;
+    PyMutex_Lock(&random_mutex);
     if (random_stream < (1U << bits)) {
         random_value *= 1082527;
         random_stream = random_value;
     }
     result = random_stream & ((1<<bits)-1);
     random_stream >>= bits;
+    PyMutex_Unlock(&random_mutex);
     return result;
 }
 
diff --git a/Tools/c-analyzer/cpython/globals-to-fix.tsv 
b/Tools/c-analyzer/cpython/globals-to-fix.tsv
index 45119664af4362..686a3d3160cc90 100644
--- a/Tools/c-analyzer/cpython/globals-to-fix.tsv
+++ b/Tools/c-analyzer/cpython/globals-to-fix.tsv
@@ -482,3 +482,4 @@ Modules/readline.c  -       sigwinch_ohandler       -
 Modules/readline.c     -       completed_input_string  -
 Modules/rotatingtree.c -       random_stream   -
 Modules/rotatingtree.c -       random_value    -
+Modules/rotatingtree.c -       random_mutex    -

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]

Reply via email to