Simplify and avoid signal-handling races.
[bpt/emacs.git] / src / atimer.c
index 5dbd807..d3b6c7d 100644 (file)
@@ -40,14 +40,6 @@ static struct atimer *stopped_atimers;
 
 static struct atimer *atimers;
 
-/* Non-zero means alarm signal handler has found ripe timers but
-   interrupt_input_blocked was non-zero.  In this case, timer
-   functions are not called until the next UNBLOCK_INPUT because timer
-   functions are expected to call X, and X cannot be assumed to be
-   reentrant.  */
-
-int pending_atimers;
-
 /* Block/unblock SIGALRM.  */
 
 static void
@@ -341,16 +333,11 @@ schedule_atimer (struct atimer *t)
 static void
 run_timers (void)
 {
-  EMACS_TIME now;
+  EMACS_TIME now = current_emacs_time ();
 
-  while (atimers
-        && (pending_atimers = interrupt_input_blocked) == 0
-        && (now = current_emacs_time (),
-            EMACS_TIME_LE (atimers->expiration, now)))
+  while (atimers && EMACS_TIME_LE (atimers->expiration, now))
     {
-      struct atimer *t;
-
-      t = atimers;
+      struct atimer *t = atimers;
       atimers = atimers->next;
       t->fn (t);
 
@@ -366,16 +353,7 @@ run_timers (void)
        }
     }
 
-  if (! atimers)
-    pending_atimers = 0;
-
-  if (pending_atimers)
-    pending_signals = 1;
-  else
-    {
-      pending_signals = interrupt_input_pending;
-      set_alarm ();
-    }
+  set_alarm ();
 }
 
 
@@ -385,23 +363,16 @@ run_timers (void)
 static void
 handle_alarm_signal (int sig)
 {
-  pending_atimers = 1;
   pending_signals = 1;
 }
 
-static void
-deliver_alarm_signal (int sig)
-{
-  handle_on_main_thread (sig, handle_alarm_signal);
-}
-
 
-/* Call alarm signal handler for pending timers.  */
+/* Do pending timers.  */
 
 void
 do_pending_atimers (void)
 {
-  if (pending_atimers)
+  if (atimers)
     {
       block_atimers ();
       run_timers ();
@@ -417,12 +388,7 @@ void
 turn_on_atimers (bool on)
 {
   if (on)
-    {
-      struct sigaction action;
-      emacs_sigaction_init (&action, deliver_alarm_signal);
-      sigaction (SIGALRM, &action, 0);
-      set_alarm ();
-    }
+    set_alarm ();
   else
     alarm (0);
 }
@@ -433,8 +399,7 @@ init_atimer (void)
 {
   struct sigaction action;
   free_atimers = stopped_atimers = atimers = NULL;
-  pending_atimers = 0;
   /* pending_signals is initialized in init_keyboard.*/
-  emacs_sigaction_init (&action, deliver_alarm_signal);
+  emacs_sigaction_init (&action, handle_alarm_signal);
   sigaction (SIGALRM, &action, 0);
 }