annotate src/atimer.c @ 99492:ee792794d888

(isearch-search-fun): Compare the length of the current search string with the length of the string from the previous search state to detect the situation when the user adds or removes characters in the search string. Use word-search-forward-lax and word-search-backward-lax in this case, and otherwise word-search-forward and word-search-backward.
author Juri Linkov <juri@jurta.org>
date Tue, 11 Nov 2008 19:43:09 +0000
parents 9592c50233ab
children e038c1a8307c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1 /* Asynchronous timers.
75227
e90d04cd455a Update copyright for years from Emacs 21 to present (mainly adding
Glenn Morris <rgm@gnu.org>
parents: 68651
diff changeset
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005,
79759
fc2bcd2a8aad Add 2008 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 78260
diff changeset
3 2006, 2007, 2008 Free Software Foundation, Inc.
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
4
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
5 This file is part of GNU Emacs.
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
6
94963
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 93894
diff changeset
7 GNU Emacs is free software: you can redistribute it and/or modify
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
8 it under the terms of the GNU General Public License as published by
94963
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 93894
diff changeset
9 the Free Software Foundation, either version 3 of the License, or
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 93894
diff changeset
10 (at your option) any later version.
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
11
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
12 GNU Emacs is distributed in the hope that it will be useful,
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
15 GNU General Public License for more details.
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
16
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
94963
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 93894
diff changeset
18 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
19
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
20 #include <config.h>
53901
d85f8f2e71f7 Move include stdio.h to same place as in other files.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
21 #include <signal.h>
d85f8f2e71f7 Move include stdio.h to same place as in other files.
Jan Djärv <jan.h.d@swipnet.se>
parents: 52401
diff changeset
22 #include <stdio.h>
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
23 #include <lisp.h>
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
24 #include <syssignal.h>
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
25 #include <systime.h>
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
26 #include <blockinput.h>
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
27 #include <atimer.h>
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
28
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
29 #ifdef HAVE_UNISTD_H
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
30 #include <unistd.h>
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
31 #endif
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
32
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
33 #ifdef HAVE_SYS_TIME_H
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
34 #include <sys/time.h>
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
35 #endif
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
36
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
37 /* Free-list of atimer structures. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
38
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
39 static struct atimer *free_atimers;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
40
27670
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
41 /* List of currently not running timers due to a call to
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
42 lock_atimer. */
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
43
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
44 static struct atimer *stopped_atimers;
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
45
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
46 /* List of active atimers, sorted by expiration time. The timer that
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
47 will become ripe next is always at the front of this list. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
48
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
49 static struct atimer *atimers;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
50
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
51 /* Non-zero means alarm_signal_handler has found ripe timers but
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
52 interrupt_input_blocked was non-zero. In this case, timer
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
53 functions are not called until the next UNBLOCK_INPUT because timer
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
54 functions are expected to call X, and X cannot be assumed to be
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
55 reentrant. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
56
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
57 int pending_atimers;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
58
39667
7ca787d18982 *** empty log message ***
Pavel Janík <Pavel@Janik.cz>
parents: 29672
diff changeset
59 /* Block/unblock SIGALRM. */
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
60
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
61 #define BLOCK_ATIMERS sigblock (sigmask (SIGALRM))
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
62 #define UNBLOCK_ATIMERS sigunblock (sigmask (SIGALRM))
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
63
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
64 /* Function prototypes. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
65
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
66 static void set_alarm P_ ((void));
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
67 static void schedule_atimer P_ ((struct atimer *));
27913
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
68 static struct atimer *append_atimer_lists P_ ((struct atimer *,
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
69 struct atimer *));
29672
2722b6b5400d (alarm_signal_handler): Add forward declaration.
Gerd Moellmann <gerd@gnu.org>
parents: 28119
diff changeset
70 SIGTYPE alarm_signal_handler ();
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
71
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
72
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
73 /* Start a new atimer of type TYPE. TIME specifies when the timer is
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
74 ripe. FN is the function to call when the timer fires.
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
75 CLIENT_DATA is stored in the client_data member of the atimer
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
76 structure returned and so made available to FN when it is called.
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
77
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
78 If TYPE is ATIMER_ABSOLUTE, TIME is the absolute time at which the
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
79 timer fires.
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
80
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
81 If TYPE is ATIMER_RELATIVE, the timer is ripe TIME s/us in the
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
82 future.
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
83
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
84 In both cases, the timer is automatically freed after it has fired.
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
85
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
86 If TYPE is ATIMER_CONTINUOUS, the timer fires every TIME s/us.
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
87
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
88 Value is a pointer to the atimer started. It can be used in calls
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
89 to cancel_atimer; don't free it yourself. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
90
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
91 struct atimer *
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
92 start_atimer (type, time, fn, client_data)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
93 enum atimer_type type;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
94 EMACS_TIME time;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
95 atimer_callback fn;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
96 void *client_data;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
97 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
98 struct atimer *t;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
99
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
100 /* Round TIME up to the next full second if we don't have
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
101 itimers. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
102 #ifndef HAVE_SETITIMER
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
103 if (EMACS_USECS (time) != 0)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
104 {
27452
7580a16f676c (start_atimer) [!HAVE_SETITIMER]: Use EMACS_SET_SECS
Eli Zaretskii <eliz@gnu.org>
parents: 27433
diff changeset
105 EMACS_SET_USECS (time, 0);
7580a16f676c (start_atimer) [!HAVE_SETITIMER]: Use EMACS_SET_SECS
Eli Zaretskii <eliz@gnu.org>
parents: 27433
diff changeset
106 EMACS_SET_SECS (time, EMACS_SECS (time) + 1);
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
107 }
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
108 #endif /* not HAVE_SETITIMER */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
109
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
110 /* Get an atimer structure from the free-list, or allocate
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
111 a new one. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
112 if (free_atimers)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
113 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
114 t = free_atimers;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
115 free_atimers = t->next;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
116 }
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
117 else
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
118 t = (struct atimer *) xmalloc (sizeof *t);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
119
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
120 /* Fill the atimer structure. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
121 bzero (t, sizeof *t);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
122 t->type = type;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
123 t->fn = fn;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
124 t->client_data = client_data;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
125
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
126 BLOCK_ATIMERS;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
127
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
128 /* Compute the timer's expiration time. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
129 switch (type)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
130 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
131 case ATIMER_ABSOLUTE:
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
132 t->expiration = time;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
133 break;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 39687
diff changeset
134
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
135 case ATIMER_RELATIVE:
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
136 EMACS_GET_TIME (t->expiration);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
137 EMACS_ADD_TIME (t->expiration, t->expiration, time);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
138 break;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 39687
diff changeset
139
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
140 case ATIMER_CONTINUOUS:
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
141 EMACS_GET_TIME (t->expiration);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
142 EMACS_ADD_TIME (t->expiration, t->expiration, time);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
143 t->interval = time;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
144 break;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
145 }
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
146
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
147 /* Insert the timer in the list of active atimers. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
148 schedule_atimer (t);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
149 UNBLOCK_ATIMERS;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
150
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
151 /* Arrange for a SIGALRM at the time the next atimer is ripe. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
152 set_alarm ();
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 39687
diff changeset
153
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
154 return t;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
155 }
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
156
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
157
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
158 /* Cancel and free atimer TIMER. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
159
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
160 void
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
161 cancel_atimer (timer)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
162 struct atimer *timer;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
163 {
27913
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
164 int i;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 39687
diff changeset
165
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
166 BLOCK_ATIMERS;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
167
27913
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
168 for (i = 0; i < 2; ++i)
27903
cc3d4c12e03b (cancel_atimer): Handle canceling an atimer when
Gerd Moellmann <gerd@gnu.org>
parents: 27734
diff changeset
169 {
27913
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
170 struct atimer *t, *prev;
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
171 struct atimer **list = i ? &stopped_atimers : &atimers;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 39687
diff changeset
172
27903
cc3d4c12e03b (cancel_atimer): Handle canceling an atimer when
Gerd Moellmann <gerd@gnu.org>
parents: 27734
diff changeset
173 /* See if TIMER is active or stopped. */
28119
98625ad8a015 (cancel_atimer): Break out of the loop as soon as timer
Gerd Moellmann <gerd@gnu.org>
parents: 27913
diff changeset
174 for (t = *list, prev = NULL; t && t != timer; prev = t, t = t->next)
27903
cc3d4c12e03b (cancel_atimer): Handle canceling an atimer when
Gerd Moellmann <gerd@gnu.org>
parents: 27734
diff changeset
175 ;
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
176
27913
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
177 /* If it is, take it off the its list, and put in on the
27903
cc3d4c12e03b (cancel_atimer): Handle canceling an atimer when
Gerd Moellmann <gerd@gnu.org>
parents: 27734
diff changeset
178 free-list. We don't bother to arrange for setting a
cc3d4c12e03b (cancel_atimer): Handle canceling an atimer when
Gerd Moellmann <gerd@gnu.org>
parents: 27734
diff changeset
179 different alarm time, since a too early one doesn't hurt. */
cc3d4c12e03b (cancel_atimer): Handle canceling an atimer when
Gerd Moellmann <gerd@gnu.org>
parents: 27734
diff changeset
180 if (t)
cc3d4c12e03b (cancel_atimer): Handle canceling an atimer when
Gerd Moellmann <gerd@gnu.org>
parents: 27734
diff changeset
181 {
cc3d4c12e03b (cancel_atimer): Handle canceling an atimer when
Gerd Moellmann <gerd@gnu.org>
parents: 27734
diff changeset
182 if (prev)
cc3d4c12e03b (cancel_atimer): Handle canceling an atimer when
Gerd Moellmann <gerd@gnu.org>
parents: 27734
diff changeset
183 prev->next = t->next;
cc3d4c12e03b (cancel_atimer): Handle canceling an atimer when
Gerd Moellmann <gerd@gnu.org>
parents: 27734
diff changeset
184 else
cc3d4c12e03b (cancel_atimer): Handle canceling an atimer when
Gerd Moellmann <gerd@gnu.org>
parents: 27734
diff changeset
185 *list = t->next;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 39687
diff changeset
186
27903
cc3d4c12e03b (cancel_atimer): Handle canceling an atimer when
Gerd Moellmann <gerd@gnu.org>
parents: 27734
diff changeset
187 t->next = free_atimers;
cc3d4c12e03b (cancel_atimer): Handle canceling an atimer when
Gerd Moellmann <gerd@gnu.org>
parents: 27734
diff changeset
188 free_atimers = t;
28119
98625ad8a015 (cancel_atimer): Break out of the loop as soon as timer
Gerd Moellmann <gerd@gnu.org>
parents: 27913
diff changeset
189 break;
27903
cc3d4c12e03b (cancel_atimer): Handle canceling an atimer when
Gerd Moellmann <gerd@gnu.org>
parents: 27734
diff changeset
190 }
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
191 }
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
192
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
193 UNBLOCK_ATIMERS;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
194 }
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
195
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
196
27913
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
197 /* Append two lists of atimers LIST1 and LIST2 and return the
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
198 result list. */
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
199
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
200 static struct atimer *
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
201 append_atimer_lists (list1, list2)
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
202 struct atimer *list1, *list2;
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
203 {
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
204 if (list1 == NULL)
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
205 return list2;
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
206 else if (list2 == NULL)
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
207 return list1;
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
208 else
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
209 {
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
210 struct atimer *p;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 39687
diff changeset
211
27913
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
212 for (p = list1; p->next; p = p->next)
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
213 ;
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
214 p->next = list2;
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
215 return list1;
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
216 }
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
217 }
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
218
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
219
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
220 /* Stop all timers except timer T. T null means stop all timers. */
27670
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
221
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
222 void
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
223 stop_other_atimers (t)
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
224 struct atimer *t;
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
225 {
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
226 BLOCK_ATIMERS;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 39687
diff changeset
227
27670
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
228 if (t)
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
229 {
27734
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
230 struct atimer *p, *prev;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 39687
diff changeset
231
27734
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
232 /* See if T is active. */
67209
a0e182783583 (stop_other_atimers): Fix loop to correctly compute `prev'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64770
diff changeset
233 for (p = atimers, prev = NULL; p && p != t; prev = p, p = p->next)
27734
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
234 ;
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
235
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
236 if (p == t)
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
237 {
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
238 if (prev)
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
239 prev->next = t->next;
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
240 else
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
241 atimers = t->next;
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
242 t->next = NULL;
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
243 }
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
244 else
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
245 /* T is not active. Let's handle this like T == 0. */
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
246 t = NULL;
27670
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
247 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 39687
diff changeset
248
27913
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
249 stopped_atimers = append_atimer_lists (atimers, stopped_atimers);
27670
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
250 atimers = t;
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
251 UNBLOCK_ATIMERS;
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
252 }
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
253
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
254
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
255 /* Run all timers again, if some have been stopped with a call to
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
256 stop_other_atimers. */
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
257
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
258 void
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
259 run_all_atimers ()
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
260 {
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
261 if (stopped_atimers)
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
262 {
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
263 struct atimer *t = atimers;
27913
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
264 struct atimer *next;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 39687
diff changeset
265
27670
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
266 BLOCK_ATIMERS;
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
267 atimers = stopped_atimers;
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
268 stopped_atimers = NULL;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 39687
diff changeset
269
27913
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
270 while (t)
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
271 {
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
272 next = t->next;
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
273 schedule_atimer (t);
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
274 t = next;
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
275 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 39687
diff changeset
276
27670
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
277 UNBLOCK_ATIMERS;
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
278 }
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
279 }
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
280
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
281
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
282 /* A version of run_all_timers suitable for a record_unwind_protect. */
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
283
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
284 Lisp_Object
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
285 unwind_stop_other_atimers (dummy)
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
286 Lisp_Object dummy;
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
287 {
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
288 run_all_atimers ();
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
289 return Qnil;
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
290 }
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
291
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
292
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
293 /* Arrange for a SIGALRM to arrive when the next timer is ripe. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
294
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
295 static void
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
296 set_alarm ()
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
297 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
298 #if defined (USG) && !defined (POSIX_SIGNALS)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
299 /* USG systems forget handlers when they are used;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
300 must reestablish each time. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
301 signal (SIGALRM, alarm_signal_handler);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
302 #endif /* USG */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 39687
diff changeset
303
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
304 if (atimers)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
305 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
306 EMACS_TIME now, time;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
307 #ifdef HAVE_SETITIMER
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
308 struct itimerval it;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
309 #endif
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
310
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
311 /* Determine s/us till the next timer is ripe. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
312 EMACS_GET_TIME (now);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
313 EMACS_SUB_TIME (time, atimers->expiration, now);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
314
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
315 #ifdef HAVE_SETITIMER
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
316 /* Don't set the interval to 0; this disables the timer. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
317 if (EMACS_TIME_LE (atimers->expiration, now))
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
318 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
319 EMACS_SET_SECS (time, 0);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
320 EMACS_SET_USECS (time, 1000);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
321 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 39687
diff changeset
322
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
323 bzero (&it, sizeof it);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
324 it.it_value = time;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
325 setitimer (ITIMER_REAL, &it, 0);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
326 #else /* not HAVE_SETITIMER */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
327 alarm (max (EMACS_SECS (time), 1));
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
328 #endif /* not HAVE_SETITIMER */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
329 }
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
330 }
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
331
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
332
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
333 /* Insert timer T into the list of active atimers `atimers', keeping
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
334 the list sorted by expiration time. T must not be in this list
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
335 already. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
336
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
337 static void
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
338 schedule_atimer (t)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
339 struct atimer *t;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
340 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
341 struct atimer *a = atimers, *prev = NULL;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
342
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
343 /* Look for the first atimer that is ripe after T. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
344 while (a && EMACS_TIME_GT (t->expiration, a->expiration))
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
345 prev = a, a = a->next;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
346
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
347 /* Insert T in front of the atimer found, if any. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
348 if (prev)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
349 prev->next = t;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
350 else
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
351 atimers = t;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 39687
diff changeset
352
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
353 t->next = a;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
354 }
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
355
93894
065fbf6b6fd0 (alarm_signal_handler): Call run_timers if not SYNC_INPUT.
Jan Djärv <jan.h.d@swipnet.se>
parents: 79759
diff changeset
356 static void
065fbf6b6fd0 (alarm_signal_handler): Call run_timers if not SYNC_INPUT.
Jan Djärv <jan.h.d@swipnet.se>
parents: 79759
diff changeset
357 run_timers ()
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
358 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
359 EMACS_TIME now;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 39687
diff changeset
360
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
361 EMACS_GET_TIME (now);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 39687
diff changeset
362
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
363 while (atimers
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
364 && (pending_atimers = interrupt_input_blocked) == 0
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
365 && EMACS_TIME_LE (atimers->expiration, now))
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
366 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
367 struct atimer *t;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 39687
diff changeset
368
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
369 t = atimers;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
370 atimers = atimers->next;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
371 t->fn (t);
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 39687
diff changeset
372
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
373 if (t->type == ATIMER_CONTINUOUS)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
374 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
375 EMACS_ADD_TIME (t->expiration, now, t->interval);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
376 schedule_atimer (t);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
377 }
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
378 else
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
379 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
380 t->next = free_atimers;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
381 free_atimers = t;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
382 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 39687
diff changeset
383
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
384 EMACS_GET_TIME (now);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
385 }
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 39687
diff changeset
386
57812
938845bec845 * atimer.c (alarm_signal_handler): Do not call set_alarm if
Jan Djärv <jan.h.d@swipnet.se>
parents: 56477
diff changeset
387 if (! pending_atimers)
938845bec845 * atimer.c (alarm_signal_handler): Do not call set_alarm if
Jan Djärv <jan.h.d@swipnet.se>
parents: 56477
diff changeset
388 set_alarm ();
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
389 }
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
390
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
391
93894
065fbf6b6fd0 (alarm_signal_handler): Call run_timers if not SYNC_INPUT.
Jan Djärv <jan.h.d@swipnet.se>
parents: 79759
diff changeset
392 /* Signal handler for SIGALRM. SIGNO is the signal number, i.e.
065fbf6b6fd0 (alarm_signal_handler): Call run_timers if not SYNC_INPUT.
Jan Djärv <jan.h.d@swipnet.se>
parents: 79759
diff changeset
393 SIGALRM. */
065fbf6b6fd0 (alarm_signal_handler): Call run_timers if not SYNC_INPUT.
Jan Djärv <jan.h.d@swipnet.se>
parents: 79759
diff changeset
394
065fbf6b6fd0 (alarm_signal_handler): Call run_timers if not SYNC_INPUT.
Jan Djärv <jan.h.d@swipnet.se>
parents: 79759
diff changeset
395 SIGTYPE
065fbf6b6fd0 (alarm_signal_handler): Call run_timers if not SYNC_INPUT.
Jan Djärv <jan.h.d@swipnet.se>
parents: 79759
diff changeset
396 alarm_signal_handler (signo)
065fbf6b6fd0 (alarm_signal_handler): Call run_timers if not SYNC_INPUT.
Jan Djärv <jan.h.d@swipnet.se>
parents: 79759
diff changeset
397 int signo;
065fbf6b6fd0 (alarm_signal_handler): Call run_timers if not SYNC_INPUT.
Jan Djärv <jan.h.d@swipnet.se>
parents: 79759
diff changeset
398 {
065fbf6b6fd0 (alarm_signal_handler): Call run_timers if not SYNC_INPUT.
Jan Djärv <jan.h.d@swipnet.se>
parents: 79759
diff changeset
399 pending_atimers = 1;
065fbf6b6fd0 (alarm_signal_handler): Call run_timers if not SYNC_INPUT.
Jan Djärv <jan.h.d@swipnet.se>
parents: 79759
diff changeset
400 #ifndef SYNC_INPUT
065fbf6b6fd0 (alarm_signal_handler): Call run_timers if not SYNC_INPUT.
Jan Djärv <jan.h.d@swipnet.se>
parents: 79759
diff changeset
401 run_timers ();
065fbf6b6fd0 (alarm_signal_handler): Call run_timers if not SYNC_INPUT.
Jan Djärv <jan.h.d@swipnet.se>
parents: 79759
diff changeset
402 #endif
065fbf6b6fd0 (alarm_signal_handler): Call run_timers if not SYNC_INPUT.
Jan Djärv <jan.h.d@swipnet.se>
parents: 79759
diff changeset
403 }
065fbf6b6fd0 (alarm_signal_handler): Call run_timers if not SYNC_INPUT.
Jan Djärv <jan.h.d@swipnet.se>
parents: 79759
diff changeset
404
065fbf6b6fd0 (alarm_signal_handler): Call run_timers if not SYNC_INPUT.
Jan Djärv <jan.h.d@swipnet.se>
parents: 79759
diff changeset
405
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
406 /* Call alarm_signal_handler for pending timers. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
407
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
408 void
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
409 do_pending_atimers ()
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
410 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
411 if (pending_atimers)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
412 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
413 BLOCK_ATIMERS;
93894
065fbf6b6fd0 (alarm_signal_handler): Call run_timers if not SYNC_INPUT.
Jan Djärv <jan.h.d@swipnet.se>
parents: 79759
diff changeset
414 run_timers ();
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
415 UNBLOCK_ATIMERS;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
416 }
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
417 }
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
418
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
419
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
420 /* Turn alarms on/off. This seems to be temporarily necessary on
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
421 some systems like HPUX (see process.c). */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
422
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
423 void
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
424 turn_on_atimers (on)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
425 int on;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
426 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
427 if (on)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
428 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
429 signal (SIGALRM, alarm_signal_handler);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
430 set_alarm ();
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
431 }
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
432 else
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
433 alarm (0);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
434 }
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
435
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
436
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
437 void
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
438 init_atimer ()
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
439 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
440 free_atimers = atimers = NULL;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
441 pending_atimers = 0;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
442 signal (SIGALRM, alarm_signal_handler);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
443 }
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49600
diff changeset
444
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49600
diff changeset
445 /* arch-tag: e6308261-eec6-404b-89fb-6e5909518d70
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49600
diff changeset
446 (do not change this comment) */