mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	bpo-41686: Always create the SIGINT event on Windows (GH-23344) (GH-23347)
bpo-41686, bpo-41713: On Windows, the SIGINT event, _PyOS_SigintEvent(), is now created even if Python is configured to not install signal handlers (PyConfig.install_signal_handlers=0 or Py_InitializeEx(0)).
This commit is contained in:
		
							parent
							
								
									ac472b316c
								
							
						
					
					
						commit
						05a5d697f4
					
				
					 4 changed files with 54 additions and 30 deletions
				
			
		|  | @ -68,6 +68,7 @@ extern void _PyFloat_Fini(void); | |||
| extern void _PySlice_Fini(void); | ||||
| extern void _PyAsyncGen_Fini(void); | ||||
| 
 | ||||
| extern int _PySignal_Init(int install_signal_handlers); | ||||
| extern void PyOS_FiniInterrupts(void); | ||||
| 
 | ||||
| extern void _PyExc_Fini(void); | ||||
|  |  | |||
|  | @ -0,0 +1,4 @@ | |||
| On Windows, the ``SIGINT`` event, ``_PyOS_SigintEvent()``, is now created | ||||
| even if Python is configured to not install signal handlers (if | ||||
| :c:member:`PyConfig.install_signal_handlers` equals to 0, or | ||||
| ``Py_InitializeEx(0)``). | ||||
|  | @ -1632,11 +1632,6 @@ PyInit__signal(void) | |||
|          goto finally; | ||||
| #endif | ||||
| 
 | ||||
| #ifdef MS_WINDOWS | ||||
|     /* Create manual-reset event, initially unset */ | ||||
|     sigint_event = CreateEvent(NULL, TRUE, FALSE, FALSE); | ||||
| #endif | ||||
| 
 | ||||
|     if (PyErr_Occurred()) { | ||||
|         Py_DECREF(m); | ||||
|         m = NULL; | ||||
|  | @ -1773,6 +1768,53 @@ PyOS_InitInterrupts(void) | |||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| static int | ||||
| signal_install_handlers(void) | ||||
| { | ||||
| #ifdef SIGPIPE | ||||
|     PyOS_setsig(SIGPIPE, SIG_IGN); | ||||
| #endif | ||||
| #ifdef SIGXFZ | ||||
|     PyOS_setsig(SIGXFZ, SIG_IGN); | ||||
| #endif | ||||
| #ifdef SIGXFSZ | ||||
|     PyOS_setsig(SIGXFSZ, SIG_IGN); | ||||
| #endif | ||||
| 
 | ||||
|     // Import _signal to install the Python SIGINT handler
 | ||||
|     PyObject *module = PyImport_ImportModule("_signal"); | ||||
|     if (!module) { | ||||
|         return -1; | ||||
|     } | ||||
|     Py_DECREF(module); | ||||
| 
 | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| int | ||||
| _PySignal_Init(int install_signal_handlers) | ||||
| { | ||||
| #ifdef MS_WINDOWS | ||||
|     /* Create manual-reset event, initially unset */ | ||||
|     sigint_event = CreateEvent(NULL, TRUE, FALSE, FALSE); | ||||
|     if (sigint_event == NULL) { | ||||
|         PyErr_SetFromWindowsErr(0); | ||||
|         return -1; | ||||
|     } | ||||
| #endif | ||||
| 
 | ||||
|     if (install_signal_handlers) { | ||||
|         if (signal_install_handlers() < 0) { | ||||
|             return -1; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void | ||||
| PyOS_FiniInterrupts(void) | ||||
| { | ||||
|  |  | |||
|  | @ -57,7 +57,6 @@ static PyStatus add_main_module(PyInterpreterState *interp); | |||
| static PyStatus init_import_site(void); | ||||
| static PyStatus init_set_builtins_open(void); | ||||
| static PyStatus init_sys_streams(PyThreadState *tstate); | ||||
| static PyStatus init_signals(PyThreadState *tstate); | ||||
| static void call_py_exitfuncs(PyThreadState *tstate); | ||||
| static void wait_for_thread_shutdown(PyThreadState *tstate); | ||||
| static void call_ll_exitfuncs(_PyRuntimeState *runtime); | ||||
|  | @ -1013,11 +1012,8 @@ init_interp_main(PyThreadState *tstate) | |||
|     } | ||||
| 
 | ||||
|     if (is_main_interp) { | ||||
|         if (config->install_signal_handlers) { | ||||
|             status = init_signals(tstate); | ||||
|             if (_PyStatus_EXCEPTION(status)) { | ||||
|                 return status; | ||||
|             } | ||||
|         if (_PySignal_Init(config->install_signal_handlers) < 0) { | ||||
|             return _PyStatus_ERR("can't initialize signals"); | ||||
|         } | ||||
| 
 | ||||
|         if (_PyTraceMalloc_Init(config->tracemalloc) < 0) { | ||||
|  | @ -2442,25 +2438,6 @@ Py_Exit(int sts) | |||
|     exit(sts); | ||||
| } | ||||
| 
 | ||||
| static PyStatus | ||||
| init_signals(PyThreadState *tstate) | ||||
| { | ||||
| #ifdef SIGPIPE | ||||
|     PyOS_setsig(SIGPIPE, SIG_IGN); | ||||
| #endif | ||||
| #ifdef SIGXFZ | ||||
|     PyOS_setsig(SIGXFZ, SIG_IGN); | ||||
| #endif | ||||
| #ifdef SIGXFSZ | ||||
|     PyOS_setsig(SIGXFSZ, SIG_IGN); | ||||
| #endif | ||||
|     PyOS_InitInterrupts(); /* May imply init_signals() */ | ||||
|     if (_PyErr_Occurred(tstate)) { | ||||
|         return _PyStatus_ERR("can't import signal"); | ||||
|     } | ||||
|     return _PyStatus_OK(); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /* Restore signals that the interpreter has called SIG_IGN on to SIG_DFL.
 | ||||
|  * | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Victor Stinner
						Victor Stinner