diff options
Diffstat (limited to 'Python')
-rw-r--r-- | Python/thread_pthread.h | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index 40e2e117a2..e3497e7d59 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -694,6 +694,26 @@ PyThread_release_lock(PyThread_type_lock lock) #endif /* USE_SEMAPHORES */ int +_PyThread_at_fork_reinit(PyThread_type_lock *lock) +{ + PyThread_type_lock new_lock = PyThread_allocate_lock(); + if (new_lock == NULL) { + return -1; + } + + /* bpo-6721, bpo-40089: The old lock can be in an inconsistent state. + fork() can be called in the middle of an operation on the lock done by + another thread. So don't call PyThread_free_lock(*lock). + + Leak memory on purpose. Don't release the memory either since the + address of a mutex is relevant. Putting two mutexes at the same address + can lead to problems. */ + + *lock = new_lock; + return 0; +} + +int PyThread_acquire_lock(PyThread_type_lock lock, int waitflag) { return PyThread_acquire_lock_timed(lock, waitflag ? -1 : 0, /*intr_flag=*/0); |