summaryrefslogtreecommitdiffstats
path: root/Include/internal/pycore_lock.h
diff options
context:
space:
mode:
authorSam Gross <colesbury@gmail.com>2024-06-20 15:29:08 (GMT)
committerGitHub <noreply@github.com>2024-06-20 15:29:08 (GMT)
commit3af7263037de1d0ef63b070fc7bfc2cf042eaebe (patch)
tree3503239cf4a4ca885e53f9e943530aa9bf93ac5c /Include/internal/pycore_lock.h
parente8e151d4715839f785ff853c77594d7302b40266 (diff)
downloadcpython-3af7263037de1d0ef63b070fc7bfc2cf042eaebe.zip
cpython-3af7263037de1d0ef63b070fc7bfc2cf042eaebe.tar.gz
cpython-3af7263037de1d0ef63b070fc7bfc2cf042eaebe.tar.bz2
gh-117511: Make PyMutex public in the non-limited API (#117731)
Diffstat (limited to 'Include/internal/pycore_lock.h')
-rw-r--r--Include/internal/pycore_lock.h68
1 files changed, 3 insertions, 65 deletions
diff --git a/Include/internal/pycore_lock.h b/Include/internal/pycore_lock.h
index 882c488..8aa7394 100644
--- a/Include/internal/pycore_lock.h
+++ b/Include/internal/pycore_lock.h
@@ -13,48 +13,10 @@ extern "C" {
# error "this header requires Py_BUILD_CORE define"
#endif
-
-// A mutex that occupies one byte. The lock can be zero initialized.
-//
-// Only the two least significant bits are used. The remaining bits should be
-// zero:
-// 0b00: unlocked
-// 0b01: locked
-// 0b10: unlocked and has parked threads
-// 0b11: locked and has parked threads
-//
-// Typical initialization:
-// PyMutex m = (PyMutex){0};
-//
-// Or initialize as global variables:
-// static PyMutex m;
-//
-// Typical usage:
-// PyMutex_Lock(&m);
-// ...
-// PyMutex_Unlock(&m);
-
-// NOTE: In Py_GIL_DISABLED builds, `struct _PyMutex` is defined in Include/object.h.
-// The Py_GIL_DISABLED builds need the definition in Include/object.h for the
-// `ob_mutex` field in PyObject. For the default (non-free-threaded) build,
-// we define the struct here to avoid exposing it in the public API.
-#ifndef Py_GIL_DISABLED
-struct _PyMutex { uint8_t v; };
-#endif
-
-typedef struct _PyMutex PyMutex;
-
-#define _Py_UNLOCKED 0
-#define _Py_LOCKED 1
+//_Py_UNLOCKED is defined as 0 and _Py_LOCKED as 1 in Include/cpython/lock.h
#define _Py_HAS_PARKED 2
#define _Py_ONCE_INITIALIZED 4
-// (private) slow path for locking the mutex
-PyAPI_FUNC(void) _PyMutex_LockSlow(PyMutex *m);
-
-// (private) slow path for unlocking the mutex
-PyAPI_FUNC(void) _PyMutex_UnlockSlow(PyMutex *m);
-
static inline int
PyMutex_LockFast(uint8_t *lock_bits)
{
@@ -62,35 +24,11 @@ PyMutex_LockFast(uint8_t *lock_bits)
return _Py_atomic_compare_exchange_uint8(lock_bits, &expected, _Py_LOCKED);
}
-// Locks the mutex.
-//
-// If the mutex is currently locked, the calling thread will be parked until
-// the mutex is unlocked. If the current thread holds the GIL, then the GIL
-// will be released while the thread is parked.
-static inline void
-PyMutex_Lock(PyMutex *m)
-{
- uint8_t expected = _Py_UNLOCKED;
- if (!_Py_atomic_compare_exchange_uint8(&m->v, &expected, _Py_LOCKED)) {
- _PyMutex_LockSlow(m);
- }
-}
-
-// Unlocks the mutex.
-static inline void
-PyMutex_Unlock(PyMutex *m)
-{
- uint8_t expected = _Py_LOCKED;
- if (!_Py_atomic_compare_exchange_uint8(&m->v, &expected, _Py_UNLOCKED)) {
- _PyMutex_UnlockSlow(m);
- }
-}
-
// Checks if the mutex is currently locked.
static inline int
PyMutex_IsLocked(PyMutex *m)
{
- return (_Py_atomic_load_uint8(&m->v) & _Py_LOCKED) != 0;
+ return (_Py_atomic_load_uint8(&m->_bits) & _Py_LOCKED) != 0;
}
// Re-initializes the mutex after a fork to the unlocked state.
@@ -121,7 +59,7 @@ static inline void
PyMutex_LockFlags(PyMutex *m, _PyLockFlags flags)
{
uint8_t expected = _Py_UNLOCKED;
- if (!_Py_atomic_compare_exchange_uint8(&m->v, &expected, _Py_LOCKED)) {
+ if (!_Py_atomic_compare_exchange_uint8(&m->_bits, &expected, _Py_LOCKED)) {
_PyMutex_LockTimed(m, -1, flags);
}
}