bpo-35886: Make PyInterpreterState an opaque type in the public API. … · python/cpython@be3b295

@@ -17,37 +17,74 @@ extern "C" {

1717

#include "pycore_warnings.h"

1818191920-

/* GIL state */

20+

/* interpreter state */

212122-

struct _gilstate_runtime_state {

23-

int check_enabled;

24-

/* Assuming the current thread holds the GIL, this is the

25-

PyThreadState for the current thread. */

26-

_Py_atomic_address tstate_current;

27-

PyThreadFrameGetter getframe;

28-

/* The single PyInterpreterState used by this process'

29-

GILState implementation

30-

*/

31-

/* TODO: Given interp_main, it may be possible to kill this ref */

32-

PyInterpreterState *autoInterpreterState;

33-

Py_tss_t autoTSSkey;

34-

};

22+

typedef PyObject* (*_PyFrameEvalFunction)(struct _frame *, int);

23+24+

// The PyInterpreterState typedef is in Include/pystate.h.

25+

struct _is {

26+27+

struct _is *next;

28+

struct _ts *tstate_head;

29+30+

int64_t id;

31+

int64_t id_refcount;

32+

PyThread_type_lock id_mutex;

33+34+

PyObject *modules;

35+

PyObject *modules_by_index;

36+

PyObject *sysdict;

37+

PyObject *builtins;

38+

PyObject *importlib;

39+40+

/* Used in Python/sysmodule.c. */

41+

int check_interval;

42+43+

/* Used in Modules/_threadmodule.c. */

44+

long num_threads;

45+

/* Support for runtime thread stack size tuning.

46+

A value of 0 means using the platform's default stack size

47+

or the size specified by the THREAD_STACK_SIZE macro. */

48+

/* Used in Python/thread.c. */

49+

size_t pythread_stacksize;

50+51+

PyObject *codec_search_path;

52+

PyObject *codec_search_cache;

53+

PyObject *codec_error_registry;

54+

int codecs_initialized;

55+

int fscodec_initialized;

56+57+

_PyCoreConfig core_config;

58+

_PyMainInterpreterConfig config;

59+

#ifdef HAVE_DLOPEN

60+

int dlopenflags;

61+

#endif

356236-

/* hook for PyEval_GetFrame(), requested for Psyco */

37-

#define _PyThreadState_GetFrame _PyRuntime.gilstate.getframe

63+

PyObject *builtins_copy;

64+

PyObject *import_func;

65+

/* Initialized to PyEval_EvalFrameDefault(). */

66+

_PyFrameEvalFunction eval_frame;

386739-

/* Issue #26558: Flag to disable PyGILState_Check().

40-

If set to non-zero, PyGILState_Check() always return 1. */

41-

#define _PyGILState_check_enabled _PyRuntime.gilstate.check_enabled

68+

Py_ssize_t co_extra_user_count;

69+

freefunc co_extra_freefuncs[MAX_CO_EXTRA_USERS];

427071+

#ifdef HAVE_FORK

72+

PyObject *before_forkers;

73+

PyObject *after_forkers_parent;

74+

PyObject *after_forkers_child;

75+

#endif

76+

/* AtExit module */

77+

void (*pyexitfunc)(PyObject *);

78+

PyObject *pyexitmodule;

437944-

/* interpreter state */

80+

uint64_t tstate_next_unique_id;

81+

};

458246-

PyAPI_FUNC(PyInterpreterState *) _PyInterpreterState_LookUpID(PY_INT64_T);

83+

PyAPI_FUNC(struct _is*) _PyInterpreterState_LookUpID(PY_INT64_T);

478448-

PyAPI_FUNC(int) _PyInterpreterState_IDInitref(PyInterpreterState *);

49-

PyAPI_FUNC(void) _PyInterpreterState_IDIncref(PyInterpreterState *);

50-

PyAPI_FUNC(void) _PyInterpreterState_IDDecref(PyInterpreterState *);

85+

PyAPI_FUNC(int) _PyInterpreterState_IDInitref(struct _is *);

86+

PyAPI_FUNC(void) _PyInterpreterState_IDIncref(struct _is *);

87+

PyAPI_FUNC(void) _PyInterpreterState_IDDecref(struct _is *);

518852895390

/* cross-interpreter data */

@@ -119,6 +156,30 @@ struct _xidregitem {

119156

};

120157121158159+

/* GIL state */

160+161+

struct _gilstate_runtime_state {

162+

int check_enabled;

163+

/* Assuming the current thread holds the GIL, this is the

164+

PyThreadState for the current thread. */

165+

_Py_atomic_address tstate_current;

166+

PyThreadFrameGetter getframe;

167+

/* The single PyInterpreterState used by this process'

168+

GILState implementation

169+

*/

170+

/* TODO: Given interp_main, it may be possible to kill this ref */

171+

PyInterpreterState *autoInterpreterState;

172+

Py_tss_t autoTSSkey;

173+

};

174+175+

/* hook for PyEval_GetFrame(), requested for Psyco */

176+

#define _PyThreadState_GetFrame _PyRuntime.gilstate.getframe

177+178+

/* Issue #26558: Flag to disable PyGILState_Check().

179+

If set to non-zero, PyGILState_Check() always return 1. */

180+

#define _PyGILState_check_enabled _PyRuntime.gilstate.check_enabled

181+182+122183

/* Full Python runtime state */

123184124185

typedef struct pyruntimestate {