mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	gh-109860: Use a New Thread State When Switching Interpreters, When Necessary (gh-110245)
In a few places we switch to another interpreter without knowing if it has a thread state associated with the current thread. For the main interpreter there wasn't much of a problem, but for subinterpreters we were *mostly* okay re-using the tstate created with the interpreter (located via PyInterpreterState_ThreadHead()). There was a good chance that tstate wasn't actually in use by another thread. However, there are no guarantees of that. Furthermore, re-using an already used tstate is currently fragile. To address this, now we create a new thread state in each of those places and use it. One consequence of this change is that PyInterpreterState_ThreadHead() may not return NULL (though that won't happen for the main interpreter).
This commit is contained in:
		
							parent
							
								
									4227bfa8b2
								
							
						
					
					
						commit
						f5198b09e1
					
				
					 8 changed files with 151 additions and 68 deletions
				
			
		|  | @ -1593,8 +1593,11 @@ def _shutdown(): | |||
|         # The main thread isn't finished yet, so its thread state lock can't | ||||
|         # have been released. | ||||
|         assert tlock is not None | ||||
|         assert tlock.locked() | ||||
|         tlock.release() | ||||
|         if tlock.locked(): | ||||
|             # It should have been released already by | ||||
|             # _PyInterpreterState_SetNotRunningMain(), but there may be | ||||
|             # embedders that aren't calling that yet. | ||||
|             tlock.release() | ||||
|         _main_thread._stop() | ||||
|     else: | ||||
|         # bpo-1596321: _shutdown() must be called in the main thread. | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Eric Snow
						Eric Snow