diff Python/pystate.c @ 29643:fa97293533a9 legacy-trunk

Add PyThreadState_SetAsyncExc(long, PyObject *). A new API (only accessible from C) to interrupt a thread by sending it an exception. This is not always effective, but might help some people. Requested by Just van Rossum and Alex Martelli. It is intentional that you have to write your own C extension to call it from Python. Docs will have to wait.
author Guido van Rossum <guido@python.org>
date Sat, 28 Jun 2003 21:53:52 +0000
parents 33475661823d
children 014cc362aa91
line wrap: on
line diff
--- a/Python/pystate.c	Sat Jun 28 20:10:26 2003 +0000
+++ b/Python/pystate.c	Sat Jun 28 21:53:52 2003 +0000
@@ -143,6 +143,8 @@
 		tstate->use_tracing = 0;
 		tstate->tick_counter = 0;
 		tstate->gilstate_counter = 0;
+		tstate->async_exc = NULL;
+		tstate->thread_id = PyThread_get_thread_ident();
 
 		tstate->dict = NULL;
 
@@ -179,6 +181,7 @@
 	ZAP(tstate->frame);
 
 	ZAP(tstate->dict);
+	ZAP(tstate->async_exc);
 
 	ZAP(tstate->curexc_type);
 	ZAP(tstate->curexc_value);
@@ -296,6 +299,32 @@
 }
 
 
+/* Asynchronously raise an exception in a thread.
+   Requested by Just van Rossum and Alex Martelli.
+   To prevent naive misuse, you must write your own exception
+   to call this.  Must be called with the GIL held.
+   Returns the number of tstates modified; if it returns a number
+   greater than one, you're in trouble, and you should call it again
+   with exc=NULL to revert the effect.  This raises no exceptions. */
+
+int
+PyThreadState_SetAsyncExc(long id, PyObject *exc) {
+	PyThreadState *tstate = PyThreadState_Get();
+	PyInterpreterState *interp = tstate->interp;
+	PyThreadState *p;
+	int count = 0;
+	for (p = interp->tstate_head; p != NULL; p = p->next) {
+		if (p->thread_id != id)
+			continue;
+		ZAP(p->async_exc);
+		Py_XINCREF(exc);
+		p->async_exc = exc;
+		count += 1;
+	}
+	return count;
+}
+
+
 /* Routines for advanced debuggers, requested by David Beazley.
    Don't use unless you know what you are doing! */
 
@@ -320,6 +349,7 @@
 	return tstate->next;
 }
 
+
 /* Python "auto thread state" API. */
 #ifdef WITH_THREAD