bpo-36818: Add PyInterpreterState.runtime field. (gh-13129) · python/cpython@396e0a8 (original) (raw)
`@@ -217,8 +217,9 @@ _PyEval_FiniThreads(struct _ceval_runtime_state *ceval)
`
217
217
`}
`
218
218
``
219
219
`static inline void
`
220
``
`-
exit_thread_if_finalizing(_PyRuntimeState *runtime, PyThreadState *tstate)
`
``
220
`+
exit_thread_if_finalizing(PyThreadState *tstate)
`
221
221
`{
`
``
222
`+
_PyRuntimeState *runtime = tstate->interp->runtime;
`
222
223
`/* _Py_Finalizing is protected by the GIL */
`
223
224
`if (runtime->finalizing != NULL && !_Py_CURRENTLY_FINALIZING(runtime, tstate)) {
`
224
225
`drop_gil(&runtime->ceval, tstate);
`
`@@ -236,7 +237,7 @@ PyEval_AcquireLock(void)
`
236
237
`Py_FatalError("PyEval_AcquireLock: current thread state is NULL");
`
237
238
` }
`
238
239
`take_gil(ceval, tstate);
`
239
``
`-
exit_thread_if_finalizing(runtime, tstate);
`
``
240
`+
exit_thread_if_finalizing(tstate);
`
240
241
`}
`
241
242
``
242
243
`void
`
`@@ -257,14 +258,15 @@ PyEval_AcquireThread(PyThreadState *tstate)
`
257
258
`if (tstate == NULL) {
`
258
259
`Py_FatalError("PyEval_AcquireThread: NULL new thread state");
`
259
260
` }
`
``
261
`+
assert(tstate->interp != NULL);
`
260
262
``
261
``
`-
_PyRuntimeState *runtime = &_PyRuntime;
`
``
263
`+
_PyRuntimeState *runtime = tstate->interp->runtime;
`
262
264
`struct _ceval_runtime_state *ceval = &runtime->ceval;
`
263
265
``
264
266
`/* Check someone has called PyEval_InitThreads() to create the lock */
`
265
267
`assert(gil_created(&ceval->gil));
`
266
268
`take_gil(ceval, tstate);
`
267
``
`-
exit_thread_if_finalizing(runtime, tstate);
`
``
269
`+
exit_thread_if_finalizing(tstate);
`
268
270
`if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) {
`
269
271
`Py_FatalError("PyEval_AcquireThread: non-NULL old thread state");
`
270
272
` }
`
`@@ -276,8 +278,9 @@ PyEval_ReleaseThread(PyThreadState *tstate)
`
276
278
`if (tstate == NULL) {
`
277
279
`Py_FatalError("PyEval_ReleaseThread: NULL thread state");
`
278
280
` }
`
``
281
`+
assert(tstate->interp != NULL);
`
279
282
``
280
``
`-
_PyRuntimeState *runtime = &_PyRuntime;
`
``
283
`+
_PyRuntimeState *runtime = tstate->interp->runtime;
`
281
284
`PyThreadState *new_tstate = _PyThreadState_Swap(&runtime->gilstate, NULL);
`
282
285
`if (new_tstate != tstate) {
`
283
286
`Py_FatalError("PyEval_ReleaseThread: wrong thread state");
`
`@@ -308,7 +311,7 @@ _PyEval_ReInitThreads(_PyRuntimeState *runtime)
`
308
311
` }
`
309
312
``
310
313
`/* Destroy all threads except the current one */
`
311
``
`-
_PyThreadState_DeleteExcept(runtime, current_tstate);
`
``
314
`+
_PyThreadState_DeleteExcept(current_tstate);
`
312
315
`}
`
313
316
``
314
317
`/* This function is used to signal that async exceptions are waiting to be
`
`@@ -337,17 +340,18 @@ PyEval_SaveThread(void)
`
337
340
`void
`
338
341
`PyEval_RestoreThread(PyThreadState *tstate)
`
339
342
`{
`
340
``
`-
_PyRuntimeState *runtime = &_PyRuntime;
`
341
``
`-
struct _ceval_runtime_state *ceval = &runtime->ceval;
`
342
``
-
343
343
`if (tstate == NULL) {
`
344
344
`Py_FatalError("PyEval_RestoreThread: NULL tstate");
`
345
345
` }
`
``
346
`+
assert(tstate->interp != NULL);
`
``
347
+
``
348
`+
_PyRuntimeState *runtime = tstate->interp->runtime;
`
``
349
`+
struct _ceval_runtime_state *ceval = &runtime->ceval;
`
346
350
`assert(gil_created(&ceval->gil));
`
347
351
``
348
352
`int err = errno;
`
349
353
`take_gil(ceval, tstate);
`
350
``
`-
exit_thread_if_finalizing(runtime, tstate);
`
``
354
`+
exit_thread_if_finalizing(tstate);
`
351
355
`errno = err;
`
352
356
``
353
357
`_PyThreadState_Swap(&runtime->gilstate, tstate);
`
`@@ -1141,7 +1145,7 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag)
`
1141
1145
`take_gil(ceval, tstate);
`
1142
1146
``
1143
1147
`/* Check if we should make a quick exit. */
`
1144
``
`-
exit_thread_if_finalizing(runtime, tstate);
`
``
1148
`+
exit_thread_if_finalizing(tstate);
`
1145
1149
``
1146
1150
`if (_PyThreadState_Swap(&runtime->gilstate, tstate) != NULL) {
`
1147
1151
`Py_FatalError("ceval: orphan tstate");
`