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