summaryrefslogtreecommitdiffstats
path: root/Include/cpython
diff options
context:
space:
mode:
authorDino Viehland <dinoviehland@meta.com>2024-02-21 00:40:37 (GMT)
committerGitHub <noreply@github.com>2024-02-21 00:40:37 (GMT)
commit176df09adbb42bbb50febd02346c32782d39dc4d (patch)
tree6f8a91d55df5bb1b432bdaff529c9eaa7d51cf92 /Include/cpython
parent145bc2d638370cb6d3da361c6dc05c5bc29f0d11 (diff)
downloadcpython-176df09adbb42bbb50febd02346c32782d39dc4d.zip
cpython-176df09adbb42bbb50febd02346c32782d39dc4d.tar.gz
cpython-176df09adbb42bbb50febd02346c32782d39dc4d.tar.bz2
gh-112075: Make PyDictKeysObject thread-safe (#114741)
Adds locking for shared PyDictKeysObject's for dictionaries
Diffstat (limited to 'Include/cpython')
-rw-r--r--Include/cpython/pyatomic.h6
-rw-r--r--Include/cpython/pyatomic_gcc.h8
-rw-r--r--Include/cpython/pyatomic_msc.h24
-rw-r--r--Include/cpython/pyatomic_std.h16
4 files changed, 53 insertions, 1 deletions
diff --git a/Include/cpython/pyatomic.h b/Include/cpython/pyatomic.h
index 737eed8..c3e132d 100644
--- a/Include/cpython/pyatomic.h
+++ b/Include/cpython/pyatomic.h
@@ -470,6 +470,9 @@ static inline void
_Py_atomic_store_ptr_release(void *obj, void *value);
static inline void
+_Py_atomic_store_ssize_release(Py_ssize_t *obj, Py_ssize_t value);
+
+static inline void
_Py_atomic_store_int_release(int *obj, int value);
static inline int
@@ -484,6 +487,9 @@ _Py_atomic_load_uint64_acquire(const uint64_t *obj);
static inline uint32_t
_Py_atomic_load_uint32_acquire(const uint32_t *obj);
+static inline Py_ssize_t
+_Py_atomic_load_ssize_acquire(const Py_ssize_t *obj);
+
// --- _Py_atomic_fence ------------------------------------------------------
diff --git a/Include/cpython/pyatomic_gcc.h b/Include/cpython/pyatomic_gcc.h
index de23edf..0b40f81 100644
--- a/Include/cpython/pyatomic_gcc.h
+++ b/Include/cpython/pyatomic_gcc.h
@@ -500,6 +500,10 @@ static inline void
_Py_atomic_store_int_release(int *obj, int value)
{ __atomic_store_n(obj, value, __ATOMIC_RELEASE); }
+static inline void
+_Py_atomic_store_ssize_release(Py_ssize_t *obj, Py_ssize_t value)
+{ __atomic_store_n(obj, value, __ATOMIC_RELEASE); }
+
static inline int
_Py_atomic_load_int_acquire(const int *obj)
{ return __atomic_load_n(obj, __ATOMIC_ACQUIRE); }
@@ -516,6 +520,10 @@ static inline uint32_t
_Py_atomic_load_uint32_acquire(const uint32_t *obj)
{ return __atomic_load_n(obj, __ATOMIC_ACQUIRE); }
+static inline Py_ssize_t
+_Py_atomic_load_ssize_acquire(const Py_ssize_t *obj)
+{ return __atomic_load_n(obj, __ATOMIC_ACQUIRE); }
+
// --- _Py_atomic_fence ------------------------------------------------------
static inline void
diff --git a/Include/cpython/pyatomic_msc.h b/Include/cpython/pyatomic_msc.h
index 9809d98..3205e25 100644
--- a/Include/cpython/pyatomic_msc.h
+++ b/Include/cpython/pyatomic_msc.h
@@ -939,6 +939,18 @@ _Py_atomic_store_int_release(int *obj, int value)
#endif
}
+static inline void
+_Py_atomic_store_ssize_release(Py_ssize_t *obj, Py_ssize_t value)
+{
+#if defined(_M_X64) || defined(_M_IX86)
+ *(Py_ssize_t volatile *)obj = value;
+#elif defined(_M_ARM64)
+ __stlr64((unsigned __int64 volatile *)obj, (unsigned __int64)value);
+#else
+# error "no implementation of _Py_atomic_store_ssize_release"
+#endif
+}
+
static inline int
_Py_atomic_load_int_acquire(const int *obj)
{
@@ -990,6 +1002,18 @@ _Py_atomic_load_uint32_acquire(const uint32_t *obj)
#endif
}
+static inline Py_ssize_t
+_Py_atomic_load_ssize_acquire(const Py_ssize_t *obj)
+{
+#if defined(_M_X64) || defined(_M_IX86)
+ return *(Py_ssize_t volatile *)obj;
+#elif defined(_M_ARM64)
+ return (Py_ssize_t)__ldar64((unsigned __int64 volatile *)obj);
+#else
+# error "no implementation of _Py_atomic_load_ssize_acquire"
+#endif
+}
+
// --- _Py_atomic_fence ------------------------------------------------------
static inline void
diff --git a/Include/cpython/pyatomic_std.h b/Include/cpython/pyatomic_std.h
index f5bd73a..f3970a4 100644
--- a/Include/cpython/pyatomic_std.h
+++ b/Include/cpython/pyatomic_std.h
@@ -879,6 +879,14 @@ _Py_atomic_store_int_release(int *obj, int value)
memory_order_release);
}
+static inline void
+_Py_atomic_store_ssize_release(Py_ssize_t *obj, Py_ssize_t value)
+{
+ _Py_USING_STD;
+ atomic_store_explicit((_Atomic(Py_ssize_t)*)obj, value,
+ memory_order_release);
+}
+
static inline int
_Py_atomic_load_int_acquire(const int *obj)
{
@@ -908,7 +916,13 @@ _Py_atomic_load_uint32_acquire(const uint32_t *obj)
{
_Py_USING_STD;
return atomic_load_explicit((const _Atomic(uint32_t)*)obj,
- memory_order_acquire);
+}
+
+static inline Py_ssize_t
+_Py_atomic_load_ssize_acquire(const Py_ssize_t *obj)
+{
+ _Py_USING_STD;
+ return atomic_load_explicit((const _Atomic(Py_ssize_t)*)obj,
}