summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2001-01-23 01:46:06 (GMT)
committerGuido van Rossum <guido@python.org>2001-01-23 01:46:06 (GMT)
commit2975786decbe2358b088a6200914d7c0a2818e72 (patch)
treee9bcc8b20b211af3c525ef997df7081b04413972
parent5f827f4e9b8cd1117c05246abd4ce7971a94c798 (diff)
downloadcpython-2975786decbe2358b088a6200914d7c0a2818e72.zip
cpython-2975786decbe2358b088a6200914d7c0a2818e72.tar.gz
cpython-2975786decbe2358b088a6200914d7c0a2818e72.tar.bz2
Add a new API, PyThreadState_DeleteCurrent() that combines
PyThreadState_Delete() and PyEval_ReleaseLock(). It is only defined if WITH_THREAD is defined.
-rw-r--r--Include/pystate.h3
-rw-r--r--Python/pystate.c31
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)
{