X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/9e2a2647758db83b490e2993aa31cd4607305a82..8a1f4a98c1b8e3abaf1b46394a88d09531ce4c2d:/src/atimer.c diff --git a/src/atimer.c b/src/atimer.c index 916c965de9..5ecf45d0bf 100644 --- a/src/atimer.c +++ b/src/atimer.c @@ -1,6 +1,6 @@ /* Asynchronous timers. Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, - 2006, 2007, 2008 Free Software Foundation, Inc. + 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -20,15 +20,13 @@ along with GNU Emacs. If not, see . */ #include #include #include -#include -#include -#include -#include -#include - -#ifdef HAVE_UNISTD_H +#include +#include "lisp.h" +#include "syssignal.h" +#include "systime.h" +#include "blockinput.h" +#include "atimer.h" #include -#endif #ifdef HAVE_SYS_TIME_H #include @@ -63,11 +61,11 @@ int pending_atimers; /* 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 @@ -89,11 +87,8 @@ SIGTYPE alarm_signal_handler (); 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, EMACS_TIME time, atimer_callback fn, + void *client_data) { struct atimer *t; @@ -118,7 +113,7 @@ start_atimer (type, time, fn, client_data) t = (struct atimer *) xmalloc (sizeof *t); /* Fill the atimer structure. */ - bzero (t, sizeof *t); + memset (t, 0, sizeof *t); t->type = type; t->fn = fn; t->client_data = client_data; @@ -158,8 +153,7 @@ start_atimer (type, time, fn, client_data) /* Cancel and free atimer TIMER. */ void -cancel_atimer (timer) - struct atimer *timer; +cancel_atimer (struct atimer *timer) { int i; @@ -174,9 +168,9 @@ cancel_atimer (timer) for (t = *list, prev = NULL; t && t != timer; prev = t, t = t->next) ; - /* If it is, take it off the its list, and put in on the - free-list. We don't bother to arrange for setting a - different alarm time, since a too early one doesn't hurt. */ + /* If it is, take it off its list, and put in on the free-list. + We don't bother to arrange for setting a different alarm time, + since a too early one doesn't hurt. */ if (t) { if (prev) @@ -198,8 +192,7 @@ cancel_atimer (timer) 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; @@ -220,8 +213,7 @@ append_atimer_lists (list1, 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; @@ -256,7 +248,7 @@ stop_other_atimers (t) stop_other_atimers. */ void -run_all_atimers () +run_all_atimers (void) { if (stopped_atimers) { @@ -282,8 +274,7 @@ run_all_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; @@ -293,14 +284,8 @@ unwind_stop_other_atimers (dummy) /* 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; @@ -320,7 +305,7 @@ set_alarm () EMACS_SET_USECS (time, 1000); } - bzero (&it, sizeof it); + memset (&it, 0, sizeof it); it.it_value = time; setitimer (ITIMER_REAL, &it, 0); #else /* not HAVE_SETITIMER */ @@ -335,8 +320,7 @@ set_alarm () already. */ static void -schedule_atimer (t) - struct atimer *t; +schedule_atimer (struct atimer *t) { struct atimer *a = atimers, *prev = NULL; @@ -354,7 +338,7 @@ schedule_atimer (t) } static void -run_timers () +run_timers (void) { EMACS_TIME now; @@ -384,8 +368,21 @@ run_timers () 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 } @@ -393,11 +390,16 @@ run_timers () 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 } @@ -406,7 +408,7 @@ alarm_signal_handler (signo) /* Call alarm_signal_handler for pending timers. */ void -do_pending_atimers () +do_pending_atimers (void) { if (pending_atimers) { @@ -421,8 +423,7 @@ do_pending_atimers () some systems like HPUX (see process.c). */ void -turn_on_atimers (on) - int on; +turn_on_atimers (int on) { if (on) { @@ -435,10 +436,11 @@ turn_on_atimers (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); }