summaryrefslogtreecommitdiffstats
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
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.
-rw-r--r--ChangeLog8
-rw-r--r--python/dbus_bindings.pyx.in60
2 files changed, 44 insertions, 24 deletions
diff --git a/ChangeLog b/ChangeLog
index 7445f929..48ddf6b3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2005-06-28 John (J5) Palmieri <johnp@redhat.com>
+
+ * 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.
+
2005-06-28 Ray Strode <rstrode@redhat.com>
* dbus/dbus-spawn.c (_dbus_babysitter_unref): kill
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