diff options
author | AN Long <aisk@users.noreply.github.com> | 2024-02-29 23:04:16 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-29 23:04:16 (GMT) |
commit | ca56c3a172e4ca08c278ddaf66ac2943a1d93288 (patch) | |
tree | 679d69bc4e6855acc499abf542770bb19ef9d804 /Modules | |
parent | 6a95676bb526261434dd068d6c49927c44d24a9b (diff) | |
download | cpython-ca56c3a172e4ca08c278ddaf66ac2943a1d93288.zip cpython-ca56c3a172e4ca08c278ddaf66ac2943a1d93288.tar.gz cpython-ca56c3a172e4ca08c278ddaf66ac2943a1d93288.tar.bz2 |
gh-103092: Add a mutex to make the PRNG state of rotatingtree concurrent-safe (#115301)
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_lsprof.c | 4 | ||||
-rw-r--r-- | Modules/rotatingtree.c | 9 |
2 files changed, 10 insertions, 3 deletions
diff --git a/Modules/_lsprof.c b/Modules/_lsprof.c index f1cee7c..a76c3de 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 07e08bc..217e495 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; } |