mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 01:47:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			99 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef Py_INTERNAL_FAULTHANDLER_H
 | |
| #define Py_INTERNAL_FAULTHANDLER_H
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| #ifndef Py_BUILD_CORE
 | |
| #  error "this header requires Py_BUILD_CORE define"
 | |
| #endif
 | |
| 
 | |
| #ifdef HAVE_SIGACTION
 | |
| #  include <signal.h>
 | |
| #endif
 | |
| 
 | |
| 
 | |
| #ifndef MS_WINDOWS
 | |
|    /* register() is useless on Windows, because only SIGSEGV, SIGABRT and
 | |
|       SIGILL can be handled by the process, and these signals can only be used
 | |
|       with enable(), not using register() */
 | |
| #  define FAULTHANDLER_USER
 | |
| #endif
 | |
| 
 | |
| 
 | |
| #ifdef HAVE_SIGACTION
 | |
| /* Using an alternative stack requires sigaltstack()
 | |
|    and sigaction() SA_ONSTACK */
 | |
| #  ifdef HAVE_SIGALTSTACK
 | |
| #    define FAULTHANDLER_USE_ALT_STACK
 | |
| #  endif
 | |
| typedef struct sigaction _Py_sighandler_t;
 | |
| #else
 | |
| typedef PyOS_sighandler_t _Py_sighandler_t;
 | |
| #endif  // HAVE_SIGACTION
 | |
| 
 | |
| 
 | |
| #ifdef FAULTHANDLER_USER
 | |
| struct faulthandler_user_signal {
 | |
|     int enabled;
 | |
|     PyObject *file;
 | |
|     int fd;
 | |
|     int all_threads;
 | |
|     int chain;
 | |
|     _Py_sighandler_t previous;
 | |
|     PyInterpreterState *interp;
 | |
| };
 | |
| #endif /* FAULTHANDLER_USER */
 | |
| 
 | |
| 
 | |
| struct _faulthandler_runtime_state {
 | |
|     struct {
 | |
|         int enabled;
 | |
|         PyObject *file;
 | |
|         int fd;
 | |
|         int all_threads;
 | |
|         PyInterpreterState *interp;
 | |
| #ifdef MS_WINDOWS
 | |
|         void *exc_handler;
 | |
| #endif
 | |
|     } fatal_error;
 | |
| 
 | |
|     struct {
 | |
|         PyObject *file;
 | |
|         int fd;
 | |
|         PY_TIMEOUT_T timeout_us;   /* timeout in microseconds */
 | |
|         int repeat;
 | |
|         PyInterpreterState *interp;
 | |
|         int exit;
 | |
|         char *header;
 | |
|         size_t header_len;
 | |
|         /* The main thread always holds this lock. It is only released when
 | |
|            faulthandler_thread() is interrupted before this thread exits, or at
 | |
|            Python exit. */
 | |
|         PyThread_type_lock cancel_event;
 | |
|         /* released by child thread when joined */
 | |
|         PyThread_type_lock running;
 | |
|     } thread;
 | |
| 
 | |
| #ifdef FAULTHANDLER_USER
 | |
|     struct faulthandler_user_signal *user_signals;
 | |
| #endif
 | |
| 
 | |
| #ifdef FAULTHANDLER_USE_ALT_STACK
 | |
|     stack_t stack;
 | |
|     stack_t old_stack;
 | |
| #endif
 | |
| };
 | |
| 
 | |
| #define _faulthandler_runtime_state_INIT \
 | |
|     { \
 | |
|         .fatal_error = { \
 | |
|             .fd = -1, \
 | |
|         }, \
 | |
|     }
 | |
| 
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| #endif /* !Py_INTERNAL_FAULTHANDLER_H */
 | 
