#ifndef Py_CPYTHON_PYSTATE_H# error "this header file must not be included directly"#endif#ifdef __cplusplusextern "C" {#endif#include "cpython/initconfig.h"PyAPI_FUNC(int) _PyInterpreterState_RequiresIDRef(PyInterpreterState *);PyAPI_FUNC(void) _PyInterpreterState_RequireIDRef(PyInterpreterState *, int);PyAPI_FUNC(PyObject *) _PyInterpreterState_GetMainModule(PyInterpreterState *);/* State unique per thread *//* Py_tracefunc return -1 when raising an exception, or 0 for success. */typedef int (*Py_tracefunc)(PyObject *, struct _frame *, int, PyObject *);/* The following values are used for 'what' for tracefunc functions** To add a new kind of trace event, also update "trace_init" in* Python/sysmodule.c to define the Python level event name*/#define PyTrace_CALL 0#define PyTrace_EXCEPTION 1#define PyTrace_LINE 2#define PyTrace_RETURN 3#define PyTrace_C_CALL 4#define PyTrace_C_EXCEPTION 5#define PyTrace_C_RETURN 6#define PyTrace_OPCODE 7typedef struct _err_stackitem {/* This struct represents an entry on the exception stack, which is a* per-coroutine state. (Coroutine in the computer science sense,* including the thread and generators).* This ensures that the exception state is not impacted by "yields"* from an except handler.*/PyObject *exc_type, *exc_value, *exc_traceback;struct _err_stackitem *previous_item;} _PyErr_StackItem;// The PyThreadState typedef is in Include/pystate.h.struct _ts {/* See Python/ceval.c for comments explaining most fields */struct _ts *prev;struct _ts *next;PyInterpreterState *interp;struct _frame *frame;int recursion_depth;char overflowed; /* The stack has overflowed. Allow 50 more callsto handle the runtime error. */char recursion_critical; /* The current calls must not causea stack overflow. */int stackcheck_counter;/* 'tracing' keeps track of the execution depth when tracing/profiling.This is to prevent the actual trace/profile code from being recorded inthe trace/profile. */int tracing;int use_tracing;Py_tracefunc c_profilefunc;Py_tracefunc c_tracefunc;PyObject *c_profileobj;PyObject *c_traceobj;/* The exception currently being raised */PyObject *curexc_type;PyObject *curexc_value;PyObject *curexc_traceback;/* The exception currently being handled, if no coroutines/generators* are present. Always last element on the stack referred to be exc_info.*/_PyErr_StackItem exc_state;/* Pointer to the top of the stack of the exceptions currently* being handled */_PyErr_StackItem *exc_info;PyObject *dict; /* Stores per-thread state */int gilstate_counter;PyObject *async_exc; /* Asynchronous exception to raise */unsigned long thread_id; /* Thread id where this tstate was created */int trash_delete_nesting;PyObject *trash_delete_later;/* Called when a thread state is deleted normally, but not when it* is destroyed after fork().* Pain: to prevent rare but fatal shutdown errors (issue 18808),* Thread.join() must wait for the join'ed thread's tstate to be unlinked* from the tstate chain. That happens at the end of a thread's life,* in pystate.c.* The obvious way doesn't quite work: create a lock which the tstate* unlinking code releases, and have Thread.join() wait to acquire that* lock. The problem is that we _are_ at the end of the thread's life:* if the thread holds the last reference to the lock, decref'ing the* lock will delete the lock, and that may trigger arbitrary Python code* if there's a weakref, with a callback, to the lock. But by this time* _PyRuntime.gilstate.tstate_current is already NULL, so only the simplest* of C code can be allowed to run (in particular it must not be possible to* release the GIL).* So instead of holding the lock directly, the tstate holds a weakref to* the lock: that's the value of on_delete_data below. Decref'ing a* weakref is harmless.* on_delete points to _threadmodule.c's static release_sentinel() function.* After the tstate is unlinked, release_sentinel is called with the* weakref-to-lock (on_delete_data) argument, and release_sentinel releases* the indirectly held lock.*/void (*on_delete)(void *);void *on_delete_data;int coroutine_origin_tracking_depth;PyObject *async_gen_firstiter;PyObject *async_gen_finalizer;PyObject *context;uint64_t context_ver;/* Unique thread state id. */uint64_t id;/* XXX signal handlers should also be here */};/* Get the current interpreter state.Issue a fatal error if there no current Python thread state or no currentinterpreter. It cannot return NULL.The caller must hold the GIL.*/PyAPI_FUNC(PyInterpreterState *) _PyInterpreterState_Get(void);PyAPI_FUNC(int) _PyState_AddModule(PyObject*, struct PyModuleDef*);PyAPI_FUNC(void) _PyState_ClearModules(void);PyAPI_FUNC(PyThreadState *) _PyThreadState_Prealloc(PyInterpreterState *);/* Similar to PyThreadState_Get(), but don't issue a fatal error* if it is NULL. */PyAPI_FUNC(PyThreadState *) _PyThreadState_UncheckedGet(void);/* PyGILState *//* Helper/diagnostic function - return 1 if the current threadcurrently holds the GIL, 0 otherwise.The function returns 1 if _PyGILState_check_enabled is non-zero. */PyAPI_FUNC(int) PyGILState_Check(void);/* Get the single PyInterpreterState used by this process' GILStateimplementation.This function doesn't check for error. Return NULL before _PyGILState_Init()is called and after _PyGILState_Fini() is called.See also _PyInterpreterState_Get() and _PyInterpreterState_GET_UNSAFE(). */PyAPI_FUNC(PyInterpreterState *) _PyGILState_GetInterpreterStateUnsafe(void);/* The implementation of sys._current_frames() Returns a dict mappingthread id to that thread's current frame.*/PyAPI_FUNC(PyObject *) _PyThread_CurrentFrames(void);/* Routines for advanced debuggers, requested by David Beazley.Don't use unless you know what you are doing! */PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Main(void);PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Head(void);PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Next(PyInterpreterState *);PyAPI_FUNC(PyThreadState *) PyInterpreterState_ThreadHead(PyInterpreterState *);PyAPI_FUNC(PyThreadState *) PyThreadState_Next(PyThreadState *);typedef struct _frame *(*PyThreadFrameGetter)(PyThreadState *self_);/* cross-interpreter data */struct _xid;// _PyCrossInterpreterData is similar to Py_buffer as an effectively// opaque struct that holds data outside the object machinery. This// is necessary to pass safely between interpreters in the same process.typedef struct _xid {// data is the cross-interpreter-safe derivation of a Python object// (see _PyObject_GetCrossInterpreterData). It will be NULL if the// new_object func (below) encodes the data.void *data;// obj is the Python object from which the data was derived. This// is non-NULL only if the data remains bound to the object in some// way, such that the object must be "released" (via a decref) when// the data is released. In that case the code that sets the field,// likely a registered "crossinterpdatafunc", is responsible for// ensuring it owns the reference (i.e. incref).PyObject *obj;// interp is the ID of the owning interpreter of the original// object. It corresponds to the active interpreter when// _PyObject_GetCrossInterpreterData() was called. This should only// be set by the cross-interpreter machinery.//// We use the ID rather than the PyInterpreterState to avoid issues// with deleted interpreters. Note that IDs are never re-used, so// each one will always correspond to a specific interpreter// (whether still alive or not).int64_t interp;// new_object is a function that returns a new object in the current// interpreter given the data. The resulting object (a new// reference) will be equivalent to the original object. This field// is required.PyObject *(*new_object)(struct _xid *);// free is called when the data is released. If it is NULL then// nothing will be done to free the data. For some types this is// okay (e.g. bytes) and for those types this field should be set// to NULL. However, for most the data was allocated just for// cross-interpreter use, so it must be freed when// _PyCrossInterpreterData_Release is called or the memory will// leak. In that case, at the very least this field should be set// to PyMem_RawFree (the default if not explicitly set to NULL).// The call will happen with the original interpreter activated.void (*free)(void *);} _PyCrossInterpreterData;PyAPI_FUNC(int) _PyObject_GetCrossInterpreterData(PyObject *, _PyCrossInterpreterData *);PyAPI_FUNC(PyObject *) _PyCrossInterpreterData_NewObject(_PyCrossInterpreterData *);PyAPI_FUNC(void) _PyCrossInterpreterData_Release(_PyCrossInterpreterData *);PyAPI_FUNC(int) _PyObject_CheckCrossInterpreterData(PyObject *);/* cross-interpreter data registry */typedef int (*crossinterpdatafunc)(PyObject *, struct _xid *);PyAPI_FUNC(int) _PyCrossInterpreterData_RegisterClass(PyTypeObject *, crossinterpdatafunc);PyAPI_FUNC(crossinterpdatafunc) _PyCrossInterpreterData_Lookup(PyObject *);#ifdef __cplusplus}#endif
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。