blob: 38845d32ecafab2ff5ae3091d5e83976edddf68b [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"
Eric Snow2ebc5ce2017-09-07 23:51:28 -06008#include "pythread.h"
9
10#include "internal/mem.h"
11#include "internal/ceval.h"
12#include "internal/warnings.h"
13
14
15/* GIL state */
16
17struct _gilstate_runtime_state {
18 int check_enabled;
19 /* Assuming the current thread holds the GIL, this is the
20 PyThreadState for the current thread. */
21 _Py_atomic_address tstate_current;
22 PyThreadFrameGetter getframe;
23 /* The single PyInterpreterState used by this process'
24 GILState implementation
25 */
26 /* TODO: Given interp_main, it may be possible to kill this ref */
27 PyInterpreterState *autoInterpreterState;
Masayuki Yamamoto731e1892017-10-06 19:41:34 +090028 Py_tss_t autoTSSkey;
Eric Snow2ebc5ce2017-09-07 23:51:28 -060029};
30
31/* hook for PyEval_GetFrame(), requested for Psyco */
32#define _PyThreadState_GetFrame _PyRuntime.gilstate.getframe
33
34/* Issue #26558: Flag to disable PyGILState_Check().
35 If set to non-zero, PyGILState_Check() always return 1. */
36#define _PyGILState_check_enabled _PyRuntime.gilstate.check_enabled
37
38
Victor Stinnerb1147e42018-07-21 02:06:16 +020039typedef struct _PyPathConfig {
Victor Stinnerb64de462017-12-01 18:27:09 +010040 /* Full path to the Python program */
41 wchar_t *program_full_path;
42 wchar_t *prefix;
43#ifdef MS_WINDOWS
44 wchar_t *dll_path;
45#else
46 wchar_t *exec_prefix;
47#endif
48 /* Set by Py_SetPath(), or computed by _PyPathConfig_Init() */
49 wchar_t *module_search_path;
Victor Stinner31a83932017-12-04 13:39:15 +010050 /* Python program name */
51 wchar_t *program_name;
52 /* Set by Py_SetPythonHome() or PYTHONHOME environment variable */
53 wchar_t *home;
Victor Stinnerd19d8d52018-07-24 13:55:48 +020054 /* isolated and site_import are used to set Py_IsolatedFlag and
Victor Stinnerf2626ce2018-07-21 03:54:20 +020055 Py_NoSiteFlag flags on Windows in read_pth_file(). These fields
56 are ignored when their value are equal to -1 (unset). */
57 int isolated;
Victor Stinnerd19d8d52018-07-24 13:55:48 +020058 int site_import;
Victor Stinnerb64de462017-12-01 18:27:09 +010059} _PyPathConfig;
60
Victor Stinnerf2626ce2018-07-21 03:54:20 +020061#define _PyPathConfig_INIT \
62 {.module_search_path = NULL, \
63 .isolated = -1, \
Victor Stinnerd19d8d52018-07-24 13:55:48 +020064 .site_import = -1}
Victor Stinner33c377e2017-12-05 15:12:41 +010065/* Note: _PyPathConfig_INIT sets other fields to 0/NULL */
Victor Stinner31a83932017-12-04 13:39:15 +010066
67PyAPI_DATA(_PyPathConfig) _Py_path_config;
68
Victor Stinnerb1147e42018-07-21 02:06:16 +020069PyAPI_FUNC(_PyInitError) _PyPathConfig_Calculate_impl(
Victor Stinner31a83932017-12-04 13:39:15 +010070 _PyPathConfig *config,
Victor Stinnerb5fd9ad2017-12-14 02:20:52 +010071 const _PyCoreConfig *core_config);
Victor Stinnerb1147e42018-07-21 02:06:16 +020072PyAPI_FUNC(void) _PyPathConfig_ClearGlobal(void);
Victor Stinner0ea395a2017-12-01 20:50:58 +010073
Victor Stinner6c785c02018-08-01 17:56:14 +020074PyAPI_FUNC(void) _Py_wstrlist_clear(
75 int len,
76 wchar_t **list);
77PyAPI_FUNC(wchar_t**) _Py_wstrlist_copy(
78 int len,
79 wchar_t **list);
Victor Stinnerb1147e42018-07-21 02:06:16 +020080PyAPI_FUNC(_PyInitError) _Py_wstrlist_append(
81 int *len,
82 wchar_t ***list,
83 const wchar_t *str);
Victor Stinnerb64de462017-12-01 18:27:09 +010084
Eric Snow7f8bfc92018-01-29 18:23:44 -070085/* interpreter state */
86
87PyAPI_FUNC(PyInterpreterState *) _PyInterpreterState_LookUpID(PY_INT64_T);
88
Eric Snow4c6955e2018-02-16 18:53:40 -070089PyAPI_FUNC(int) _PyInterpreterState_IDInitref(PyInterpreterState *);
90PyAPI_FUNC(void) _PyInterpreterState_IDIncref(PyInterpreterState *);
91PyAPI_FUNC(void) _PyInterpreterState_IDDecref(PyInterpreterState *);
92
Eric Snow7f8bfc92018-01-29 18:23:44 -070093
94/* cross-interpreter data */
95
96struct _xid;
97
98// _PyCrossInterpreterData is similar to Py_buffer as an effectively
99// opaque struct that holds data outside the object machinery. This
Eric Snow63799132018-06-01 18:45:20 -0600100// is necessary to pass safely between interpreters in the same process.
Eric Snow7f8bfc92018-01-29 18:23:44 -0700101typedef struct _xid {
102 // data is the cross-interpreter-safe derivation of a Python object
103 // (see _PyObject_GetCrossInterpreterData). It will be NULL if the
104 // new_object func (below) encodes the data.
105 void *data;
106 // obj is the Python object from which the data was derived. This
107 // is non-NULL only if the data remains bound to the object in some
108 // way, such that the object must be "released" (via a decref) when
Eric Snow63799132018-06-01 18:45:20 -0600109 // the data is released. In that case the code that sets the field,
110 // likely a registered "crossinterpdatafunc", is responsible for
111 // ensuring it owns the reference (i.e. incref).
Eric Snow7f8bfc92018-01-29 18:23:44 -0700112 PyObject *obj;
113 // interp is the ID of the owning interpreter of the original
114 // object. It corresponds to the active interpreter when
115 // _PyObject_GetCrossInterpreterData() was called. This should only
116 // be set by the cross-interpreter machinery.
117 //
118 // We use the ID rather than the PyInterpreterState to avoid issues
119 // with deleted interpreters.
120 int64_t interp;
121 // new_object is a function that returns a new object in the current
122 // interpreter given the data. The resulting object (a new
123 // reference) will be equivalent to the original object. This field
124 // is required.
125 PyObject *(*new_object)(struct _xid *);
126 // free is called when the data is released. If it is NULL then
127 // nothing will be done to free the data. For some types this is
128 // okay (e.g. bytes) and for those types this field should be set
129 // to NULL. However, for most the data was allocated just for
130 // cross-interpreter use, so it must be freed when
131 // _PyCrossInterpreterData_Release is called or the memory will
132 // leak. In that case, at the very least this field should be set
133 // to PyMem_RawFree (the default if not explicitly set to NULL).
134 // The call will happen with the original interpreter activated.
135 void (*free)(void *);
136} _PyCrossInterpreterData;
137
138typedef int (*crossinterpdatafunc)(PyObject *, _PyCrossInterpreterData *);
139PyAPI_FUNC(int) _PyObject_CheckCrossInterpreterData(PyObject *);
140
141PyAPI_FUNC(int) _PyObject_GetCrossInterpreterData(PyObject *, _PyCrossInterpreterData *);
142PyAPI_FUNC(PyObject *) _PyCrossInterpreterData_NewObject(_PyCrossInterpreterData *);
143PyAPI_FUNC(void) _PyCrossInterpreterData_Release(_PyCrossInterpreterData *);
144
145/* cross-interpreter data registry */
146
147/* For now we use a global registry of shareable classes. An
148 alternative would be to add a tp_* slot for a class's
149 crossinterpdatafunc. It would be simpler and more efficient. */
150
151PyAPI_FUNC(int) _PyCrossInterpreterData_Register_Class(PyTypeObject *, crossinterpdatafunc);
152PyAPI_FUNC(crossinterpdatafunc) _PyCrossInterpreterData_Lookup(PyObject *);
153
154struct _xidregitem;
155
156struct _xidregitem {
157 PyTypeObject *cls;
158 crossinterpdatafunc getdata;
159 struct _xidregitem *next;
160};
161
162
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600163/* Full Python runtime state */
164
165typedef struct pyruntimestate {
166 int initialized;
167 int core_initialized;
168 PyThreadState *finalizing;
169
170 struct pyinterpreters {
171 PyThread_type_lock mutex;
172 PyInterpreterState *head;
173 PyInterpreterState *main;
174 /* _next_interp_id is an auto-numbered sequence of small
175 integers. It gets initialized in _PyInterpreterState_Init(),
176 which is called in Py_Initialize(), and used in
177 PyInterpreterState_New(). A negative interpreter ID
178 indicates an error occurred. The main interpreter will
179 always have an ID of 0. Overflow results in a RuntimeError.
180 If that becomes a problem later then we can adjust, e.g. by
181 using a Python int. */
182 int64_t next_id;
183 } interpreters;
Eric Snow7f8bfc92018-01-29 18:23:44 -0700184 // XXX Remove this field once we have a tp_* slot.
185 struct _xidregistry {
186 PyThread_type_lock mutex;
187 struct _xidregitem *head;
188 } xidregistry;
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600189
190#define NEXITFUNCS 32
191 void (*exitfuncs[NEXITFUNCS])(void);
192 int nexitfuncs;
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600193
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600194 struct _gc_runtime_state gc;
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600195 struct _warnings_runtime_state warnings;
196 struct _ceval_runtime_state ceval;
197 struct _gilstate_runtime_state gilstate;
198
199 // XXX Consolidate globals found via the check-c-globals script.
200} _PyRuntimeState;
201
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800202#define _PyRuntimeState_INIT {.initialized = 0, .core_initialized = 0}
Victor Stinner33c377e2017-12-05 15:12:41 +0100203/* Note: _PyRuntimeState_INIT sets other fields to 0/NULL */
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800204
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600205PyAPI_DATA(_PyRuntimeState) _PyRuntime;
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800206PyAPI_FUNC(_PyInitError) _PyRuntimeState_Init(_PyRuntimeState *);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600207PyAPI_FUNC(void) _PyRuntimeState_Fini(_PyRuntimeState *);
208
Victor Stinnerf7e5b562017-11-15 15:48:08 -0800209/* Initialize _PyRuntimeState.
210 Return NULL on success, or return an error message on failure. */
211PyAPI_FUNC(_PyInitError) _PyRuntime_Initialize(void);
212
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600213#define _Py_CURRENTLY_FINALIZING(tstate) \
214 (_PyRuntime.finalizing == tstate)
215
216
217/* Other */
218
Victor Stinnera7368ac2017-11-15 18:11:45 -0800219PyAPI_FUNC(_PyInitError) _PyInterpreterState_Enable(_PyRuntimeState *);
Eric Snow59032962018-09-14 14:17:20 -0700220PyAPI_FUNC(void) _PyInterpreterState_DeleteExceptMain(void);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600221
222#ifdef __cplusplus
223}
224#endif
225#endif /* !Py_INTERNAL_PYSTATE_H */