mirror of
https://github.com/python/cpython.git
synced 2026-04-13 23:31:02 +00:00
[3.14] gh-146227: Fix wrong type in _Py_atomic_load_uint16 in pyatomic_std.h (gh-146229) (#146232)
Also fix a few related issues in the pyatomic headers:
* Fix _Py_atomic_store_uint_release in pyatomic_msc.h to use __stlr32
on ARM64 instead of a plain volatile store (which is only relaxed on
ARM64).
* Add missing _Py_atomic_store_uint_release to pyatomic_gcc.h.
* Fix pseudo-code comment for _Py_atomic_store_ptr_release in
pyatomic.h.
(cherry picked from commit 1eff27f2c0)
This commit is contained in:
parent
a2a45d7d13
commit
73e74eeb2f
5 changed files with 26 additions and 9 deletions
|
|
@ -72,8 +72,8 @@
|
|||
// def _Py_atomic_load_ptr_acquire(obj):
|
||||
// return obj # acquire
|
||||
//
|
||||
// def _Py_atomic_store_ptr_release(obj):
|
||||
// return obj # release
|
||||
// def _Py_atomic_store_ptr_release(obj, value):
|
||||
// obj = value # release
|
||||
//
|
||||
// def _Py_atomic_fence_seq_cst():
|
||||
// # sequential consistency
|
||||
|
|
@ -529,6 +529,9 @@ _Py_atomic_store_int_release(int *obj, int value);
|
|||
static inline int
|
||||
_Py_atomic_load_int_acquire(const int *obj);
|
||||
|
||||
static inline void
|
||||
_Py_atomic_store_uint_release(unsigned int *obj, unsigned int value);
|
||||
|
||||
static inline void
|
||||
_Py_atomic_store_uint32_release(uint32_t *obj, uint32_t value);
|
||||
|
||||
|
|
|
|||
|
|
@ -576,6 +576,10 @@ 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 void
|
||||
_Py_atomic_store_uint_release(unsigned int *obj, unsigned int 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); }
|
||||
|
|
|
|||
|
|
@ -971,12 +971,6 @@ _Py_atomic_store_ushort_relaxed(unsigned short *obj, unsigned short value)
|
|||
*(volatile unsigned short *)obj = value;
|
||||
}
|
||||
|
||||
static inline void
|
||||
_Py_atomic_store_uint_release(unsigned int *obj, unsigned int value)
|
||||
{
|
||||
*(volatile unsigned int *)obj = value;
|
||||
}
|
||||
|
||||
static inline void
|
||||
_Py_atomic_store_long_relaxed(long *obj, long value)
|
||||
{
|
||||
|
|
@ -1066,6 +1060,19 @@ _Py_atomic_store_int_release(int *obj, int value)
|
|||
#endif
|
||||
}
|
||||
|
||||
static inline void
|
||||
_Py_atomic_store_uint_release(unsigned int *obj, unsigned int value)
|
||||
{
|
||||
#if defined(_M_X64) || defined(_M_IX86)
|
||||
*(volatile unsigned int *)obj = value;
|
||||
#elif defined(_M_ARM64)
|
||||
_Py_atomic_ASSERT_ARG_TYPE(unsigned __int32);
|
||||
__stlr32((unsigned __int32 volatile *)obj, (unsigned __int32)value);
|
||||
#else
|
||||
# error "no implementation of _Py_atomic_store_uint_release"
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void
|
||||
_Py_atomic_store_ssize_release(Py_ssize_t *obj, Py_ssize_t value)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -459,7 +459,7 @@ static inline uint16_t
|
|||
_Py_atomic_load_uint16(const uint16_t *obj)
|
||||
{
|
||||
_Py_USING_STD;
|
||||
return atomic_load((const _Atomic(uint32_t)*)obj);
|
||||
return atomic_load((const _Atomic(uint16_t)*)obj);
|
||||
}
|
||||
|
||||
static inline uint32_t
|
||||
|
|
|
|||
|
|
@ -0,0 +1,3 @@
|
|||
Fix wrong type in ``_Py_atomic_load_uint16`` in the C11 atomics backend
|
||||
(``pyatomic_std.h``), which used a 32-bit atomic load instead of 16-bit.
|
||||
Found by Mohammed Zuhaib.
|
||||
Loading…
Add table
Add a link
Reference in a new issue