diff options
Diffstat (limited to 'Include/pystate.h')
-rw-r--r-- | Include/pystate.h | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/Include/pystate.h b/Include/pystate.h index 81de569112..5d2ee633fd 100644 --- a/Include/pystate.h +++ b/Include/pystate.h @@ -13,6 +13,9 @@ extern "C" { struct _ts; /* Forward */ struct _is; /* Forward */ +#ifdef Py_LIMITED_API +typedef struct _is PyInterpreterState; +#else typedef struct _is { struct _is *next; @@ -28,6 +31,7 @@ typedef struct _is { PyObject *codec_search_cache; PyObject *codec_error_registry; int codecs_initialized; + int fscodec_initialized; #ifdef HAVE_DLOPEN int dlopenflags; @@ -37,12 +41,14 @@ typedef struct _is { #endif } PyInterpreterState; +#endif /* State unique per thread */ struct _frame; /* Avoid including frameobject.h */ +#ifndef Py_LIMITED_API /* Py_tracefunc return -1 when raising an exception, or 0 for success. */ typedef int (*Py_tracefunc)(PyObject *, struct _frame *, int, PyObject *); @@ -54,7 +60,11 @@ typedef int (*Py_tracefunc)(PyObject *, struct _frame *, int, PyObject *); #define PyTrace_C_CALL 4 #define PyTrace_C_EXCEPTION 5 #define PyTrace_C_RETURN 6 +#endif +#ifdef Py_LIMITED_API +typedef struct _ts PyThreadState; +#else typedef struct _ts { /* See Python/ceval.c for comments explaining most fields */ @@ -88,6 +98,8 @@ typedef struct _ts { PyObject *dict; /* Stores per-thread state */ + /* XXX doesn't mean anything anymore (the comment below is obsolete) + => deprecate or remove? */ /* tick_counter is incremented whenever the check_interval ticker * reaches zero. The purpose is to give a useful measure of the number * of interpreted bytecode instructions in a given thread. This @@ -104,6 +116,7 @@ typedef struct _ts { /* XXX signal handlers should also be here */ } PyThreadState; +#endif PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_New(void); @@ -119,6 +132,7 @@ PyAPI_FUNC(void) PyThreadState_Clear(PyThreadState *); PyAPI_FUNC(void) PyThreadState_Delete(PyThreadState *); #ifdef WITH_THREAD PyAPI_FUNC(void) PyThreadState_DeleteCurrent(void); +PyAPI_FUNC(void) _PyGILState_Reinit(void); #endif PyAPI_FUNC(PyThreadState *) PyThreadState_Get(void); @@ -129,12 +143,17 @@ PyAPI_FUNC(int) PyThreadState_SetAsyncExc(long, PyObject *); /* Variable and macro for in-line access to current thread state */ -PyAPI_DATA(PyThreadState *) _PyThreadState_Current; +/* Assuming the current thread holds the GIL, this is the + PyThreadState for the current thread. */ +#ifndef Py_LIMITED_API +PyAPI_DATA(_Py_atomic_address) _PyThreadState_Current; +#endif -#ifdef Py_DEBUG +#if defined(Py_DEBUG) || defined(Py_LIMITED_API) #define PyThreadState_GET() PyThreadState_Get() #else -#define PyThreadState_GET() (_PyThreadState_Current) +#define PyThreadState_GET() \ + ((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current)) #endif typedef @@ -185,19 +204,25 @@ PyAPI_FUNC(PyThreadState *) PyGILState_GetThisThreadState(void); /* The implementation of sys._current_frames() Returns a dict mapping thread id to that thread's current frame. */ +#ifndef Py_LIMITED_API PyAPI_FUNC(PyObject *) _PyThread_CurrentFrames(void); +#endif /* Routines for advanced debuggers, requested by David Beazley. Don't use unless you know what you are doing! */ +#ifndef Py_LIMITED_API 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_); +#endif /* hook for PyEval_GetFrame(), requested for Psyco */ +#ifndef Py_LIMITED_API PyAPI_DATA(PyThreadFrameGetter) _PyThreadState_GetFrame; +#endif #ifdef __cplusplus } |