mirror of
https://github.com/python/cpython.git
synced 2026-01-06 23:42:34 +00:00
gh-134009: Expose PyMutex_IsLocked in the public C API (gh-134365)
The `PyMutex_IsLocked()` function is useful in assertions for verifying that code maintains certain locking invariants.
This commit is contained in:
parent
86c3316183
commit
f41e9c750e
6 changed files with 39 additions and 7 deletions
|
|
@ -2277,6 +2277,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:: next
|
||||
|
||||
.. _python-critical-section-api:
|
||||
|
||||
Python Critical Section API
|
||||
|
|
|
|||
|
|
@ -346,6 +346,13 @@ Porting to Python 3.15
|
|||
|
||||
(Contributed by Serhiy Storchaka in :gh:`133595`.)
|
||||
|
||||
* Private functions promoted to public C APIs:
|
||||
|
||||
* ``PyMutex_IsLocked()`` : :c:func:`PyMutex_IsLocked`
|
||||
|
||||
The |pythoncapi_compat_project| can be used to get most of these new
|
||||
functions on Python 3.14 and older.
|
||||
|
||||
Deprecated C APIs
|
||||
-----------------
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
Expose :c:func:`PyMutex_IsLocked` as part of the public C API.
|
||||
|
|
@ -634,3 +634,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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue