mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	 a7427f2db9
			
		
	
	
		a7427f2db9
		
			
		
	
	
	
	
		
			
			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()
 |