X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/96013ba9db86d72781746cd5613f378d1058732f..ce75f06e9110ceda73c75997a017f7c09dd9dd33:/src/atimer.c diff --git a/src/atimer.c b/src/atimer.c index d260f67d24..308d4688d7 100644 --- a/src/atimer.c +++ b/src/atimer.c @@ -1,12 +1,13 @@ /* Asynchronous timers. - Copyright (C) 2000, 2002, 2003, 2004, 2005 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,13 +15,12 @@ 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., 51 Franklin Street, Fifth Floor, -Boston, MA 02110-1301, USA. */ +along with GNU Emacs. If not, see . */ #include #include #include +#include #include #include #include @@ -354,20 +354,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; - SIGNAL_THREAD_CHECK (signo); - EMACS_GET_TIME (now); - pending_atimers = 0; while (atimers && (pending_atimers = interrupt_input_blocked) == 0 @@ -377,9 +369,7 @@ alarm_signal_handler (signo) t = atimers; atimers = atimers->next; -#ifndef MAC_OSX t->fn (t); -#endif if (t->type == ATIMER_CONTINUOUS) { @@ -391,16 +381,41 @@ alarm_signal_handler (signo) t->next = free_atimers; free_atimers = t; } -#ifdef MAC_OSX - /* Fix for Ctrl-G. Perhaps this should apply to all platforms. */ - t->fn (t); -#endif 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 +} + + +/* 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 } @@ -412,7 +427,7 @@ do_pending_atimers () if (pending_atimers) { BLOCK_ATIMERS; - alarm_signal_handler (SIGALRM); + run_timers (); UNBLOCK_ATIMERS; } } @@ -438,8 +453,9 @@ turn_on_atimers (on) void init_atimer () { - 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); }