* python/dbus_bindings.pyx (_pending_call_notification): Obtain the
authorJohn (J5) Palmieri <johnp@redhat.com>
Tue, 30 Aug 2005 15:21:04 +0000 (15:21 +0000)
committerJohn (J5) Palmieri <johnp@redhat.com>
Tue, 30 Aug 2005 15:21:04 +0000 (15:21 +0000)
  GIL global lock when calling back into Python

ChangeLog
python/dbus_bindings.pyx

index 0bb0c24..c36be7e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2005-08-30  John (J5) Palmieri  <johnp@redhat.com>
+
+       * python/dbus_bindings.pyx (_pending_call_notification): Obtain the
+       GIL global lock when calling back into Python
+
 2005-08-29  John (J5) Palmieri  <johnp@redhat.com>
 
        * Release 0.36.2
index ee3e648..6973944 100644 (file)
@@ -490,6 +490,7 @@ cdef class Connection:
 cdef void _pending_call_notification(DBusPendingCall *pending_call, void *user_data):
     cdef DBusMessage *dbus_message
     cdef Message message
+    cdef PyGILState_STATE gil
    
     (reply_handler, error_handler) = <object>user_data
    
@@ -499,17 +500,21 @@ cdef void _pending_call_notification(DBusPendingCall *pending_call, void *user_d
 
     type = message.get_type()
 
-    if type == MESSAGE_TYPE_METHOD_RETURN:
-        args = message.get_args_list()
-        reply_handler(*args)
-    elif type == MESSAGE_TYPE_ERROR:
-        args = message.get_args_list()
-        if len(args) > 0:
-            error_handler(DBusException(args[0]))
+    gil = PyGILState_Ensure()
+    try:
+        if type == MESSAGE_TYPE_METHOD_RETURN:
+            args = message.get_args_list()
+            reply_handler(*args)
+        elif type == MESSAGE_TYPE_ERROR:
+            args = message.get_args_list()
+            if len(args) > 0:
+                error_handler(DBusException(args[0]))
+            else:
+                error_handler(DBusException(""))
         else:
-            error_handler(DBusException(""))
-    else:
-        error_handler(DBusException('Unexpected Message Type: ' + message.type_to_name(type)))
+            error_handler(DBusException('Unexpected Message Type: ' + message.type_to_name(type)))
+    finally:
+        PyGILState_Release(gil)
 
     dbus_message_unref(dbus_message)
     dbus_pending_call_unref(pending_call)