// 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 // 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, 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 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 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 // 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