diff options
author | necoro <> | 2006-09-15 21:10:36 +0000 |
---|---|---|
committer | necoro <> | 2006-09-15 21:10:36 +0000 |
commit | c09fc0d1e73bb80f74fed99aaeba0238f7e1dff5 (patch) | |
tree | a448cc90de643d67ab4e8b1ea0314c93e4d7345f /geneticone/modules/geneticthread.c | |
parent | 8c13070474488b86f1213f6be3948f0dc84836f9 (diff) | |
download | portato-c09fc0d1e73bb80f74fed99aaeba0238f7e1dff5.tar.gz portato-c09fc0d1e73bb80f74fed99aaeba0238f7e1dff5.tar.bz2 portato-c09fc0d1e73bb80f74fed99aaeba0238f7e1dff5.zip |
Added Thread-Module and made the "refresh" working
Diffstat (limited to 'geneticone/modules/geneticthread.c')
-rw-r--r-- | geneticone/modules/geneticthread.c | 62 |
1 files changed, 62 insertions, 0 deletions
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 <Python.h> +#include <pthread.h> + +/** + * 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); +} |