mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	Issue #11223: Fix test_threadsignals to fail, not hang, when the
non-semaphore implementation of locks is used under POSIX.
This commit is contained in:
		
							parent
							
								
									0def5c6907
								
							
						
					
					
						commit
						d3cccd2a60
					
				
					 2 changed files with 20 additions and 2 deletions
				
			
		| 
						 | 
					@ -73,18 +73,29 @@ def alarm_interrupt(self, sig, frame):
 | 
				
			||||||
    def test_lock_acquire_interruption(self):
 | 
					    def test_lock_acquire_interruption(self):
 | 
				
			||||||
        # Mimic receiving a SIGINT (KeyboardInterrupt) with SIGALRM while stuck
 | 
					        # Mimic receiving a SIGINT (KeyboardInterrupt) with SIGALRM while stuck
 | 
				
			||||||
        # in a deadlock.
 | 
					        # in a deadlock.
 | 
				
			||||||
 | 
					        # XXX this test can fail when the legacy (non-semaphore) implementation
 | 
				
			||||||
 | 
					        # of locks is used in thread_pthread.h, see issue #11223.
 | 
				
			||||||
        oldalrm = signal.signal(signal.SIGALRM, self.alarm_interrupt)
 | 
					        oldalrm = signal.signal(signal.SIGALRM, self.alarm_interrupt)
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            lock = thread.allocate_lock()
 | 
					            lock = thread.allocate_lock()
 | 
				
			||||||
            lock.acquire()
 | 
					            lock.acquire()
 | 
				
			||||||
            signal.alarm(1)
 | 
					            signal.alarm(1)
 | 
				
			||||||
            self.assertRaises(KeyboardInterrupt, lock.acquire)
 | 
					            t1 = time.time()
 | 
				
			||||||
 | 
					            self.assertRaises(KeyboardInterrupt, lock.acquire, timeout=5)
 | 
				
			||||||
 | 
					            dt = time.time() - t1
 | 
				
			||||||
 | 
					            # Checking that KeyboardInterrupt was raised is not sufficient.
 | 
				
			||||||
 | 
					            # We want to assert that lock.acquire() was interrupted because
 | 
				
			||||||
 | 
					            # of the signal, not that the signal handler was called immediately
 | 
				
			||||||
 | 
					            # after timeout return of lock.acquire() (which can fool assertRaises).
 | 
				
			||||||
 | 
					            self.assertLess(dt, 3.0)
 | 
				
			||||||
        finally:
 | 
					        finally:
 | 
				
			||||||
            signal.signal(signal.SIGALRM, oldalrm)
 | 
					            signal.signal(signal.SIGALRM, oldalrm)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_rlock_acquire_interruption(self):
 | 
					    def test_rlock_acquire_interruption(self):
 | 
				
			||||||
        # Mimic receiving a SIGINT (KeyboardInterrupt) with SIGALRM while stuck
 | 
					        # Mimic receiving a SIGINT (KeyboardInterrupt) with SIGALRM while stuck
 | 
				
			||||||
        # in a deadlock.
 | 
					        # in a deadlock.
 | 
				
			||||||
 | 
					        # XXX this test can fail when the legacy (non-semaphore) implementation
 | 
				
			||||||
 | 
					        # of locks is used in thread_pthread.h, see issue #11223.
 | 
				
			||||||
        oldalrm = signal.signal(signal.SIGALRM, self.alarm_interrupt)
 | 
					        oldalrm = signal.signal(signal.SIGALRM, self.alarm_interrupt)
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            rlock = thread.RLock()
 | 
					            rlock = thread.RLock()
 | 
				
			||||||
| 
						 | 
					@ -98,7 +109,11 @@ def other_thread():
 | 
				
			||||||
                rlock.release()
 | 
					                rlock.release()
 | 
				
			||||||
                time.sleep(0.01)
 | 
					                time.sleep(0.01)
 | 
				
			||||||
            signal.alarm(1)
 | 
					            signal.alarm(1)
 | 
				
			||||||
            self.assertRaises(KeyboardInterrupt, rlock.acquire)
 | 
					            t1 = time.time()
 | 
				
			||||||
 | 
					            self.assertRaises(KeyboardInterrupt, rlock.acquire, timeout=5)
 | 
				
			||||||
 | 
					            dt = time.time() - t1
 | 
				
			||||||
 | 
					            # See rationale above in test_lock_acquire_interruption
 | 
				
			||||||
 | 
					            self.assertLess(dt, 3.0)
 | 
				
			||||||
        finally:
 | 
					        finally:
 | 
				
			||||||
            signal.signal(signal.SIGALRM, oldalrm)
 | 
					            signal.signal(signal.SIGALRM, oldalrm)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -92,6 +92,9 @@ Tools/Demos
 | 
				
			||||||
Tests
 | 
					Tests
 | 
				
			||||||
-----
 | 
					-----
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Issue #11223: Fix test_threadsignals to fail, not hang, when the
 | 
				
			||||||
 | 
					  non-semaphore implementation of locks is used under POSIX.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Issue #10911: Add tests on CGI with non-ASCII characters. Patch written by
 | 
					- Issue #10911: Add tests on CGI with non-ASCII characters. Patch written by
 | 
				
			||||||
  Pierre Quentel.
 | 
					  Pierre Quentel.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue