/* Asynchronous timers.
Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005,
- 2006, 2007, 2008 Free Software Foundation, Inc.
+ 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
This file is part of GNU Emacs.
#include <config.h>
#include <signal.h>
#include <stdio.h>
+#include <setjmp.h>
#include <lisp.h>
#include <syssignal.h>
#include <systime.h>
/* Function prototypes. */
-static void set_alarm P_ ((void));
-static void schedule_atimer P_ ((struct atimer *));
-static struct atimer *append_atimer_lists P_ ((struct atimer *,
- struct atimer *));
-SIGTYPE alarm_signal_handler ();
+static void set_alarm (void);
+static void schedule_atimer (struct atimer *);
+static struct atimer *append_atimer_lists (struct atimer *,
+ struct atimer *);
+SIGTYPE alarm_signal_handler (int signo);
/* Start a new atimer of type TYPE. TIME specifies when the timer is
to cancel_atimer; don't free it yourself. */
struct atimer *
-start_atimer (type, time, fn, client_data)
- enum atimer_type type;
- EMACS_TIME time;
- atimer_callback fn;
- void *client_data;
+start_atimer (enum atimer_type type, struct timeval time, atimer_callback fn, void *client_data)
{
struct atimer *t;
/* Cancel and free atimer TIMER. */
void
-cancel_atimer (timer)
- struct atimer *timer;
+cancel_atimer (struct atimer *timer)
{
int i;
result list. */
static struct atimer *
-append_atimer_lists (list1, list2)
- struct atimer *list1, *list2;
+append_atimer_lists (struct atimer *list1, struct atimer *list2)
{
if (list1 == NULL)
return list2;
/* Stop all timers except timer T. T null means stop all timers. */
void
-stop_other_atimers (t)
- struct atimer *t;
+stop_other_atimers (struct atimer *t)
{
BLOCK_ATIMERS;
stop_other_atimers. */
void
-run_all_atimers ()
+run_all_atimers (void)
{
if (stopped_atimers)
{
/* A version of run_all_timers suitable for a record_unwind_protect. */
Lisp_Object
-unwind_stop_other_atimers (dummy)
- Lisp_Object dummy;
+unwind_stop_other_atimers (Lisp_Object dummy)
{
run_all_atimers ();
return Qnil;
/* Arrange for a SIGALRM to arrive when the next timer is ripe. */
static void
-set_alarm ()
+set_alarm (void)
{
-#if defined (USG) && !defined (POSIX_SIGNALS)
- /* USG systems forget handlers when they are used;
- must reestablish each time. */
- signal (SIGALRM, alarm_signal_handler);
-#endif /* USG */
-
if (atimers)
{
EMACS_TIME now, time;
already. */
static void
-schedule_atimer (t)
- struct atimer *t;
+schedule_atimer (struct atimer *t)
{
struct atimer *a = atimers, *prev = NULL;
}
static void
-run_timers ()
+run_timers (void)
{
EMACS_TIME now;
EMACS_GET_TIME (now);
}
+ if (! atimers)
+ pending_atimers = 0;
+
+#ifdef SYNC_INPUT
+ if (pending_atimers)
+ pending_signals = 1;
+ else
+ {
+ pending_signals = interrupt_input_pending;
+ set_alarm ();
+ }
+#else
if (! pending_atimers)
set_alarm ();
+#endif
}
SIGALRM. */
SIGTYPE
-alarm_signal_handler (signo)
- int signo;
+alarm_signal_handler (int signo)
{
- pending_atimers = 1;
#ifndef SYNC_INPUT
+ SIGNAL_THREAD_CHECK (signo);
+#endif
+
+ pending_atimers = 1;
+#ifdef SYNC_INPUT
+ pending_signals = 1;
+#else
run_timers ();
#endif
}
/* Call alarm_signal_handler for pending timers. */
void
-do_pending_atimers ()
+do_pending_atimers (void)
{
if (pending_atimers)
{
some systems like HPUX (see process.c). */
void
-turn_on_atimers (on)
- int on;
+turn_on_atimers (int on)
{
if (on)
{
void
-init_atimer ()
+init_atimer (void)
{
- free_atimers = atimers = NULL;
+ free_atimers = stopped_atimers = atimers = NULL;
pending_atimers = 0;
+ /* pending_signals is initialized in init_keyboard.*/
signal (SIGALRM, alarm_signal_handler);
}