import unittest
-from threading import Thread
+from threading import Thread, Barrier
from unittest import TestCase
from test.support import threading_helper
for reader in readers:
reader.join()
+ def test_store_list_int(self):
+ def copy_back_and_forth(b, l):
+ b.wait()
+ for _ in range(100):
+ l[0] = l[1]
+ l[1] = l[0]
+
+ l = [0, 1]
+ barrier = Barrier(NTHREAD)
+ threads = [Thread(target=copy_back_and_forth, args=(barrier, l))
+ for _ in range(NTHREAD)]
+ with threading_helper.start_threads(threads):
+ pass
+
if __name__ == "__main__":
unittest.main()
STAT_INC(STORE_SUBSCR, hit);
PyObject *old_value = PyList_GET_ITEM(list, index);
- PyList_SET_ITEM(list, index, PyStackRef_AsPyObjectSteal(value));
+ FT_ATOMIC_STORE_PTR_RELEASE(_PyList_ITEMS(list)[index],
+ PyStackRef_AsPyObjectSteal(value));
assert(old_value != NULL);
UNLOCK_OBJECT(list); // unlock before decrefs!
PyStackRef_CLOSE_SPECIALIZED(sub_st, _PyLong_ExactDealloc);
}
STAT_INC(STORE_SUBSCR, hit);
PyObject *old_value = PyList_GET_ITEM(list, index);
- PyList_SET_ITEM(list, index, PyStackRef_AsPyObjectSteal(value));
+ FT_ATOMIC_STORE_PTR_RELEASE(_PyList_ITEMS(list)[index],
+ PyStackRef_AsPyObjectSteal(value));
assert(old_value != NULL);
UNLOCK_OBJECT(list); // unlock before decrefs!
PyStackRef_CLOSE_SPECIALIZED(sub_st, _PyLong_ExactDealloc);
}
STAT_INC(STORE_SUBSCR, hit);
PyObject *old_value = PyList_GET_ITEM(list, index);
- PyList_SET_ITEM(list, index, PyStackRef_AsPyObjectSteal(value));
+ FT_ATOMIC_STORE_PTR_RELEASE(_PyList_ITEMS(list)[index],
+ PyStackRef_AsPyObjectSteal(value));
assert(old_value != NULL);
UNLOCK_OBJECT(list); // unlock before decrefs!
PyStackRef_CLOSE_SPECIALIZED(sub_st, _PyLong_ExactDealloc);