mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	The call to `PySequence_List()` could temporarily unlock and relock the
set, allowing the items to be cleared and return the incorrect
notation `{}` for a empty set (it should be `set()`).
Co-authored-by: T. Wouters <thomas@python.org>
		
	
			
		
			
				
	
	
		
			41 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import unittest
 | 
						|
 | 
						|
from threading import Thread, Barrier
 | 
						|
from unittest import TestCase
 | 
						|
 | 
						|
from test.support import threading_helper
 | 
						|
 | 
						|
 | 
						|
@threading_helper.requires_working_threading()
 | 
						|
class TestSet(TestCase):
 | 
						|
    def test_repr_clear(self):
 | 
						|
        """Test repr() of a set while another thread is calling clear()"""
 | 
						|
        NUM_ITERS = 10
 | 
						|
        NUM_REPR_THREADS = 10
 | 
						|
        barrier = Barrier(NUM_REPR_THREADS + 1)
 | 
						|
        s = {1, 2, 3, 4, 5, 6, 7, 8}
 | 
						|
 | 
						|
        def clear_set():
 | 
						|
            barrier.wait()
 | 
						|
            s.clear()
 | 
						|
 | 
						|
        def repr_set():
 | 
						|
            barrier.wait()
 | 
						|
            set_reprs.append(repr(s))
 | 
						|
 | 
						|
        for _ in range(NUM_ITERS):
 | 
						|
            set_reprs = []
 | 
						|
            threads = [Thread(target=clear_set)]
 | 
						|
            for _ in range(NUM_REPR_THREADS):
 | 
						|
                threads.append(Thread(target=repr_set))
 | 
						|
            for t in threads:
 | 
						|
                t.start()
 | 
						|
            for t in threads:
 | 
						|
                t.join()
 | 
						|
 | 
						|
            for set_repr in set_reprs:
 | 
						|
                self.assertIn(set_repr, ("set()", "{1, 2, 3, 4, 5, 6, 7, 8}"))
 | 
						|
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    unittest.main()
 |