summaryrefslogtreecommitdiffstats
path: root/Include/cpython
diff options
context:
space:
mode:
authormpage <mpage@meta.com>2024-02-16 18:29:25 (GMT)
committerGitHub <noreply@github.com>2024-02-16 18:29:25 (GMT)
commitf366e215044e348659df814c27bf70e78907df21 (patch)
tree046a35e45d76f4db71825d63849009912fce0ea0 /Include/cpython
parent13addd2bbdcbf96c5ea26a0f425c049f1b71e945 (diff)
downloadcpython-f366e215044e348659df814c27bf70e78907df21.zip
cpython-f366e215044e348659df814c27bf70e78907df21.tar.gz
cpython-f366e215044e348659df814c27bf70e78907df21.tar.bz2
gh-114271: Make `thread._rlock` thread-safe in free-threaded builds (#115102)
The ID of the owning thread (`rlock_owner`) may be accessed by multiple threads without holding the underlying lock; relaxed atomics are used in place of the previous loads/stores. The number of times that the lock has been acquired (`rlock_count`) is only ever accessed by the thread that holds the lock; we do not need to use atomics to access it.
Diffstat (limited to 'Include/cpython')
-rw-r--r--Include/cpython/pyatomic.h6
-rw-r--r--Include/cpython/pyatomic_gcc.h9
-rw-r--r--Include/cpython/pyatomic_msc.h14
-rw-r--r--Include/cpython/pyatomic_std.h17
4 files changed, 46 insertions, 0 deletions
diff --git a/Include/cpython/pyatomic.h b/Include/cpython/pyatomic.h
index e10d482..9b57741 100644
--- a/Include/cpython/pyatomic.h
+++ b/Include/cpython/pyatomic.h
@@ -360,6 +360,8 @@ _Py_atomic_load_ssize_relaxed(const Py_ssize_t *obj);
static inline void *
_Py_atomic_load_ptr_relaxed(const void *obj);
+static inline unsigned long long
+_Py_atomic_load_ullong_relaxed(const unsigned long long *obj);
// --- _Py_atomic_store ------------------------------------------------------
// Atomically performs `*obj = value` (sequential consistency)
@@ -452,6 +454,10 @@ _Py_atomic_store_ptr_relaxed(void *obj, void *value);
static inline void
_Py_atomic_store_ssize_relaxed(Py_ssize_t *obj, Py_ssize_t value);
+static inline void
+_Py_atomic_store_ullong_relaxed(unsigned long long *obj,
+ unsigned long long value);
+
// --- _Py_atomic_load_ptr_acquire / _Py_atomic_store_ptr_release ------------
diff --git a/Include/cpython/pyatomic_gcc.h b/Include/cpython/pyatomic_gcc.h
index 4095e18..bc74149 100644
--- a/Include/cpython/pyatomic_gcc.h
+++ b/Include/cpython/pyatomic_gcc.h
@@ -358,6 +358,10 @@ static inline void *
_Py_atomic_load_ptr_relaxed(const void *obj)
{ return (void *)__atomic_load_n((const void **)obj, __ATOMIC_RELAXED); }
+static inline unsigned long long
+_Py_atomic_load_ullong_relaxed(const unsigned long long *obj)
+{ return __atomic_load_n(obj, __ATOMIC_RELAXED); }
+
// --- _Py_atomic_store ------------------------------------------------------
@@ -476,6 +480,11 @@ static inline void
_Py_atomic_store_ssize_relaxed(Py_ssize_t *obj, Py_ssize_t value)
{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); }
+static inline void
+_Py_atomic_store_ullong_relaxed(unsigned long long *obj,
+ unsigned long long value)
+{ __atomic_store_n(obj, value, __ATOMIC_RELAXED); }
+
// --- _Py_atomic_load_ptr_acquire / _Py_atomic_store_ptr_release ------------
diff --git a/Include/cpython/pyatomic_msc.h b/Include/cpython/pyatomic_msc.h
index b5c1ec9..6ab6401 100644
--- a/Include/cpython/pyatomic_msc.h
+++ b/Include/cpython/pyatomic_msc.h
@@ -712,6 +712,12 @@ _Py_atomic_load_ptr_relaxed(const void *obj)
return *(void * volatile *)obj;
}
+static inline unsigned long long
+_Py_atomic_load_ullong_relaxed(const unsigned long long *obj)
+{
+ return *(volatile unsigned long long *)obj;
+}
+
// --- _Py_atomic_store ------------------------------------------------------
@@ -886,6 +892,14 @@ _Py_atomic_store_ssize_relaxed(Py_ssize_t *obj, Py_ssize_t value)
*(volatile Py_ssize_t *)obj = value;
}
+static inline void
+_Py_atomic_store_ullong_relaxed(unsigned long long *obj,
+ unsigned long long value)
+{
+ *(volatile unsigned long long *)obj = value;
+}
+
+
// --- _Py_atomic_load_ptr_acquire / _Py_atomic_store_ptr_release ------------
static inline void *
diff --git a/Include/cpython/pyatomic_std.h b/Include/cpython/pyatomic_std.h
index 6c934a2..d3004db 100644
--- a/Include/cpython/pyatomic_std.h
+++ b/Include/cpython/pyatomic_std.h
@@ -619,6 +619,14 @@ _Py_atomic_load_ptr_relaxed(const void *obj)
memory_order_relaxed);
}
+static inline unsigned long long
+_Py_atomic_load_ullong_relaxed(const unsigned long long *obj)
+{
+ _Py_USING_STD;
+ return atomic_load_explicit((const _Atomic(unsigned long long)*)obj,
+ memory_order_relaxed);
+}
+
// --- _Py_atomic_store ------------------------------------------------------
@@ -835,6 +843,15 @@ _Py_atomic_store_ssize_relaxed(Py_ssize_t *obj, Py_ssize_t value)
memory_order_relaxed);
}
+static inline void
+_Py_atomic_store_ullong_relaxed(unsigned long long *obj,
+ unsigned long long value)
+{
+ _Py_USING_STD;
+ atomic_store_explicit((_Atomic(unsigned long long)*)obj, value,
+ memory_order_relaxed);
+}
+
// --- _Py_atomic_load_ptr_acquire / _Py_atomic_store_ptr_release ------------