mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +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
 |