From c09fc0d1e73bb80f74fed99aaeba0238f7e1dff5 Mon Sep 17 00:00:00 2001 From: necoro <> Date: Fri, 15 Sep 2006 21:10:36 +0000 Subject: Added Thread-Module and made the "refresh" working --- geneticone/modules/geneticthread.c | 62 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 geneticone/modules/geneticthread.c (limited to 'geneticone/modules') diff --git a/geneticone/modules/geneticthread.c b/geneticone/modules/geneticthread.c new file mode 100644 index 0000000..33520a6 --- /dev/null +++ b/geneticone/modules/geneticthread.c @@ -0,0 +1,62 @@ +/* + * This is a python module implementing real threads. + */ +#include +#include + +/** + * Callback for the thread. Just calls the argument's python function. + */ +static void * thread_cb (void * arg) +{ + PyObject * arglist; + + arglist = Py_BuildValue("()",NULL); + PyEval_CallObject((PyObject*)arg, arglist); + Py_DECREF(arglist); + Py_DECREF((PyObject*)arg); + + return NULL; +} + +/** + * Function called from the python application. + */ +static PyObject * thread_start (PyObject * self, PyObject *args) +{ + PyObject *temp; + pthread_t ID; + + if (PyArg_ParseTuple(args, "O:thread_start", &temp)) // get argument + { + if (!PyCallable_Check(temp)) // not callable + { + PyErr_SetString(PyExc_TypeError, "parameter must be callable"); + return NULL; + } + Py_INCREF(temp); /* Add a reference to new callback */ + int status = pthread_create(&ID, NULL, thread_cb, (void*) temp); + if (status) + { + PyErr_SetString(PyExc_SystemError, "error during thread start"); + return NULL; + } + } + + Py_RETURN_NONE; +} + +static PyMethodDef ThreadMethods[] = { + {"thread_start", thread_start, METH_VARARGS, + "Start a new thread."}, + {NULL, NULL, 0, NULL} /* Sentinel */ +}; + +/** + * Init function. + */ +PyMODINIT_FUNC +initgeneticthread(void) +{ + (void) Py_InitModule("geneticthread", ThreadMethods); +} -- cgit v1.2.3-70-g09d2