Skip to content

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

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 22, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
[3.14] gh-134009: Expose PyMutex_IsLocked in the public C API (gh-1…
…34365)

The `PyMutex_IsLocked()` function is useful in assertions for verifying
that code maintains certain locking invariants.
(cherry picked from commit f41e9c7)

Co-authored-by: Sam Gross <colesbury@gmail.com>
  • Loading branch information
colesbury authored and hugovk committed Jul 22, 2025
commit c74ca9b3661eab4626d9387b61a76b52a9ed92c3
12 changes: 12 additions & 0 deletions Doc/c-api/init.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions Doc/whatsnew/3.14.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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`
Expand Down
11 changes: 11 additions & 0 deletions Include/cpython/lock.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
7 changes: 0 additions & 7 deletions Include/internal/pycore_lock.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Expose :c:func:`PyMutex_IsLocked` as part of the public C API.
8 changes: 8 additions & 0 deletions Python/lock.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Loading
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy