callback crashing python
Bryan
belred at gmail.com
Thu Oct 19 18:22:29 EDT 2006
Bryan wrote:
> hi,
>
> i have a multithreaded c server that calls process_method in a different
> c thread per each call. process_method calls a python function bar in
> module foo. function bar calls back into c. i've removed all the type
> error handling and simplified the code to hopefully show a minimum
> amount of code. when only one request is hitting the server at a time
> this works correctly even at fast speeds. but as soon as a second
> request is made concurrently, the python24.dll will crash and
> session.callback() in the python code never returns. i've tried
> wrapping the callback code in PyGILState_Ensure(), PyEval_SaveThread()
> without success.
>
> does anyone know what i have to do to the c callback to prevent python
> from crashing?
>
> thanks,
>
> bryan
>
>
> static void process_method(session *session)
> {
> PyObject *py_obj_session = NULL;
> PyObject *py_mod_foo = NULL;
> PyObject *py_call_bar = NULL;
> PyThreadState *py_interp = NULL;
>
> py_interp = get_py_interpreter(session);
> PyEval_AcquireLock();
> PyThreadState_Swap(py_interp);
> py_obj_session = get_py_session(session);
>
> py_mod_foo = PyImport_ImportModule("foo");
> py_call_bar = PyObject_GetAttrString(py_mod_foo, "bar");
> PyObject_CallFunctionObjArgs(py_call_bar, py_obj_session, NULL);
>
> Py_XDECREF(py_call_bar);
> Py_XDECREF(py_mod_foo);
> Py_XDECREF(py_obj_session);
>
> PyThreadState_Swap(NULL);
> PyEval_ReleaseLock();
> }
>
>
> # module bar
>
> def bar(session):
> session.callback()
>
>
>
> /* session.callback() /*
> static PyObject* callback(PyObject *self, PyObject *args)
> {
> Py_INCREF(Py_None);
> return Py_None;
> }
>
update... it's still crashing even without the callback.
function bar is now changed to something like this:
def bar(session):
return 1
i'm calling this c method process_method concurrently in two process
where each process is sending requests at a rate of approximately 100
per second. each request is processed on the server side in it's own c
thread. when the crash happens, it appears that the python code
successfully completes. in other words, it never crashes in the middle
of function bar. is PyEval_AquireLock, PyThreadState_Swap thread safe
across c threads?
thanks,
bryan
More information about the Python-list
mailing list