]> git.eshelyaron.com Git - emacs.git/commitdiff
Make sure sleep-for always delays for as long as it's told
authorEli Zaretskii <eliz@gnu.org>
Tue, 30 Jun 2015 16:09:02 +0000 (19:09 +0300)
committerEli Zaretskii <eliz@gnu.org>
Tue, 30 Jun 2015 16:09:02 +0000 (19:09 +0300)
* src/dispnew.c (Fsleep_for): Call wait_reading_process_output in
a loop, to ensure we always wait exactly the required amount of
time.  (Bug#15990)

src/dispnew.c

index 1fc3cfeef44b39acc11fae4579426f5d7d67ad21..7833fe3d01c96d4e9265596f98ea5a3fc2151dc2 100644 (file)
@@ -5679,8 +5679,16 @@ additional wait period, in milliseconds; this is for backwards compatibility.
   if (duration > 0)
     {
       struct timespec t = dtotimespec (duration);
-      wait_reading_process_output (min (t.tv_sec, WAIT_READING_MAX),
-                                  t.tv_nsec, 0, 0, Qnil, NULL, 0);
+      struct timespec tend = timespec_add (current_timespec (), t);
+
+      /* wait_reading_process_output returns as soon as it detects
+        output from any subprocess, so we wait in a loop until the
+        time expires.  */
+      do {
+       wait_reading_process_output (min (t.tv_sec, WAIT_READING_MAX),
+                                    t.tv_nsec, 0, 0, Qnil, NULL, 0);
+       t = timespec_sub (tend, current_timespec ());
+      } while (timespec_sign (t) > 0);
     }
 
   return Qnil;