Skip to content

Commit 2212605

Browse files
committed
unsigned long race
1 parent d41132c commit 2212605

File tree

2 files changed

+6
-3
lines changed

2 files changed

+6
-3
lines changed

Include/internal/pycore_pyatomic_ft_wrappers.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ extern "C" {
8989
_Py_atomic_store_long_release(&value, new_value)
9090
#define FT_ATOMIC_LOAD_LONG_RELAXED(value) \
9191
_Py_atomic_load_long_relaxed(&value)
92+
#define FT_ATOMIC_STORE_ULONG(value, new_value) \
93+
_Py_atomic_store_ulong(&value, new_value)
9294

9395
#else
9496
#define FT_ATOMIC_LOAD_PTR(value) value
@@ -126,6 +128,7 @@ extern "C" {
126128
#define FT_ATOMIC_STORE_UINT_RELEASE(value, new_value) value = new_value
127129
#define FT_ATOMIC_LOAD_LONG_RELAXED(value) value
128130
#define FT_ATOMIC_STORE_LONG_RELEASE(value, new_value) value = new_value
131+
#define FT_ATOMIC_STORE_ULONG(value, new_value) value = new_value
129132

130133
#endif
131134

Python/structmember.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ PyMember_GetOne(const char *obj_addr, PyMemberDef *l)
5858
v = PyLong_FromLong(FT_ATOMIC_LOAD_LONG_RELAXED(*(long*)addr));
5959
break;
6060
case Py_T_ULONG:
61-
v = PyLong_FromUnsignedLong(*(unsigned long*)addr);
61+
v = PyLong_FromUnsignedLong(FT_ATOMIC_LOAD_ULONG_RELAXED(*(unsigned long*)addr));
6262
break;
6363
case Py_T_PYSSIZET:
6464
v = PyLong_FromSsize_t(*(Py_ssize_t*)addr);
@@ -269,7 +269,7 @@ PyMember_SetOne(char *addr, PyMemberDef *l, PyObject *v)
269269
if (long_val == -1 && PyErr_Occurred()) {
270270
return -1;
271271
}
272-
*(unsigned long *)addr = (unsigned long)long_val;
272+
FT_ATOMIC_STORE_ULONG(*(unsigned long *)addr, (unsigned long)long_val);
273273
WARN("Writing negative value into unsigned field");
274274
}
275275
else {
@@ -278,7 +278,7 @@ PyMember_SetOne(char *addr, PyMemberDef *l, PyObject *v)
278278
if (ulong_val == (unsigned long)-1 && PyErr_Occurred()) {
279279
return -1;
280280
}
281-
*(unsigned long*)addr = ulong_val;
281+
FT_ATOMIC_STORE_ULONG(*(unsigned long *)addr, ulong_val);
282282
}
283283
break;
284284
}

0 commit comments

Comments
 (0)