https://github.com/python/cpython/commit/e9d5280f6c040f859907eb3c04ec308f4918db9f
commit: e9d5280f6c040f859907eb3c04ec308f4918db9f
branch: main
author: Kumar Aditya <[email protected]>
committer: kumaraditya303 <[email protected]>
date: 2026-06-15T22:09:49+05:30
summary:
gh-151223: fix tsan data races in load global specializations (#151393)
files:
M Modules/_testinternalcapi/test_cases.c.h
M Python/bytecodes.c
M Python/executor_cases.c.h
M Python/generated_cases.c.h
diff --git a/Modules/_testinternalcapi/test_cases.c.h
b/Modules/_testinternalcapi/test_cases.c.h
index 503f566c9ae86a5..62d08826a2faea4 100644
--- a/Modules/_testinternalcapi/test_cases.c.h
+++ b/Modules/_testinternalcapi/test_cases.c.h
@@ -8830,7 +8830,7 @@
assert(keys->dk_kind == DICT_KEYS_UNICODE);
assert(index <
FT_ATOMIC_LOAD_SSIZE_RELAXED(keys->dk_nentries));
PyDictUnicodeEntry *ep = DK_UNICODE_ENTRIES(keys) + index;
- PyObject *attr_o = FT_ATOMIC_LOAD_PTR_RELAXED(ep->me_value);
+ PyObject *attr_o = FT_ATOMIC_LOAD_PTR_CONSUME(ep->me_value);
if (attr_o == NULL) {
UPDATE_MISS_STATS(LOAD_ATTR);
assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
@@ -9707,7 +9707,7 @@
}
assert(keys->dk_kind == DICT_KEYS_UNICODE);
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(keys);
- PyObject *res_o =
FT_ATOMIC_LOAD_PTR_RELAXED(entries[index].me_value);
+ PyObject *res_o =
FT_ATOMIC_LOAD_PTR_CONSUME(entries[index].me_value);
if (res_o == NULL) {
UPDATE_MISS_STATS(LOAD_GLOBAL);
assert(_PyOpcode_Deopt[opcode] == (LOAD_GLOBAL));
@@ -9774,7 +9774,7 @@
assert(keys->dk_kind == DICT_KEYS_UNICODE);
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(keys);
assert(index < DK_SIZE(keys));
- PyObject *res_o =
FT_ATOMIC_LOAD_PTR_RELAXED(entries[index].me_value);
+ PyObject *res_o =
FT_ATOMIC_LOAD_PTR_CONSUME(entries[index].me_value);
if (res_o == NULL) {
UPDATE_MISS_STATS(LOAD_GLOBAL);
assert(_PyOpcode_Deopt[opcode] == (LOAD_GLOBAL));
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index e368092b300f864..beaf6752b87ea2d 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -2349,7 +2349,7 @@ dummy_func(
assert(keys->dk_kind == DICT_KEYS_UNICODE);
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(keys);
assert(index < DK_SIZE(keys));
- PyObject *res_o =
FT_ATOMIC_LOAD_PTR_RELAXED(entries[index].me_value);
+ PyObject *res_o =
FT_ATOMIC_LOAD_PTR_CONSUME(entries[index].me_value);
DEOPT_IF(res_o == NULL);
#if Py_GIL_DISABLED
int increfed =
_Py_TryIncrefCompareStackRef(&entries[index].me_value, res_o, &res);
@@ -2368,7 +2368,7 @@ dummy_func(
DEOPT_IF(FT_ATOMIC_LOAD_UINT32_RELAXED(keys->dk_version) !=
version);
assert(keys->dk_kind == DICT_KEYS_UNICODE);
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(keys);
- PyObject *res_o =
FT_ATOMIC_LOAD_PTR_RELAXED(entries[index].me_value);
+ PyObject *res_o =
FT_ATOMIC_LOAD_PTR_CONSUME(entries[index].me_value);
DEOPT_IF(res_o == NULL);
#if Py_GIL_DISABLED
int increfed =
_Py_TryIncrefCompareStackRef(&entries[index].me_value, res_o, &res);
@@ -2958,7 +2958,7 @@ dummy_func(
assert(keys->dk_kind == DICT_KEYS_UNICODE);
assert(index < FT_ATOMIC_LOAD_SSIZE_RELAXED(keys->dk_nentries));
PyDictUnicodeEntry *ep = DK_UNICODE_ENTRIES(keys) + index;
- PyObject *attr_o = FT_ATOMIC_LOAD_PTR_RELAXED(ep->me_value);
+ PyObject *attr_o = FT_ATOMIC_LOAD_PTR_CONSUME(ep->me_value);
EXIT_IF(attr_o == NULL);
#ifdef Py_GIL_DISABLED
int increfed = _Py_TryIncrefCompareStackRef(&ep->me_value, attr_o,
&attr);
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h
index 7973c75e1a60ad2..d5bfe60cd234737 100644
--- a/Python/executor_cases.c.h
+++ b/Python/executor_cases.c.h
@@ -10301,7 +10301,7 @@
assert(keys->dk_kind == DICT_KEYS_UNICODE);
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(keys);
assert(index < DK_SIZE(keys));
- PyObject *res_o =
FT_ATOMIC_LOAD_PTR_RELAXED(entries[index].me_value);
+ PyObject *res_o =
FT_ATOMIC_LOAD_PTR_CONSUME(entries[index].me_value);
if (res_o == NULL) {
UOP_STAT_INC(uopcode, miss);
SET_CURRENT_CACHED_VALUES(0);
@@ -10346,7 +10346,7 @@
}
assert(keys->dk_kind == DICT_KEYS_UNICODE);
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(keys);
- PyObject *res_o =
FT_ATOMIC_LOAD_PTR_RELAXED(entries[index].me_value);
+ PyObject *res_o =
FT_ATOMIC_LOAD_PTR_CONSUME(entries[index].me_value);
if (res_o == NULL) {
UOP_STAT_INC(uopcode, miss);
SET_CURRENT_CACHED_VALUES(0);
@@ -12152,7 +12152,7 @@
assert(keys->dk_kind == DICT_KEYS_UNICODE);
assert(index < FT_ATOMIC_LOAD_SSIZE_RELAXED(keys->dk_nentries));
PyDictUnicodeEntry *ep = DK_UNICODE_ENTRIES(keys) + index;
- PyObject *attr_o = FT_ATOMIC_LOAD_PTR_RELAXED(ep->me_value);
+ PyObject *attr_o = FT_ATOMIC_LOAD_PTR_CONSUME(ep->me_value);
if (attr_o == NULL) {
UOP_STAT_INC(uopcode, miss);
_tos_cache0 = owner;
diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h
index 5adcdcb4521baf5..a6e0f90d8c1ce2a 100644
--- a/Python/generated_cases.c.h
+++ b/Python/generated_cases.c.h
@@ -8829,7 +8829,7 @@
assert(keys->dk_kind == DICT_KEYS_UNICODE);
assert(index <
FT_ATOMIC_LOAD_SSIZE_RELAXED(keys->dk_nentries));
PyDictUnicodeEntry *ep = DK_UNICODE_ENTRIES(keys) + index;
- PyObject *attr_o = FT_ATOMIC_LOAD_PTR_RELAXED(ep->me_value);
+ PyObject *attr_o = FT_ATOMIC_LOAD_PTR_CONSUME(ep->me_value);
if (attr_o == NULL) {
UPDATE_MISS_STATS(LOAD_ATTR);
assert(_PyOpcode_Deopt[opcode] == (LOAD_ATTR));
@@ -9705,7 +9705,7 @@
}
assert(keys->dk_kind == DICT_KEYS_UNICODE);
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(keys);
- PyObject *res_o =
FT_ATOMIC_LOAD_PTR_RELAXED(entries[index].me_value);
+ PyObject *res_o =
FT_ATOMIC_LOAD_PTR_CONSUME(entries[index].me_value);
if (res_o == NULL) {
UPDATE_MISS_STATS(LOAD_GLOBAL);
assert(_PyOpcode_Deopt[opcode] == (LOAD_GLOBAL));
@@ -9772,7 +9772,7 @@
assert(keys->dk_kind == DICT_KEYS_UNICODE);
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(keys);
assert(index < DK_SIZE(keys));
- PyObject *res_o =
FT_ATOMIC_LOAD_PTR_RELAXED(entries[index].me_value);
+ PyObject *res_o =
FT_ATOMIC_LOAD_PTR_CONSUME(entries[index].me_value);
if (res_o == NULL) {
UPDATE_MISS_STATS(LOAD_GLOBAL);
assert(_PyOpcode_Deopt[opcode] == (LOAD_GLOBAL));
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]