summaryrefslogtreecommitdiffstats
path: root/python/dbus_bindings.pyx.in
diff options
context:
space:
mode:
Diffstat (limited to 'python/dbus_bindings.pyx.in')
-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