summaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
authorJohn (J5) Palmieri <johnp@redhat.com>2005-06-28 19:36:51 +0000
committerJohn (J5) Palmieri <johnp@redhat.com>2005-06-28 19:36:51 +0000
commita3406a82793298943c02f4b4088a9ef5b35f0279 (patch)
tree75074eda0eadb8921bfab72f046ae431883d422d /python
parentc17dc995ce22d873c7e2410b71cf96833d9bb58a (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.in60
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