X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/177c0ea74342272645959b82cf219faa0b3dba16..a8a3728b90d75d89368be8e35d5c26468e071d5c:/src/atimer.c diff --git a/src/atimer.c b/src/atimer.c index 25b48c5857..e7b23f21b7 100644 --- a/src/atimer.c +++ b/src/atimer.c @@ -1,12 +1,13 @@ /* Asynchronous timers. - Copyright (C) 2000 Free Software Foundation, Inc. + Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, + 2006, 2007, 2008, 2009 Free Software Foundation, Inc. This file is part of GNU Emacs. -GNU Emacs is free software; you can redistribute it and/or modify +GNU Emacs is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. GNU Emacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -14,18 +15,16 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with GNU Emacs; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ +along with GNU Emacs. If not, see . */ #include -#include #include +#include +#include #include #include #include #include -#include #ifdef HAVE_UNISTD_H #include @@ -231,7 +230,7 @@ stop_other_atimers (t) struct atimer *p, *prev; /* See if T is active. */ - for (p = atimers, prev = 0; p && p != t; p = p->next) + for (p = atimers, prev = NULL; p && p != t; prev = p, p = p->next) ; if (p == t) @@ -354,18 +353,12 @@ schedule_atimer (t) t->next = a; } - -/* Signal handler for SIGALRM. SIGNO is the signal number, i.e. - SIGALRM. */ - -SIGTYPE -alarm_signal_handler (signo) - int signo; +static void +run_timers () { EMACS_TIME now; EMACS_GET_TIME (now); - pending_atimers = 0; while (atimers && (pending_atimers = interrupt_input_blocked) == 0 @@ -391,7 +384,37 @@ alarm_signal_handler (signo) EMACS_GET_TIME (now); } - set_alarm (); + 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 +} + + +/* Signal handler for SIGALRM. SIGNO is the signal number, i.e. + SIGALRM. */ + +SIGTYPE +alarm_signal_handler (signo) + int signo; +{ + pending_atimers = 1; +#ifdef SYNC_INPUT + pending_signals = 1; +#else + run_timers (); +#endif } @@ -403,7 +426,7 @@ do_pending_atimers () if (pending_atimers) { BLOCK_ATIMERS; - alarm_signal_handler (SIGALRM); + run_timers (); UNBLOCK_ATIMERS; } } @@ -431,5 +454,9 @@ init_atimer () { free_atimers = atimers = NULL; pending_atimers = 0; + /* pending_signals is initialized in init_keyboard.*/ signal (SIGALRM, alarm_signal_handler); } + +/* arch-tag: e6308261-eec6-404b-89fb-6e5909518d70 + (do not change this comment) */