Skip to content

Commit 85404a0

Browse files
[3.15] gh-151228: fix data race on clearing embedded dict values (GH-151330) (#151359)
gh-151228: fix data race on clearing embedded dict values (GH-151330) (cherry picked from commit 6112d70) Co-authored-by: Kumar Aditya <kumaraditya@python.org>
1 parent fdf0132 commit 85404a0

2 files changed

Lines changed: 19 additions & 1 deletion

File tree

Lib/test/test_free_threading/test_dict.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,24 @@ def reader():
296296

297297
threading_helper.run_concurrently([clearer, reader, reader])
298298

299+
def test_racing_embedded_values_clear_and_lookup(self):
300+
class C:
301+
pass
302+
303+
obj = C()
304+
def writer():
305+
for _ in range(1000):
306+
obj.x = 1
307+
obj.y = 2
308+
obj.z = 3
309+
obj.__dict__.clear()
310+
311+
def reader():
312+
for _ in range(1000):
313+
obj.__dict__.get('x')
314+
315+
threading_helper.run_concurrently([writer, reader, reader])
316+
299317
def test_racing_dict_update_and_method_lookup(self):
300318
# gh-144295: test race between dict modifications and method lookups.
301319
# Uses BytesIO because the race requires a type without Py_TPFLAGS_INLINE_VALUES

Objects/dictobject.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3039,7 +3039,7 @@ clear_embedded_values(PyDictValues *values, Py_ssize_t nentries)
30393039
assert(nentries <= SHARED_KEYS_MAX_SIZE);
30403040
for (Py_ssize_t i = 0; i < nentries; i++) {
30413041
refs[i] = values->values[i];
3042-
values->values[i] = NULL;
3042+
FT_ATOMIC_STORE_PTR_RELEASE(values->values[i], NULL);
30433043
}
30443044
values->size = 0;
30453045
for (Py_ssize_t i = 0; i < nentries; i++) {

0 commit comments

Comments
 (0)