mirror of https://github.com/python/cpython
67 lines
1.3 KiB
C
67 lines
1.3 KiB
C
#ifndef Py_INTERNAL_ATEXIT_H
|
|
#define Py_INTERNAL_ATEXIT_H
|
|
|
|
#include "pycore_lock.h" // PyMutex
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#ifndef Py_BUILD_CORE
|
|
# error "this header requires Py_BUILD_CORE define"
|
|
#endif
|
|
|
|
|
|
//###############
|
|
// runtime atexit
|
|
|
|
typedef void (*atexit_callbackfunc)(void);
|
|
|
|
struct _atexit_runtime_state {
|
|
PyMutex mutex;
|
|
#define NEXITFUNCS 32
|
|
atexit_callbackfunc callbacks[NEXITFUNCS];
|
|
int ncallbacks;
|
|
};
|
|
|
|
|
|
//###################
|
|
// interpreter atexit
|
|
|
|
typedef void (*atexit_datacallbackfunc)(void *);
|
|
|
|
typedef struct atexit_callback {
|
|
atexit_datacallbackfunc func;
|
|
void *data;
|
|
struct atexit_callback *next;
|
|
} atexit_callback;
|
|
|
|
typedef struct {
|
|
PyObject *func;
|
|
PyObject *args;
|
|
PyObject *kwargs;
|
|
} atexit_py_callback;
|
|
|
|
struct atexit_state {
|
|
atexit_callback *ll_callbacks;
|
|
atexit_callback *last_ll_callback;
|
|
|
|
// XXX The rest of the state could be moved to the atexit module state
|
|
// and a low-level callback added for it during module exec.
|
|
// For the moment we leave it here.
|
|
atexit_py_callback **callbacks;
|
|
int ncallbacks;
|
|
int callback_len;
|
|
};
|
|
|
|
// Export for '_xxinterpchannels' shared extension
|
|
PyAPI_FUNC(int) _Py_AtExit(
|
|
PyInterpreterState *interp,
|
|
atexit_datacallbackfunc func,
|
|
void *data);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif /* !Py_INTERNAL_ATEXIT_H */
|