gh-114203: skip locking if object is already locked by two-mutex critical section (#141476)

This commit is contained in:
Kumar Aditya 2025-11-14 23:17:59 +05:30 committed by GitHub
parent da7f4e4b22
commit f26ed455d5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 120 additions and 5 deletions

View file

@ -24,11 +24,24 @@ _PyCriticalSection_BeginSlow(PyCriticalSection *c, PyMutex *m)
// As an optimisation for locking the same object recursively, skip
// locking if the mutex is currently locked by the top-most critical
// section.
if (tstate->critical_section &&
untag_critical_section(tstate->critical_section)->_cs_mutex == m) {
c->_cs_mutex = NULL;
c->_cs_prev = 0;
return;
// If the top-most critical section is a two-mutex critical section,
// then locking is skipped if either mutex is m.
if (tstate->critical_section) {
PyCriticalSection *prev = untag_critical_section(tstate->critical_section);
if (prev->_cs_mutex == m) {
c->_cs_mutex = NULL;
c->_cs_prev = 0;
return;
}
if (tstate->critical_section & _Py_CRITICAL_SECTION_TWO_MUTEXES) {
PyCriticalSection2 *prev2 = (PyCriticalSection2 *)
untag_critical_section(tstate->critical_section);
if (prev2->_cs_mutex2 == m) {
c->_cs_mutex = NULL;
c->_cs_prev = 0;
return;
}
}
}
c->_cs_mutex = NULL;
c->_cs_prev = (uintptr_t)tstate->critical_section;