import unittest from collections import deque from copy import copy from test.support import threading_helper threading_helper.requires_working_threading(module=True) class TestDeque(unittest.TestCase): def test_copy_race(self): # gh-144809: Test that deque copy is thread safe. It previously # could raise a "deque mutated during iteration" error. d = deque(range(100)) def mutate(): for i in range(1000): d.append(i) if len(d) > 200: d.popleft() def copy_loop(): for _ in range(1000): copy(d) threading_helper.run_concurrently([mutate, copy_loop]) def test_index_race_in_ac(self): # gh-150750: There was a c_default specified as `Py_SIZE(self)`, # it was used without a critical section. d = deque(range(100)) def index(): for _ in range(10000): try: d.index(50) except ValueError: pass def mutate(): for _ in range(10000): d.append(0) d.clear() d.extend(range(100)) d.appendleft(-1) threading_helper.run_concurrently( [index, *[mutate for _ in range(3)]], ) if __name__ == "__main__": unittest.main()