Skip to content

Commit 23d10c6

Browse files
committed
float race
1 parent 74616d6 commit 23d10c6

File tree

6 files changed

+57
-2
lines changed

6 files changed

+57
-2
lines changed

Include/cpython/pyatomic.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,9 @@ _Py_atomic_load_ushort_relaxed(const unsigned short *obj);
336336
static inline long
337337
_Py_atomic_load_long_relaxed(const long *obj);
338338

339+
static inline float
340+
_Py_atomic_load_float_relaxed(const float *obj);
341+
339342
static inline int8_t
340343
_Py_atomic_load_int8_relaxed(const int8_t *obj);
341344

@@ -514,6 +517,9 @@ _Py_atomic_store_uint_release(unsigned int *obj, unsigned int value);
514517
static inline void
515518
_Py_atomic_store_long_release(long *obj, long value);
516519

520+
static inline void
521+
_Py_atomic_store_float_release(float *obj, float value);
522+
517523
static inline int
518524
_Py_atomic_load_int_acquire(const int *obj);
519525

Include/cpython/pyatomic_gcc.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,10 @@ static inline long
326326
_Py_atomic_load_long_relaxed(const long *obj)
327327
{ return __atomic_load_n(obj, __ATOMIC_RELAXED); }
328328

329+
static inline float
330+
_Py_atomic_load_float_relaxed(const float *obj)
331+
{ float ret; __atomic_load(obj, &ret, __ATOMIC_RELAXED); return ret; }
332+
329333
static inline int8_t
330334
_Py_atomic_load_int8_relaxed(const int8_t *obj)
331335
{ return __atomic_load_n(obj, __ATOMIC_RELAXED); }
@@ -552,6 +556,10 @@ static inline void
552556
_Py_atomic_store_long_release(long *obj, long value)
553557
{ __atomic_store_n(obj, value, __ATOMIC_RELEASE); }
554558

559+
static inline void
560+
_Py_atomic_store_float_release(float *obj, float value)
561+
{ __atomic_store(obj, &value, __ATOMIC_RELEASE); }
562+
555563
static inline void
556564
_Py_atomic_store_ssize_release(Py_ssize_t *obj, Py_ssize_t value)
557565
{ __atomic_store_n(obj, value, __ATOMIC_RELEASE); }

Include/cpython/pyatomic_msc.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,12 @@ _Py_atomic_load_long_relaxed(const long *obj)
664664
return *(volatile long *)obj;
665665
}
666666

667+
static inline float
668+
_Py_atomic_load_float_relaxed(const float *obj)
669+
{
670+
return *(volatile float *)obj;
671+
}
672+
667673
static inline int8_t
668674
_Py_atomic_load_int8_relaxed(const int8_t *obj)
669675
{
@@ -1072,6 +1078,19 @@ _Py_atomic_store_long_release(long *obj, long value)
10721078
#endif
10731079
}
10741080

1081+
static inline void
1082+
_Py_atomic_store_float_release(float *obj, float value)
1083+
{
1084+
#if defined(_M_X64) || defined(_M_IX86)
1085+
*(float volatile *)obj = value;
1086+
#elif defined(_M_ARM64)
1087+
_Py_atomic_ASSERT_ARG_TYPE(unsigned __int32);
1088+
__stlr64((unsigned __int32 volatile *)obj, (unsigned __int32)value);
1089+
#else
1090+
# error "no implementation of _Py_atomic_store_float_release"
1091+
#endif
1092+
}
1093+
10751094
static inline void
10761095
_Py_atomic_store_ssize_release(Py_ssize_t *obj, Py_ssize_t value)
10771096
{

Include/cpython/pyatomic_std.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,14 @@ _Py_atomic_load_long_relaxed(const long *obj)
555555
memory_order_relaxed);
556556
}
557557

558+
static inline float
559+
_Py_atomic_load_float_relaxed(const float *obj)
560+
{
561+
_Py_USING_STD;
562+
return atomic_load_explicit((const _Atomic(float)*)obj,
563+
memory_order_relaxed);
564+
}
565+
558566
static inline int8_t
559567
_Py_atomic_load_int8_relaxed(const int8_t *obj)
560568
{
@@ -983,6 +991,14 @@ _Py_atomic_store_long_release(long *obj, long value)
983991
memory_order_release);
984992
}
985993

994+
static inline void
995+
_Py_atomic_store_float_release(float *obj, float value)
996+
{
997+
_Py_USING_STD;
998+
atomic_store_explicit((_Atomic(float)*)obj, value,
999+
memory_order_release);
1000+
}
1001+
9861002
static inline void
9871003
_Py_atomic_store_ssize_release(Py_ssize_t *obj, Py_ssize_t value)
9881004
{

Include/internal/pycore_pyatomic_ft_wrappers.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,10 @@ extern "C" {
9393
_Py_atomic_store_ulong(&value, new_value)
9494
#define FT_ATOMIC_STORE_SSIZE_RELEASE(value, new_value) \
9595
_Py_atomic_store_ssize_release(&value, new_value)
96+
#define FT_ATOMIC_STORE_FLOAT_RELEASE(value, new_value) \
97+
_Py_atomic_store_float_release(&value, new_value)
98+
#define FT_ATOMIC_LOAD_FLOAT_RELAXED(value) \
99+
_Py_atomic_load_float_relaxed(&value)
96100

97101
#else
98102
#define FT_ATOMIC_LOAD_PTR(value) value
@@ -132,6 +136,8 @@ extern "C" {
132136
#define FT_ATOMIC_STORE_LONG_RELEASE(value, new_value) value = new_value
133137
#define FT_ATOMIC_STORE_ULONG(value, new_value) value = new_value
134138
#define FT_ATOMIC_STORE_SSIZE_RELEASE(value, new_value) value = new_value
139+
#define FT_ATOMIC_LOAD_FLOAT_RELAXED(value) value
140+
#define FT_ATOMIC_STORE_FLOAT_RELEASE(value, new_value) value = new_value
135141

136142
#endif
137143

Python/structmember.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ PyMember_GetOne(const char *obj_addr, PyMemberDef *l)
6464
v = PyLong_FromSsize_t(FT_ATOMIC_LOAD_SSIZE_RELAXED(*(Py_ssize_t*)addr));
6565
break;
6666
case Py_T_FLOAT:
67-
v = PyFloat_FromDouble((double)*(float*)addr);
67+
v = PyFloat_FromDouble((double)FT_ATOMIC_LOAD_FLOAT_RELAXED(*(float*)addr));
6868
break;
6969
case Py_T_DOUBLE:
7070
v = PyFloat_FromDouble(*(double*)addr);
@@ -293,7 +293,7 @@ PyMember_SetOne(char *addr, PyMemberDef *l, PyObject *v)
293293
double double_val = PyFloat_AsDouble(v);
294294
if ((double_val == -1) && PyErr_Occurred())
295295
return -1;
296-
*(float*)addr = (float)double_val;
296+
FT_ATOMIC_STORE_FLOAT_RELEASE(*(float*)addr, (float)double_val);
297297
break;
298298
}
299299
case Py_T_DOUBLE:

0 commit comments

Comments
 (0)