50 lines
1.2 KiB
C
50 lines
1.2 KiB
C
|
/***********************************************************************
|
||
|
* 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);
|
||
|
}
|