mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	gh-111964: Implement stop-the-world pauses (gh-112471)
The `--disable-gil` builds occasionally need to pause all but one thread. Some examples include: * Cyclic garbage collection, where this is often called a "stop the world event" * Before calling `fork()`, to ensure a consistent state for internal data structures * During interpreter shutdown, to ensure that daemon threads aren't accessing Python objects This adds the following functions to implement global and per-interpreter pauses: * `_PyEval_StopTheWorldAll()` and `_PyEval_StartTheWorldAll()` (for the global runtime) * `_PyEval_StopTheWorld()` and `_PyEval_StartTheWorld()` (per-interpreter) (The function names may change.) These functions are no-ops outside of the `--disable-gil` build.
This commit is contained in:
		
							parent
							
								
									5f1997896d
								
							
						
					
					
						commit
						441affc9e7
					
				
					 10 changed files with 336 additions and 29 deletions
				
			
		|  | @ -949,6 +949,15 @@ _Py_HandlePending(PyThreadState *tstate) | |||
| { | ||||
|     PyInterpreterState *interp = tstate->interp; | ||||
| 
 | ||||
|     /* Stop-the-world */ | ||||
|     if (_Py_eval_breaker_bit_is_set(interp, _PY_EVAL_PLEASE_STOP_BIT)) { | ||||
|         _Py_set_eval_breaker_bit(interp, _PY_EVAL_PLEASE_STOP_BIT, 0); | ||||
|         _PyThreadState_Suspend(tstate); | ||||
| 
 | ||||
|         /* The attach blocks until the stop-the-world event is complete. */ | ||||
|         _PyThreadState_Attach(tstate); | ||||
|     } | ||||
| 
 | ||||
|     /* Pending signals */ | ||||
|     if (_Py_eval_breaker_bit_is_set(interp, _PY_SIGNALS_PENDING_BIT)) { | ||||
|         if (handle_signals(tstate) != 0) { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Sam Gross
						Sam Gross