mirror of
https://github.com/python/cpython.git
synced 2025-10-28 17:13:08 +00:00
gh-114271: Make _thread.ThreadHandle thread-safe in free-threaded builds (GH-115190)
Make `_thread.ThreadHandle` thread-safe in free-threaded builds We protect the mutable state of `ThreadHandle` using a `_PyOnceFlag`. Concurrent operations (i.e. `join` or `detach`) on `ThreadHandle` block until it is their turn to execute or an earlier operation succeeds. Once an operation has been applied successfully all future operations complete immediately. The `join()` method is now idempotent. It may be called multiple times but the underlying OS thread will only be joined once. After `join()` succeeds, any future calls to `join()` will succeed immediately. The internal thread handle `detach()` method has been removed.
This commit is contained in:
parent
5e0c7bc1d3
commit
9e88173d36
5 changed files with 230 additions and 106 deletions
|
|
@ -136,6 +136,10 @@ typedef struct {
|
|||
uint8_t v;
|
||||
} PyEvent;
|
||||
|
||||
// Check if the event is set without blocking. Returns 1 if the event is set or
|
||||
// 0 otherwise.
|
||||
PyAPI_FUNC(int) _PyEvent_IsSet(PyEvent *evt);
|
||||
|
||||
// Set the event and notify any waiting threads.
|
||||
// Export for '_testinternalcapi' shared extension
|
||||
PyAPI_FUNC(void) _PyEvent_Notify(PyEvent *evt);
|
||||
|
|
@ -149,6 +153,15 @@ PyAPI_FUNC(void) PyEvent_Wait(PyEvent *evt);
|
|||
// and 0 if the timeout expired or thread was interrupted.
|
||||
PyAPI_FUNC(int) PyEvent_WaitTimed(PyEvent *evt, PyTime_t timeout_ns);
|
||||
|
||||
// A one-time event notification with reference counting.
|
||||
typedef struct _PyEventRc {
|
||||
PyEvent event;
|
||||
Py_ssize_t refcount;
|
||||
} _PyEventRc;
|
||||
|
||||
_PyEventRc *_PyEventRc_New(void);
|
||||
void _PyEventRc_Incref(_PyEventRc *erc);
|
||||
void _PyEventRc_Decref(_PyEventRc *erc);
|
||||
|
||||
// _PyRawMutex implements a word-sized mutex that that does not depend on the
|
||||
// parking lot API, and therefore can be used in the parking lot
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue