@@ -73,75 +73,6 @@ PyAPI_FUNC(int) _PyInterpreterState_IDInitref(PyInterpreterState *);
73
73
PyAPI_FUNC (void ) _PyInterpreterState_IDIncref (PyInterpreterState * );
74
74
PyAPI_FUNC (void ) _PyInterpreterState_IDDecref (PyInterpreterState * );
75
75
76
-
77
- /* cross-interpreter data */
78
-
79
- struct _xid ;
80
-
81
- // _PyCrossInterpreterData is similar to Py_buffer as an effectively
82
- // opaque struct that holds data outside the object machinery. This
83
- // is necessary to pass between interpreters in the same process.
84
- typedef struct _xid {
85
- // data is the cross-interpreter-safe derivation of a Python object
86
- // (see _PyObject_GetCrossInterpreterData). It will be NULL if the
87
- // new_object func (below) encodes the data.
88
- void * data ;
89
- // obj is the Python object from which the data was derived. This
90
- // is non-NULL only if the data remains bound to the object in some
91
- // way, such that the object must be "released" (via a decref) when
92
- // the data is released. In that case it is automatically
93
- // incref'ed (to match the automatic decref when releaed).
94
- PyObject * obj ;
95
- // interp is the ID of the owning interpreter of the original
96
- // object. It corresponds to the active interpreter when
97
- // _PyObject_GetCrossInterpreterData() was called. This should only
98
- // be set by the cross-interpreter machinery.
99
- //
100
- // We use the ID rather than the PyInterpreterState to avoid issues
101
- // with deleted interpreters.
102
- int64_t interp ;
103
- // new_object is a function that returns a new object in the current
104
- // interpreter given the data. The resulting object (a new
105
- // reference) will be equivalent to the original object. This field
106
- // is required.
107
- PyObject * (* new_object )(struct _xid * );
108
- // free is called when the data is released. If it is NULL then
109
- // nothing will be done to free the data. For some types this is
110
- // okay (e.g. bytes) and for those types this field should be set
111
- // to NULL. However, for most the data was allocated just for
112
- // cross-interpreter use, so it must be freed when
113
- // _PyCrossInterpreterData_Release is called or the memory will
114
- // leak. In that case, at the very least this field should be set
115
- // to PyMem_RawFree (the default if not explicitly set to NULL).
116
- // The call will happen with the original interpreter activated.
117
- void (* free )(void * );
118
- } _PyCrossInterpreterData ;
119
-
120
- typedef int (* crossinterpdatafunc )(PyObject * , _PyCrossInterpreterData * );
121
- PyAPI_FUNC (int ) _PyObject_CheckCrossInterpreterData (PyObject * );
122
-
123
- PyAPI_FUNC (int ) _PyObject_GetCrossInterpreterData (PyObject * , _PyCrossInterpreterData * );
124
- PyAPI_FUNC (PyObject * ) _PyCrossInterpreterData_NewObject (_PyCrossInterpreterData * );
125
- PyAPI_FUNC (void ) _PyCrossInterpreterData_Release (_PyCrossInterpreterData * );
126
-
127
- /* cross-interpreter data registry */
128
-
129
- /* For now we use a global registry of shareable classes. An
130
- alternative would be to add a tp_* slot for a class's
131
- crossinterpdatafunc. It would be simpler and more efficient. */
132
-
133
- PyAPI_FUNC (int ) _PyCrossInterpreterData_Register_Class (PyTypeObject * , crossinterpdatafunc );
134
- PyAPI_FUNC (crossinterpdatafunc ) _PyCrossInterpreterData_Lookup (PyObject * );
135
-
136
- struct _xidregitem ;
137
-
138
- struct _xidregitem {
139
- PyTypeObject * cls ;
140
- crossinterpdatafunc getdata ;
141
- struct _xidregitem * next ;
142
- };
143
-
144
-
145
76
/* Full Python runtime state */
146
77
147
78
typedef struct pyruntimestate {
@@ -163,11 +94,6 @@ typedef struct pyruntimestate {
163
94
using a Python int. */
164
95
int64_t next_id ;
165
96
} interpreters ;
166
- // XXX Remove this field once we have a tp_* slot.
167
- struct _xidregistry {
168
- PyThread_type_lock mutex ;
169
- struct _xidregitem * head ;
170
- } xidregistry ;
171
97
172
98
#define NEXITFUNCS 32
173
99
void (* exitfuncs [NEXITFUNCS ])(void );
0 commit comments