emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] trunk r116456: Improve dbus performance on synchronous cal


From: Daniel Colascione
Subject: [Emacs-diffs] trunk r116456: Improve dbus performance on synchronous calls
Date: Mon, 17 Feb 2014 11:42:00 +0000
User-agent: Bazaar (2.6b2)

------------------------------------------------------------
revno: 116456
revision-id: address@hidden
parent: address@hidden
committer: Daniel Colascione <address@hidden>
branch nick: trunk
timestamp: Mon 2014-02-17 03:41:42 -0800
message:
  Improve dbus performance on synchronous calls
modified:
  lisp/ChangeLog                 changelog-20091113204419-o5vbwnq5f7feedwu-1432
  lisp/net/dbus.el               dbus.el-20091113204419-o5vbwnq5f7feedwu-7962
=== modified file 'lisp/ChangeLog'
--- a/lisp/ChangeLog    2014-02-16 17:23:00 +0000
+++ b/lisp/ChangeLog    2014-02-17 11:41:42 +0000
@@ -1,3 +1,9 @@
+2014-02-17  Daniel Colascione  <address@hidden>
+
+       * net/dbus.el (dbus-call-method): Work around bug#16775 by having
+       dbus-call-method check for completion using a busy-wait loop with
+       gradual backoff.
+
 2013-10-02  Michael Albinus  <address@hidden>
 
        Sync with Tramp 2.2.9.

=== modified file 'lisp/net/dbus.el'
--- a/lisp/net/dbus.el  2014-01-01 07:43:34 +0000
+++ b/lisp/net/dbus.el  2014-02-17 11:41:42 +0000
@@ -260,6 +260,7 @@
       (signal 'wrong-type-argument (list 'stringp method)))
 
   (let ((timeout (plist-get args :timeout))
+        (check-interval 0.001)
        (key
         (apply
          'dbus-message-internal dbus-message-type-method-call
@@ -270,13 +271,21 @@
     ;; default 25".  Events which are not from D-Bus must be restored.
     ;; `read-event' performs a redisplay.  This must be suppressed; it
     ;; hurts when reading D-Bus events asynchronously.
+
+    ;; Work around bug#16775 by busy-waiting with gradual backoff for
+    ;; dbus calls to complete.  A better aproach would involve either
+    ;; adding arbitrary wait condition support to read-event or
+    ;; restructuring dbus as a kind of process object.  Poll at most
+    ;; about once per second for completion.
+
     (with-timeout ((if timeout (/ timeout 1000.0) 25))
       (while (eq (gethash key dbus-return-values-table :ignore) :ignore)
-       (let ((event (let ((inhibit-redisplay t) unread-command-events)
-                      (read-event nil nil 0.1))))
-         (when (and event (not (ignore-errors (dbus-check-event event))))
-           (setq unread-command-events
-                 (append unread-command-events (list event)))))))
+        (let ((event (let ((inhibit-redisplay t) unread-command-events)
+                      (read-event nil nil check-interval))))
+          (when event
+            (push event unread-command-events))
+          (when (< check-interval 1)
+            (setf check-interval (* check-interval 1.05))))))
 
     ;; Cleanup `dbus-return-values-table'.  Return the result.
     (prog1


reply via email to

[Prev in Thread] Current Thread [Next in Thread]