| /*********************************************************************** |
| * 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); |
| } |