diff options
| -rw-r--r-- | ChangeLog | 8 | ||||
| -rw-r--r-- | python/dbus_bindings.pyx.in | 60 | 
2 files changed, 44 insertions, 24 deletions
@@ -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  | 
