A interruptmodule.c
M setup.py
Implements an interrupt extension module which allows a subthread
to raise an interrupt in the main thread.
diff --git a/Lib/idlelib/interruptmodule.c b/Lib/idlelib/interruptmodule.c
new file mode 100644
index 0000000..8e18d5a
--- /dev/null
+++ b/Lib/idlelib/interruptmodule.c
@@ -0,0 +1,49 @@
+/***********************************************************************
+ *  interruptmodule.c
+ *
+ *  Python extension implementing the interrupt module.
+ *  
+ **********************************************************************/
+
+#include "Python.h"
+
+#ifndef PyDoc_STR
+#define PyDoc_VAR(name) static char name[]
+#define PyDoc_STR(str) str
+#define PyDoc_STRVAR(name,str) PyDoc_VAR(name) = PyDoc_STR(str)
+#endif
+
+/* module documentation */
+
+PyDoc_STRVAR(module_doc,
+"Provide a way to interrupt the main thread from a subthread.\n\n\
+In threaded Python code the KeyboardInterrupt is always directed to\n\
+the thread which raised it.  This extension provides a method,\n\
+interrupt_main, which a subthread can use to raise a KeyboardInterrupt\n\
+in the main thread.");
+
+/* module functions */
+
+static PyObject *
+setinterrupt(PyObject * self, PyObject * args)
+{
+	PyErr_SetInterrupt();
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+/* registration table */
+
+static struct PyMethodDef methods[] = {
+	{"interrupt_main", setinterrupt, METH_VARARGS,
+	 PyDoc_STR("Interrupt the main thread")},
+	{NULL, NULL}
+};
+
+/* module initialization */
+
+void
+initinterrupt(void)
+{
+	(void) Py_InitModule3("interrupt", methods, module_doc);
+}