mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 02:15:10 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			108 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // Define Py_NSIG constant for signal handling.
 | |
| 
 | |
| #ifndef Py_INTERNAL_SIGNAL_H
 | |
| #define Py_INTERNAL_SIGNAL_H
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| #ifndef Py_BUILD_CORE
 | |
| #  error "this header requires Py_BUILD_CORE define"
 | |
| #endif
 | |
| 
 | |
| #include <signal.h>               // NSIG
 | |
| 
 | |
| 
 | |
| // Restore signals that the interpreter has called SIG_IGN on to SIG_DFL.
 | |
| // Export for '_posixsubprocess' shared extension.
 | |
| PyAPI_FUNC(void) _Py_RestoreSignals(void);
 | |
| 
 | |
| #ifdef _SIG_MAXSIG
 | |
|    // gh-91145: On FreeBSD, <signal.h> defines NSIG as 32: it doesn't include
 | |
|    // realtime signals: [SIGRTMIN,SIGRTMAX]. Use _SIG_MAXSIG instead. For
 | |
|    // example on x86-64 FreeBSD 13, SIGRTMAX is 126 and _SIG_MAXSIG is 128.
 | |
| #  define Py_NSIG _SIG_MAXSIG
 | |
| #elif defined(NSIG)
 | |
| #  define Py_NSIG NSIG
 | |
| #elif defined(_NSIG)
 | |
| #  define Py_NSIG _NSIG            // BSD/SysV
 | |
| #elif defined(_SIGMAX)
 | |
| #  define Py_NSIG (_SIGMAX + 1)    // QNX
 | |
| #elif defined(SIGMAX)
 | |
| #  define Py_NSIG (SIGMAX + 1)     // djgpp
 | |
| #else
 | |
| #  define Py_NSIG 64               // Use a reasonable default value
 | |
| #endif
 | |
| 
 | |
| #define INVALID_FD (-1)
 | |
| 
 | |
| struct _signals_runtime_state {
 | |
|     struct {
 | |
|         // tripped and func should be accessed using atomic ops.
 | |
|         int tripped;
 | |
|         PyObject* func;
 | |
|     } handlers[Py_NSIG];
 | |
| 
 | |
|     volatile struct {
 | |
| #ifdef MS_WINDOWS
 | |
|         /* This would be "SOCKET fd" if <winsock2.h> were always included.
 | |
|            It isn't so we must cast to SOCKET where appropriate. */
 | |
|         volatile int fd;
 | |
| #elif defined(__VXWORKS__)
 | |
|         int fd;
 | |
| #else
 | |
|         sig_atomic_t fd;
 | |
| #endif
 | |
| 
 | |
|         int warn_on_full_buffer;
 | |
| #ifdef MS_WINDOWS
 | |
|         int use_send;
 | |
| #endif
 | |
|     } wakeup;
 | |
| 
 | |
|     /* Speed up sigcheck() when none tripped.
 | |
|        is_tripped should be accessed using atomic ops. */
 | |
|     int is_tripped;
 | |
| 
 | |
|     /* These objects necessarily belong to the main interpreter. */
 | |
|     PyObject *default_handler;
 | |
|     PyObject *ignore_handler;
 | |
| 
 | |
| #ifdef MS_WINDOWS
 | |
|     /* This would be "HANDLE sigint_event" if <windows.h> were always included.
 | |
|        It isn't so we must cast to HANDLE everywhere "sigint_event" is used. */
 | |
|     void *sigint_event;
 | |
| #endif
 | |
| 
 | |
|     /* True if the main interpreter thread exited due to an unhandled
 | |
|      * KeyboardInterrupt exception, suggesting the user pressed ^C. */
 | |
|     int unhandled_keyboard_interrupt;
 | |
| };
 | |
| 
 | |
| #ifdef MS_WINDOWS
 | |
| # define _signals_WAKEUP_INIT \
 | |
|     {.fd = INVALID_FD, .warn_on_full_buffer = 1, .use_send = 0}
 | |
| #else
 | |
| # define _signals_WAKEUP_INIT \
 | |
|     {.fd = INVALID_FD, .warn_on_full_buffer = 1}
 | |
| #endif
 | |
| 
 | |
| #define _signals_RUNTIME_INIT \
 | |
|     { \
 | |
|         .wakeup = _signals_WAKEUP_INIT, \
 | |
|     }
 | |
| 
 | |
| 
 | |
| // Export for '_multiprocessing' shared extension
 | |
| PyAPI_FUNC(int) _PyOS_IsMainThread(void);
 | |
| 
 | |
| #ifdef MS_WINDOWS
 | |
| // <windows.h> is not included by Python.h so use void* instead of HANDLE.
 | |
| // Export for '_multiprocessing' shared extension
 | |
| PyAPI_FUNC(void*) _PyOS_SigintEvent(void);
 | |
| #endif
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| #endif  // !Py_INTERNAL_SIGNAL_H
 | 
