blob: 83fa7dc33cf618488bee007dac217e314d7eea02 [file] [log] [blame]
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001#ifndef Py_INTERNAL_PYSTATE_H
2#define Py_INTERNAL_PYSTATE_H
3#ifdef __cplusplus
4extern "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
18struct _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;
Masayuki Yamamoto731e1892017-10-06 19:41:34 +090029 Py_tss_t autoTSSkey;
Eric Snow2ebc5ce2017-09-07 23:51:28 -060030};
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
Victor Stinnerb1147e42018-07-21 02:06:16 +020040typedef struct _PyPathConfig {
Victor Stinnerb64de462017-12-01 18:27:09 +010041 /* 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;
Victor Stinner31a83932017-12-04 13:39:15 +010051 /* Python program name */
52 wchar_t *program_name;
53 /* Set by Py_SetPythonHome() or PYTHONHOME environment variable */
54 wchar_t *home;
Victor Stinnerb64de462017-12-01 18:27:09 +010055} _PyPathConfig;
56
Victor Stinner33c377e2017-12-05 15:12:41 +010057#define _PyPathConfig_INIT {.module_search_path = NULL}
58/* Note: _PyPathConfig_INIT sets other fields to 0/NULL */
Victor Stinner31a83932017-12-04 13:39:15 +010059
60PyAPI_DATA(_PyPathConfig) _Py_path_config;
61
Victor Stinnerb1147e42018-07-21 02:06:16 +020062PyAPI_FUNC(_PyInitError) _PyPathConfig_Calculate_impl(
Victor Stinner31a83932017-12-04 13:39:15 +010063 _PyPathConfig *config,
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +010064 const _PyCoreConfig *core_config);
Victor Stinnerb1147e42018-07-21 02:06:16 +020065PyAPI_FUNC(void) _PyPathConfig_ClearGlobal(void);
Victor Stinner0ea395a2017-12-01 20:50:58 +010066
Victor Stinnerb1147e42018-07-21 02:06:16 +020067PyAPI_FUNC(_PyInitError) _Py_wstrlist_append(
68 int *len,
69 wchar_t ***list,
70 const wchar_t *str);
Victor Stinnerb64de462017-12-01 18:27:09 +010071
Eric Snow7f8bfc92018-01-29 18:23:44 -070072/* interpreter state */
73
74PyAPI_FUNC(PyInterpreterState *) _PyInterpreterState_LookUpID(PY_INT64_T);
75
Eric Snow4c6955e2018-02-16 18:53:40 -070076PyAPI_FUNC(int) _PyInterpreterState_IDInitref(PyInterpreterState *);
77PyAPI_FUNC(void) _PyInterpreterState_IDIncref(PyInterpreterState *);
78PyAPI_FUNC(void) _PyInterpreterState_IDDecref(PyInterpreterState *);
79
Eric Snow7f8bfc92018-01-29 18:23:44 -070080
81/* cross-interpreter data */
82
83struct _xid;
84
85// _PyCrossInterpreterData is similar to Py_buffer as an effectively
86// opaque struct that holds data outside the object machinery. This
Eric Snow63799132018-06-01 18:45:20 -060087// is necessary to pass safely between interpreters in the same process.
Eric Snow7f8bfc92018-01-29 18:23:44 -070088typedef struct _xid {
89 // data is the cross-interpreter-safe derivation of a Python object
90 // (see _PyObject_GetCrossInterpreterData). It will be NULL if the
91 // new_object func (below) encodes the data.
92 void *data;
93 // obj is the Python object from which the data was derived. This
94 // is non-NULL only if the data remains bound to the object in some
95 // way, such that the object must be "released" (via a decref) when
Eric Snow63799132018-06-01 18:45:20 -060096 // the data is released. In that case the code that sets the field,
97 // likely a registered "crossinterpdatafunc", is responsible for
98 // ensuring it owns the reference (i.e. incref).
Eric Snow7f8bfc92018-01-29 18:23:44 -070099 PyObject *obj;
100 // interp is the ID of the owning interpreter of the original
101 // object. It corresponds to the active interpreter when
102 // _PyObject_GetCrossInterpreterData() was called. This should only
103 // be set by the cross-interpreter machinery.
104 //
105 // We use the ID rather than the PyInterpreterState to avoid issues
106 // with deleted interpreters.
107 int64_t interp;
108 // new_object is a function that returns a new object in the current
109 // interpreter given the data. The resulting object (a new
110 // reference) will be equivalent to the original object. This field
111 // is required.
112 PyObject *(*new_object)(struct _xid *);
113 // free is called when the data is released. If it is NULL then
114 // nothing will be done to free the data. For some types this is
115 // okay (e.g. bytes) and for those types this field should be set
116 // to NULL. However, for most the data was allocated just for
117 // cross-interpreter use, so it must be freed when
118 // _PyCrossInterpreterData_Release is called or the memory will
119 // leak. In that case, at the very least this field should be set
120 // to PyMem_RawFree (the default if not explicitly set to NULL).
121 // The call will happen with the original interpreter activated.
122 void (*free)(void *);
123} _PyCrossInterpreterData;
124
125typedef int (*crossinterpdatafunc)(PyObject *, _PyCrossInterpreterData *);
126PyAPI_FUNC(int) _PyObject_CheckCrossInterpreterData(PyObject *);
127
128PyAPI_FUNC(int) _PyObject_GetCrossInterpreterData(PyObject *, _PyCrossInterpreterData *);
129PyAPI_FUNC(PyObject *) _PyCrossInterpreterData_NewObject(_PyCrossInterpreterData *);
130PyAPI_FUNC(void) _PyCrossInterpreterData_Release(_PyCrossInterpreterData *);
131
132/* cross-interpreter data registry */
133
134/* For now we use a global registry of shareable classes. An
135 alternative would be to add a tp_* slot for a class's
136 crossinterpdatafunc. It would be simpler and more efficient. */
137
138PyAPI_FUNC(int) _PyCrossInterpreterData_Register_Class(PyTypeObject *, crossinterpdatafunc);
139PyAPI_FUNC(crossinterpdatafunc) _PyCrossInterpreterData_Lookup(PyObject *);
140
141struct _xidregitem;
142
143struct _xidregitem {
144 PyTypeObject *cls;
145 crossinterpdatafunc getdata;
146 struct _xidregitem *next;
147};
148
149
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600150/* Full Python runtime state */
151
152typedef struct pyruntimestate {
153 int initialized;
154 int core_initialized;
155 PyThreadState *finalizing;
156
157 struct pyinterpreters {
158 PyThread_type_lock mutex;
159 PyInterpreterState *head;
160 PyInterpreterState *main;
161 /* _next_interp_id is an auto-numbered sequence of small
162 integers. It gets initialized in _PyInterpreterState_Init(),
163 which is called in Py_Initialize(), and used in
164 PyInterpreterState_New(). A negative interpreter ID
165 indicates an error occurred. The main interpreter will
166 always have an ID of 0. Overflow results in a RuntimeError.
167 If that becomes a problem later then we can adjust, e.g. by
168 using a Python int. */
169 int64_t next_id;
170 } interpreters;
Eric Snow7f8bfc92018-01-29 18:23:44 -0700171 // XXX Remove this field once we have a tp_* slot.
172 struct _xidregistry {
173 PyThread_type_lock mutex;
174 struct _xidregitem *head;
175 } xidregistry;
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600176
177#define NEXITFUNCS 32
178 void (*exitfuncs[NEXITFUNCS])(void);
179 int nexitfuncs;
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600180
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600181 struct _gc_runtime_state gc;
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600182 struct _warnings_runtime_state warnings;
183 struct _ceval_runtime_state ceval;
184 struct _gilstate_runtime_state gilstate;
185
186 // XXX Consolidate globals found via the check-c-globals script.
187} _PyRuntimeState;
188
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800189#define _PyRuntimeState_INIT {.initialized = 0, .core_initialized = 0}
Victor Stinner33c377e2017-12-05 15:12:41 +0100190/* Note: _PyRuntimeState_INIT sets other fields to 0/NULL */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800191
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600192PyAPI_DATA(_PyRuntimeState) _PyRuntime;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800193PyAPI_FUNC(_PyInitError) _PyRuntimeState_Init(_PyRuntimeState *);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600194PyAPI_FUNC(void) _PyRuntimeState_Fini(_PyRuntimeState *);
195
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800196/* Initialize _PyRuntimeState.
197 Return NULL on success, or return an error message on failure. */
198PyAPI_FUNC(_PyInitError) _PyRuntime_Initialize(void);
199
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600200#define _Py_CURRENTLY_FINALIZING(tstate) \
201 (_PyRuntime.finalizing == tstate)
202
203
204/* Other */
205
Victor Stinnera7368ac2017-11-15 18:11:45 -0800206PyAPI_FUNC(_PyInitError) _PyInterpreterState_Enable(_PyRuntimeState *);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600207
208#ifdef __cplusplus
209}
210#endif
211#endif /* !Py_INTERNAL_PYSTATE_H */