diff options
author | John (J5) Palmieri <johnp@redhat.com> | 2005-06-28 19:36:51 +0000 |
---|---|---|
committer | John (J5) Palmieri <johnp@redhat.com> | 2005-06-28 19:36:51 +0000 |
commit | a3406a82793298943c02f4b4088a9ef5b35f0279 (patch) | |
tree | 75074eda0eadb8921bfab72f046ae431883d422d /python | |
parent | c17dc995ce22d873c7e2410b71cf96833d9bb58a (diff) |
* python/dbus_bindings.pyx.in (cunregister_function_handler,
cmessage_function_handler): Patch from
Anthony Baxter <anthony@interlink.com.au> fixes threading problems
by using the Py_GILState_Ensure/Release to synchronize with the
python runtime.
Diffstat (limited to 'python')
-rw-r--r-- | python/dbus_bindings.pyx.in | 60 |
1 files changed, 36 insertions, 24 deletions
diff --git a/python/dbus_bindings.pyx.in b/python/dbus_bindings.pyx.in index 3c819934..34341c4a 100644 --- a/python/dbus_bindings.pyx.in +++ b/python/dbus_bindings.pyx.in @@ -34,6 +34,10 @@ cdef extern from "Python.h": void Py_XINCREF (object) void Py_XDECREF (object) object PyString_FromStringAndSize(char *, int) + ctypedef void *PyGILState_STATE + void PyErr_Clear() + PyGILState_STATE PyGILState_Ensure() + void PyGILState_Release(PyGILState_STATE) ctypedef struct DBusError: char *name @@ -158,38 +162,46 @@ cdef class MessageIter cdef void cunregister_function_handler (DBusConnection *connection, void *user_data): cdef Connection conn - tup = <object>user_data - assert (type(tup) == list) - function = tup[1] - conn = Connection() - conn.__cinit__(None, connection) + cdef PyGILState_STATE gil + + gil = PyGILState_Ensure() + try: + itup = <object>user_data + assert (type(tup) == list) + function = tup[1] + conn = Connection() + conn.__cinit__(None, connection) - args = [conn] - function(*args) + args = [conn] + function(*args) + finally: + PyGILState_Release(gil) cdef DBusHandlerResult cmessage_function_handler (DBusConnection *connection, DBusMessage *msg, void *user_data): cdef Connection conn cdef Message message + cdef PyGILState_STATE gil - tup = <object>user_data - assert (type(tup) == list) - function = tup[0] - message = Message(_create=0) - message._set_msg(msg) - - conn = Connection() - conn.__cinit__(None, connection) - - args = [conn, - message] - retval = function(*args) - if (retval == None): - retval = DBUS_HANDLER_RESULT_HANDLED - - return retval - + gil = PyGILState_Ensure() + try: + tup = <object>user_data + assert (type(tup) == list) + function = tup[0] + message = Message(_create=0) + message._set_msg(msg) + conn = Connection() + conn.__cinit__(None, connection) + args = [conn, + message] + retval = function(*args) + if (retval == None): + retval = DBUS_HANDLER_RESULT_HANDLED + return retval + finally: + PyGILState_Release(gil) + cdef class Connection: cdef DBusConnection *conn |