mirror of
https://github.com/python/cpython.git
synced 2026-02-13 19:04:37 +00:00
[3.13] gh-137093: Fix race condition in test_embed.test_bpo20891 (GH-137094) (GH-140524) (#140527)
[3.14] gh-137093: Fix race condition in `test_embed.test_bpo20891` (GH-137094) (GH-140524) Use a `PyEvent` instead of a lock to fix a race on the free-threaded build. (cherry picked from commit9b451fb457) (cherry picked from commit6efd78d7ab) Co-authored-by: Kumar Aditya <kumaraditya@python.org> Co-authored-by: Peter Bierma <zintensitydev@gmail.com>
This commit is contained in:
parent
1cc2c954d6
commit
050b9dda04
1 changed files with 6 additions and 17 deletions
|
|
@ -412,9 +412,9 @@ static int test_pre_initialization_sys_options(void)
|
|||
|
||||
|
||||
/* bpo-20891: Avoid race condition when initialising the GIL */
|
||||
static void bpo20891_thread(void *lockp)
|
||||
static void bpo20891_thread(void *eventp)
|
||||
{
|
||||
PyThread_type_lock lock = *((PyThread_type_lock*)lockp);
|
||||
PyEvent *event = (PyEvent *)eventp;
|
||||
|
||||
PyGILState_STATE state = PyGILState_Ensure();
|
||||
if (!PyGILState_Check()) {
|
||||
|
|
@ -423,8 +423,7 @@ static void bpo20891_thread(void *lockp)
|
|||
}
|
||||
|
||||
PyGILState_Release(state);
|
||||
|
||||
PyThread_release_lock(lock);
|
||||
_PyEvent_Notify(event);
|
||||
}
|
||||
|
||||
static int test_bpo20891(void)
|
||||
|
|
@ -434,27 +433,17 @@ static int test_bpo20891(void)
|
|||
|
||||
/* bpo-20891: Calling PyGILState_Ensure in a non-Python thread must not
|
||||
crash. */
|
||||
PyThread_type_lock lock = PyThread_allocate_lock();
|
||||
if (!lock) {
|
||||
error("PyThread_allocate_lock failed!");
|
||||
return 1;
|
||||
}
|
||||
|
||||
_testembed_Py_InitializeFromConfig();
|
||||
PyEvent event = {0};
|
||||
|
||||
unsigned long thrd = PyThread_start_new_thread(bpo20891_thread, &lock);
|
||||
unsigned long thrd = PyThread_start_new_thread(bpo20891_thread, &event);
|
||||
if (thrd == PYTHREAD_INVALID_THREAD_ID) {
|
||||
error("PyThread_start_new_thread failed!");
|
||||
return 1;
|
||||
}
|
||||
PyThread_acquire_lock(lock, WAIT_LOCK);
|
||||
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
/* wait until the thread exit */
|
||||
PyThread_acquire_lock(lock, WAIT_LOCK);
|
||||
Py_END_ALLOW_THREADS
|
||||
|
||||
PyThread_free_lock(lock);
|
||||
PyEvent_Wait(&event);
|
||||
|
||||
Py_Finalize();
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue