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

This commit is contained in:
AN Long 2024-03-01 07:04:16 +08:00 committed by GitHub
parent 6a95676bb5
commit ca56c3a172
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 12 additions and 3 deletions

View File

@ -0,0 +1 @@
Isolate :mod:`_lsprof` (apply :pep:`687`).

View File

@ -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}
};

View File

@ -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;
}

View File

@ -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 -

Can't render this file because it has a wrong number of fields in line 4.