changeset 110609:7867879a43ce

* dbusbind.c (dbus_fd_cb, xd_get_dispatch_status) (xd_pending_messages): Functions removed. (xd_read_queued_messages): Add parameters fd, *data, for_read in order to be compatible with add_read_fd. Determine bus from data, and call xd_read_message just for this bus. (xd_add_watch): Use xd_read_queued_messages as callback function. Add data. * lisp.h (xd_pending_messages, xd_read_queued_messages): Remove.
author Michael Albinus <michael.albinus@gmx.de>
date Mon, 27 Sep 2010 17:34:04 +0200
parents 06497cf3e920
children f3646cf59e9f
files src/ChangeLog src/dbusbind.c src/lisp.h
diffstat 3 files changed, 37 insertions(+), 73 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Mon Sep 27 17:03:58 2010 +0200
+++ b/src/ChangeLog	Mon Sep 27 17:34:04 2010 +0200
@@ -1,3 +1,15 @@
+2010-09-27  Michael Albinus  <michael.albinus@gmx.de>
+
+	* dbusbind.c (dbus_fd_cb, xd_get_dispatch_status)
+	(xd_pending_messages): Functions removed.
+	(xd_read_queued_messages): Add parameters fd, *data, for_read in
+	order to be compatible with add_read_fd.  Determine bus from data,
+	and call xd_read_message just for this bus.
+	(xd_add_watch): Use xd_read_queued_messages as callback function.
+	Add data.
+
+	* lisp.h (xd_pending_messages, xd_read_queued_messages): Remove.
+
 2010-09-27  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
 	* gnutls.c (gnutls_log_function): Added more debugging.
--- a/src/dbusbind.c	Mon Sep 27 17:03:58 2010 +0200
+++ b/src/dbusbind.c	Mon Sep 27 17:34:04 2010 +0200
@@ -800,16 +800,7 @@
   return connection;
 }
 
-/* Callback called when something is read to read ow write.  */
-
-static void
-dbus_fd_cb (int fd, void *data, int for_read)
-{
-  xd_read_queued_messages ();
-}
-
 /* Return the file descriptor for WATCH, -1 if not found.  */
-
 static int
 xd_find_watch_fd (DBusWatch *watch)
 {
@@ -824,9 +815,11 @@
   return fd;
 }
 
+/* Prototype.  */
+static void
+xd_read_queued_messages (int fd, void *data, int for_read);
 
 /* Start monitoring WATCH for possible I/O.  */
-
 static dbus_bool_t
 xd_add_watch (DBusWatch *watch, void *data)
 {
@@ -843,9 +836,9 @@
   if (dbus_watch_get_enabled (watch))
     {
       if (flags & DBUS_WATCH_WRITABLE)
-        add_write_fd (fd, dbus_fd_cb, NULL);
+        add_write_fd (fd, xd_read_queued_messages, data);
       if (flags & DBUS_WATCH_READABLE)
-        add_read_fd (fd, dbus_fd_cb, NULL);
+        add_read_fd (fd, xd_read_queued_messages, data);
     }
   return TRUE;
 }
@@ -853,7 +846,6 @@
 /* Stop monitoring WATCH for possible I/O.
    DATA is the used bus, either a string or QCdbus_system_bus or
    QCdbus_session_bus.  */
-
 static void
 xd_remove_watch (DBusWatch *watch, void *data)
 {
@@ -862,8 +854,8 @@
 
   XD_DEBUG_MESSAGE ("fd %d", fd);
 
-  if (fd == -1) return;
-
+  if (fd == -1)
+    return;
 
   /* Unset session environment.  */
   if (data != NULL && data == (void*) XHASH (QCdbus_session_bus))
@@ -879,7 +871,6 @@
 }
 
 /* Toggle monitoring WATCH for possible I/O.  */
-
 static void
 xd_toggle_watch (DBusWatch *watch, void *data)
 {
@@ -1613,54 +1604,9 @@
   return Qt;
 }
 
-/* Check, whether there is pending input in the message queue of the
-   D-Bus BUS.  BUS is either a Lisp symbol, :system or :session, or a
-   string denoting the bus address.  */
-int
-xd_get_dispatch_status (Lisp_Object bus)
-{
-  DBusConnection *connection;
-
-  /* Open a connection to the bus.  */
-  connection = xd_initialize (bus, FALSE);
-  if (connection == NULL) return FALSE;
-
-  /* Non blocking read of the next available message.  */
-  dbus_connection_read_write (connection, 0);
-
-  /* Return.  */
-  return
-    (dbus_connection_get_dispatch_status (connection)
-     == DBUS_DISPATCH_DATA_REMAINS)
-    ? TRUE : FALSE;
-}
-
-/* Check for queued incoming messages from the buses.  */
-int
-xd_pending_messages (void)
-{
-  Lisp_Object busp = Vdbus_registered_buses;
-
-  while (!NILP (busp))
-    {
-      /* We do not want to have an autolaunch for the session bus.  */
-      if (EQ ((CAR_SAFE (busp)), QCdbus_session_bus)
-	  && getenv ("DBUS_SESSION_BUS_ADDRESS") == NULL)
-	continue;
-
-      if (xd_get_dispatch_status (CAR_SAFE (busp)))
-	return TRUE;
-
-      busp = CDR_SAFE (busp);
-    }
-
-  return FALSE;
-}
-
 /* Read one queued incoming message of the D-Bus BUS.
    BUS is either a Lisp symbol, :system or :session, or a string denoting
    the bus address.  */
-
 static void
 xd_read_message_1 (DBusConnection *connection, Lisp_Object bus)
 {
@@ -1814,7 +1760,6 @@
 /* Read queued incoming messages of the D-Bus BUS.
    BUS is either a Lisp symbol, :system or :session, or a string denoting
    the bus address.  */
-
 static Lisp_Object
 xd_read_message (Lisp_Object bus)
 {
@@ -1830,19 +1775,28 @@
   return Qnil;
 }
 
-/* Read queued incoming messages from all buses.  */
-void
-xd_read_queued_messages (void)
+/* Callback called when something is ready to read or write.  */
+static void
+xd_read_queued_messages (int fd, void *data, int for_read)
 {
   Lisp_Object busp = Vdbus_registered_buses;
+  Lisp_Object bus = Qnil;
 
+  /* Find bus related to fd.  */
+  if (data != NULL)
+    while (!NILP (busp))
+      {
+	if (data == (void*) XHASH (CAR_SAFE (busp)))
+	  bus = CAR_SAFE (busp);
+	busp = CDR_SAFE (busp);
+      }
+
+  if (NILP(bus))
+    return;
+
+  /* We ignore all Lisp errors during the call.  */
   xd_in_read_queued_messages = 1;
-  while (!NILP (busp))
-    {
-      /* We ignore all Lisp errors during the call.  */
-      internal_catch (Qdbus_error, xd_read_message, CAR_SAFE (busp));
-      busp = CDR_SAFE (busp);
-    }
+  internal_catch (Qdbus_error, xd_read_message, bus);
   xd_in_read_queued_messages = 0;
 }
 
--- a/src/lisp.h	Mon Sep 27 17:03:58 2010 +0200
+++ b/src/lisp.h	Mon Sep 27 17:34:04 2010 +0200
@@ -3593,8 +3593,6 @@
 
 #ifdef HAVE_DBUS
 /* Defined in dbusbind.c */
-int xd_pending_messages (void);
-void xd_read_queued_messages (void);
 void syms_of_dbusbind (void);
 #endif