summaryrefslogtreecommitdiffstats
path: root/Python/qsbr.c
diff options
context:
space:
mode:
Diffstat (limited to 'Python/qsbr.c')
-rw-r--r--Python/qsbr.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/Python/qsbr.c b/Python/qsbr.c
index 69f77f4..d7ac8f4 100644
--- a/Python/qsbr.c
+++ b/Python/qsbr.c
@@ -233,13 +233,17 @@ _Py_qsbr_register(_PyThreadStateImpl *tstate, PyInterpreterState *interp,
void
_Py_qsbr_unregister(_PyThreadStateImpl *tstate)
{
+ struct _qsbr_shared *shared = tstate->qsbr->shared;
+
+ PyMutex_Lock(&shared->mutex);
+ // NOTE: we must load (or reload) the thread state's qbsr inside the mutex
+ // because the array may have been resized (changing tstate->qsbr) while
+ // we waited to acquire the mutex.
struct _qsbr_thread_state *qsbr = tstate->qsbr;
- struct _qsbr_shared *shared = qsbr->shared;
assert(qsbr->seq == 0 && "thread state must be detached");
-
- PyMutex_Lock(&shared->mutex);
assert(qsbr->allocated && qsbr->tstate == (PyThreadState *)tstate);
+
tstate->qsbr = NULL;
qsbr->tstate = NULL;
qsbr->allocated = false;