[3.14] gh-134009: Expose PyMutex_IsLocked in the public C API (gh-134365) (#136971)

Co-authored-by: Sam Gross <colesbury@gmail.com>
This commit is contained in:
Hugo van Kemenade 2025-07-22 12:48:08 +03:00 committed by GitHub
parent 11f510167c
commit 8e43b130f7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 33 additions and 7 deletions

View file

@ -2441,6 +2441,18 @@ The C-API provides a basic mutual exclusion lock.
.. versionadded:: 3.13
.. c:function:: int PyMutex_IsLocked(PyMutex *m)
Returns non-zero if the mutex *m* is currently locked, zero otherwise.
.. note::
This function is intended for use in assertions and debugging only and
should not be used to make concurrency control decisions, as the lock
state may change immediately after the check.
.. versionadded:: 3.14
.. _python-critical-section-api:
Python Critical Section API

View file

@ -3027,6 +3027,7 @@ Porting to Python 3.14
* ``_PyLong_IsPositive()``: :c:func:`PyLong_IsPositive`
* ``_PyLong_IsZero()``: :c:func:`PyLong_IsZero`
* ``_PyLong_Sign()``: :c:func:`PyLong_GetSign`
* ``_PyMutex_IsLocked()`` : :c:func:`PyMutex_IsLocked`
* ``_PyUnicodeWriter_Dealloc()``: :c:func:`PyUnicodeWriter_Discard`
* ``_PyUnicodeWriter_Finish()``: :c:func:`PyUnicodeWriter_Finish`
* ``_PyUnicodeWriter_Init()``: use :c:func:`PyUnicodeWriter_Create`

View file

@ -36,6 +36,9 @@ PyAPI_FUNC(void) PyMutex_Lock(PyMutex *m);
// exported function for unlocking the mutex
PyAPI_FUNC(void) PyMutex_Unlock(PyMutex *m);
// exported function for checking if the mutex is locked
PyAPI_FUNC(int) PyMutex_IsLocked(PyMutex *m);
// Locks the mutex.
//
// If the mutex is currently locked, the calling thread will be parked until
@ -61,3 +64,11 @@ _PyMutex_Unlock(PyMutex *m)
}
}
#define PyMutex_Unlock _PyMutex_Unlock
// Checks if the mutex is currently locked.
static inline int
_PyMutex_IsLocked(PyMutex *m)
{
return (_Py_atomic_load_uint8(&m->_bits) & _Py_LOCKED) != 0;
}
#define PyMutex_IsLocked _PyMutex_IsLocked

View file

@ -25,13 +25,6 @@ PyMutex_LockFast(PyMutex *m)
return _Py_atomic_compare_exchange_uint8(lock_bits, &expected, _Py_LOCKED);
}
// Checks if the mutex is currently locked.
static inline int
PyMutex_IsLocked(PyMutex *m)
{
return (_Py_atomic_load_uint8(&m->_bits) & _Py_LOCKED) != 0;
}
// Re-initializes the mutex after a fork to the unlocked state.
static inline void
_PyMutex_at_fork_reinit(PyMutex *m)

View file

@ -0,0 +1 @@
Expose :c:func:`PyMutex_IsLocked` as part of the public C API.

View file

@ -619,3 +619,11 @@ PyMutex_Unlock(PyMutex *m)
Py_FatalError("unlocking mutex that is not locked");
}
}
#undef PyMutex_IsLocked
int
PyMutex_IsLocked(PyMutex *m)
{
return _PyMutex_IsLocked(m);
}