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
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);
}
}
- if (! atimers)
- pending_atimers = 0;
-
- if (pending_atimers)
- pending_signals = 1;
- else
- {
- pending_signals = interrupt_input_pending;
- set_alarm ();
- }
+ set_alarm ();
}
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 ();
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);
}
{
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);
}