Home | History | Annotate | Download | only in internal
      1 #ifndef Py_INTERNAL_PYSTATE_H
      2 #define Py_INTERNAL_PYSTATE_H
      3 #ifdef __cplusplus
      4 extern "C" {
      5 #endif
      6 
      7 #include "pystate.h"
      8 #include "pyatomic.h"
      9 #include "pythread.h"
     10 
     11 #include "internal/mem.h"
     12 #include "internal/ceval.h"
     13 #include "internal/warnings.h"
     14 
     15 
     16 /* GIL state */
     17 
     18 struct _gilstate_runtime_state {
     19     int check_enabled;
     20     /* Assuming the current thread holds the GIL, this is the
     21        PyThreadState for the current thread. */
     22     _Py_atomic_address tstate_current;
     23     PyThreadFrameGetter getframe;
     24     /* The single PyInterpreterState used by this process'
     25        GILState implementation
     26     */
     27     /* TODO: Given interp_main, it may be possible to kill this ref */
     28     PyInterpreterState *autoInterpreterState;
     29     Py_tss_t autoTSSkey;
     30 };
     31 
     32 /* hook for PyEval_GetFrame(), requested for Psyco */
     33 #define _PyThreadState_GetFrame _PyRuntime.gilstate.getframe
     34 
     35 /* Issue #26558: Flag to disable PyGILState_Check().
     36    If set to non-zero, PyGILState_Check() always return 1. */
     37 #define _PyGILState_check_enabled _PyRuntime.gilstate.check_enabled
     38 
     39 
     40 typedef struct {
     41     /* Full path to the Python program */
     42     wchar_t *program_full_path;
     43     wchar_t *prefix;
     44 #ifdef MS_WINDOWS
     45     wchar_t *dll_path;
     46 #else
     47     wchar_t *exec_prefix;
     48 #endif
     49     /* Set by Py_SetPath(), or computed by _PyPathConfig_Init() */
     50     wchar_t *module_search_path;
     51     /* Python program name */
     52     wchar_t *program_name;
     53     /* Set by Py_SetPythonHome() or PYTHONHOME environment variable */
     54     wchar_t *home;
     55 } _PyPathConfig;
     56 
     57 #define _PyPathConfig_INIT {.module_search_path = NULL}
     58 /* Note: _PyPathConfig_INIT sets other fields to 0/NULL */
     59 
     60 PyAPI_DATA(_PyPathConfig) _Py_path_config;
     61 
     62 PyAPI_FUNC(_PyInitError) _PyPathConfig_Calculate(
     63     _PyPathConfig *config,
     64     const _PyCoreConfig *core_config);
     65 PyAPI_FUNC(void) _PyPathConfig_Clear(_PyPathConfig *config);
     66 
     67 
     68 /* interpreter state */
     69 
     70 PyAPI_FUNC(PyInterpreterState *) _PyInterpreterState_LookUpID(PY_INT64_T);
     71 
     72 PyAPI_FUNC(int) _PyInterpreterState_IDInitref(PyInterpreterState *);
     73 PyAPI_FUNC(void) _PyInterpreterState_IDIncref(PyInterpreterState *);
     74 PyAPI_FUNC(void) _PyInterpreterState_IDDecref(PyInterpreterState *);
     75 
     76 /* Full Python runtime state */
     77 
     78 typedef struct pyruntimestate {
     79     int initialized;
     80     int core_initialized;
     81     PyThreadState *finalizing;
     82 
     83     struct pyinterpreters {
     84         PyThread_type_lock mutex;
     85         PyInterpreterState *head;
     86         PyInterpreterState *main;
     87         /* _next_interp_id is an auto-numbered sequence of small
     88            integers.  It gets initialized in _PyInterpreterState_Init(),
     89            which is called in Py_Initialize(), and used in
     90            PyInterpreterState_New().  A negative interpreter ID
     91            indicates an error occurred.  The main interpreter will
     92            always have an ID of 0.  Overflow results in a RuntimeError.
     93            If that becomes a problem later then we can adjust, e.g. by
     94            using a Python int. */
     95         int64_t next_id;
     96     } interpreters;
     97 
     98 #define NEXITFUNCS 32
     99     void (*exitfuncs[NEXITFUNCS])(void);
    100     int nexitfuncs;
    101 
    102     struct _gc_runtime_state gc;
    103     struct _warnings_runtime_state warnings;
    104     struct _ceval_runtime_state ceval;
    105     struct _gilstate_runtime_state gilstate;
    106 
    107     // XXX Consolidate globals found via the check-c-globals script.
    108 } _PyRuntimeState;
    109 
    110 #define _PyRuntimeState_INIT {.initialized = 0, .core_initialized = 0}
    111 /* Note: _PyRuntimeState_INIT sets other fields to 0/NULL */
    112 
    113 PyAPI_DATA(_PyRuntimeState) _PyRuntime;
    114 PyAPI_FUNC(_PyInitError) _PyRuntimeState_Init(_PyRuntimeState *);
    115 PyAPI_FUNC(void) _PyRuntimeState_Fini(_PyRuntimeState *);
    116 
    117 /* Initialize _PyRuntimeState.
    118    Return NULL on success, or return an error message on failure. */
    119 PyAPI_FUNC(_PyInitError) _PyRuntime_Initialize(void);
    120 
    121 #define _Py_CURRENTLY_FINALIZING(tstate) \
    122     (_PyRuntime.finalizing == tstate)
    123 
    124 
    125 /* Other */
    126 
    127 PyAPI_FUNC(_PyInitError) _PyInterpreterState_Enable(_PyRuntimeState *);
    128 
    129 #ifdef __cplusplus
    130 }
    131 #endif
    132 #endif /* !Py_INTERNAL_PYSTATE_H */
    133