From 2975786decbe2358b088a6200914d7c0a2818e72 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 23 Jan 2001 01:46:06 +0000 Subject: Add a new API, PyThreadState_DeleteCurrent() that combines PyThreadState_Delete() and PyEval_ReleaseLock(). It is only defined if WITH_THREAD is defined. --- Include/pystate.h | 3 +++ Python/pystate.c | 31 +++++++++++++++++++++++++++---- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/Include/pystate.h b/Include/pystate.h index be56497..27ffe32 100644 --- a/Include/pystate.h +++ b/Include/pystate.h @@ -66,6 +66,9 @@ DL_IMPORT(void) PyInterpreterState_Delete(PyInterpreterState *); DL_IMPORT(PyThreadState *) PyThreadState_New(PyInterpreterState *); DL_IMPORT(void) PyThreadState_Clear(PyThreadState *); DL_IMPORT(void) PyThreadState_Delete(PyThreadState *); +#ifdef WITH_THREAD +DL_IMPORT(void) PyThreadState_DeleteCurrent(void); +#endif DL_IMPORT(PyThreadState *) PyThreadState_Get(void); DL_IMPORT(PyThreadState *) PyThreadState_Swap(PyThreadState *); diff --git a/Python/pystate.c b/Python/pystate.c index 0651ab0..8e5896a 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -157,15 +157,14 @@ PyThreadState_Clear(PyThreadState *tstate) } -void -PyThreadState_Delete(PyThreadState *tstate) +/* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */ +static void +tstate_delete_common(PyThreadState *tstate) { PyInterpreterState *interp; PyThreadState **p; if (tstate == NULL) Py_FatalError("PyThreadState_Delete: NULL tstate"); - if (tstate == _PyThreadState_Current) - Py_FatalError("PyThreadState_Delete: tstate is still current"); interp = tstate->interp; if (interp == NULL) Py_FatalError("PyThreadState_Delete: NULL interp"); @@ -183,6 +182,30 @@ PyThreadState_Delete(PyThreadState *tstate) } +void +PyThreadState_Delete(PyThreadState *tstate) +{ + if (tstate == _PyThreadState_Current) + Py_FatalError("PyThreadState_Delete: tstate is still current"); + tstate_delete_common(tstate); +} + + +#ifdef WITH_THREAD +void +PyThreadState_DeleteCurrent() +{ + PyThreadState *tstate = _PyThreadState_Current; + if (tstate == NULL) + Py_FatalError( + "PyThreadState_DeleteCurrent: no current tstate"); + _PyThreadState_Current = NULL; + tstate_delete_common(tstate); + PyEval_ReleaseLock(); +} +#endif /* WITH_THREAD */ + + PyThreadState * PyThreadState_Get(void) { -- cgit v0.12