annotate src/atimer.c @ 41882:f3bc5e440020

Resurrect the Hebrew category settings for all Hebrew characters removed by the last change. Add code for setting the Hebrew category of the Unicode Hebrew characters. Set syntax entries for Hebrew punctuation characters.
author Eli Zaretskii <eliz@gnu.org>
date Fri, 07 Dec 2001 17:52:20 +0000
parents 3b31607ebbe1
children 23a1cea22d13
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.
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2 Copyright (C) 2000 Free Software Foundation, Inc.
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
3
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
4 This file is part of GNU Emacs.
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
5
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
6 GNU Emacs is free software; you can redistribute it and/or modify
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
7 it under the terms of the GNU General Public License as published by
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
8 the Free Software Foundation; either version 2, or (at your option)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
9 any later version.
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
10
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
11 GNU Emacs is distributed in the hope that it will be useful,
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
14 GNU General Public License for more details.
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
15
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
17 along with GNU Emacs; see the file COPYING. If not, write to
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
19 Boston, MA 02111-1307, USA. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
20
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
21 #include <config.h>
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
22 #include <lisp.h>
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
23 #include <signal.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 #include <stdio.h>
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
29
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
30 #ifdef HAVE_UNISTD_H
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
31 #include <unistd.h>
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
32 #endif
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
33
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
34 #ifdef HAVE_SYS_TIME_H
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
35 #include <sys/time.h>
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
36 #endif
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
37
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
38 /* Free-list of atimer structures. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
39
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
40 static struct atimer *free_atimers;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
41
27670
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
42 /* 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
43 lock_atimer. */
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
44
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
45 static struct atimer *stopped_atimers;
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
46
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
47 /* List of active atimers, sorted by expiration time. The timer that
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
48 will become ripe next is always at the front of this list. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
49
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
50 static struct atimer *atimers;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
51
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
52 /* Non-zero means alarm_signal_handler has found ripe timers but
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
53 interrupt_input_blocked was non-zero. In this case, timer
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
54 functions are not called until the next UNBLOCK_INPUT because timer
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
55 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
56 reentrant. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
57
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
58 int pending_atimers;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
59
39667
7ca787d18982 *** empty log message ***
Pavel Janík <Pavel@Janik.cz>
parents: 29672
diff changeset
60 /* Block/unblock SIGALRM. */
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
61
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
62 #define BLOCK_ATIMERS sigblock (sigmask (SIGALRM))
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
63 #define UNBLOCK_ATIMERS sigunblock (sigmask (SIGALRM))
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
64
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
65 /* Function prototypes. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
66
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
67 static void set_alarm P_ ((void));
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
68 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
69 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
70 struct atimer *));
29672
2722b6b5400d (alarm_signal_handler): Add forward declaration.
Gerd Moellmann <gerd@gnu.org>
parents: 28119
diff changeset
71 SIGTYPE alarm_signal_handler ();
27433
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
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
74 /* 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
75 ripe. FN is the function to call when the timer fires.
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
76 CLIENT_DATA is stored in the client_data member of the atimer
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
77 structure returned and so made available to FN when it is called.
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
78
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
79 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
80 timer fires.
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
81
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
82 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
83 future.
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
84
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
85 In both cases, the timer is automatically freed after it has fired.
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
86
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
87 If TYPE is ATIMER_CONTINUOUS, the timer fires every TIME s/us.
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
88
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
89 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
90 to cancel_atimer; don't free it yourself. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
91
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
92 struct atimer *
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
93 start_atimer (type, time, fn, client_data)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
94 enum atimer_type type;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
95 EMACS_TIME time;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
96 atimer_callback fn;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
97 void *client_data;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
98 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
99 struct atimer *t;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
100
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
101 /* 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
102 itimers. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
103 #ifndef HAVE_SETITIMER
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
104 if (EMACS_USECS (time) != 0)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
105 {
27452
7580a16f676c (start_atimer) [!HAVE_SETITIMER]: Use EMACS_SET_SECS
Eli Zaretskii <eliz@gnu.org>
parents: 27433
diff changeset
106 EMACS_SET_USECS (time, 0);
7580a16f676c (start_atimer) [!HAVE_SETITIMER]: Use EMACS_SET_SECS
Eli Zaretskii <eliz@gnu.org>
parents: 27433
diff changeset
107 EMACS_SET_SECS (time, EMACS_SECS (time) + 1);
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
108 }
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
109 #endif /* not HAVE_SETITIMER */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
110
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
111 /* Get an atimer structure from the free-list, or allocate
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
112 a new one. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
113 if (free_atimers)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
114 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
115 t = free_atimers;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
116 free_atimers = t->next;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
117 }
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
118 else
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
119 t = (struct atimer *) xmalloc (sizeof *t);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
120
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
121 /* Fill the atimer structure. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
122 bzero (t, sizeof *t);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
123 t->type = type;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
124 t->fn = fn;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
125 t->client_data = client_data;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
126
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
127 BLOCK_ATIMERS;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
128
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
129 /* Compute the timer's expiration time. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
130 switch (type)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
131 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
132 case ATIMER_ABSOLUTE:
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
133 t->expiration = time;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
134 break;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
135
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
136 case ATIMER_RELATIVE:
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
137 EMACS_GET_TIME (t->expiration);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
138 EMACS_ADD_TIME (t->expiration, t->expiration, time);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
139 break;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
140
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
141 case ATIMER_CONTINUOUS:
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
142 EMACS_GET_TIME (t->expiration);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
143 EMACS_ADD_TIME (t->expiration, t->expiration, time);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
144 t->interval = time;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
145 break;
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
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
148 /* Insert the timer in the list of active atimers. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
149 schedule_atimer (t);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
150 UNBLOCK_ATIMERS;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
151
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
152 /* Arrange for a SIGALRM at the time the next atimer is ripe. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
153 set_alarm ();
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
154
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
155 return t;
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
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
159 /* Cancel and free atimer TIMER. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
160
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
161 void
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
162 cancel_atimer (timer)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
163 struct atimer *timer;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
164 {
27913
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
165 int i;
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
166
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
167 BLOCK_ATIMERS;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
168
27913
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
169 for (i = 0; i < 2; ++i)
27903
cc3d4c12e03b (cancel_atimer): Handle canceling an atimer when
Gerd Moellmann <gerd@gnu.org>
parents: 27734
diff changeset
170 {
27913
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
171 struct atimer *t, *prev;
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
172 struct atimer **list = i ? &stopped_atimers : &atimers;
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
173
27903
cc3d4c12e03b (cancel_atimer): Handle canceling an atimer when
Gerd Moellmann <gerd@gnu.org>
parents: 27734
diff changeset
174 /* 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
175 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
176 ;
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
177
27913
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
178 /* 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
179 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
180 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
181 if (t)
cc3d4c12e03b (cancel_atimer): Handle canceling an atimer when
Gerd Moellmann <gerd@gnu.org>
parents: 27734
diff changeset
182 {
cc3d4c12e03b (cancel_atimer): Handle canceling an atimer when
Gerd Moellmann <gerd@gnu.org>
parents: 27734
diff changeset
183 if (prev)
cc3d4c12e03b (cancel_atimer): Handle canceling an atimer when
Gerd Moellmann <gerd@gnu.org>
parents: 27734
diff changeset
184 prev->next = t->next;
cc3d4c12e03b (cancel_atimer): Handle canceling an atimer when
Gerd Moellmann <gerd@gnu.org>
parents: 27734
diff changeset
185 else
cc3d4c12e03b (cancel_atimer): Handle canceling an atimer when
Gerd Moellmann <gerd@gnu.org>
parents: 27734
diff changeset
186 *list = t->next;
cc3d4c12e03b (cancel_atimer): Handle canceling an atimer when
Gerd Moellmann <gerd@gnu.org>
parents: 27734
diff changeset
187
cc3d4c12e03b (cancel_atimer): Handle canceling an atimer when
Gerd Moellmann <gerd@gnu.org>
parents: 27734
diff changeset
188 t->next = free_atimers;
cc3d4c12e03b (cancel_atimer): Handle canceling an atimer when
Gerd Moellmann <gerd@gnu.org>
parents: 27734
diff changeset
189 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
190 break;
27903
cc3d4c12e03b (cancel_atimer): Handle canceling an atimer when
Gerd Moellmann <gerd@gnu.org>
parents: 27734
diff changeset
191 }
27433
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
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
194 UNBLOCK_ATIMERS;
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
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
197
27913
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
198 /* 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
199 result list. */
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
200
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
201 static struct atimer *
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
202 append_atimer_lists (list1, list2)
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
203 struct atimer *list1, *list2;
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
204 {
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
205 if (list1 == NULL)
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
206 return list2;
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
207 else if (list2 == NULL)
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
208 return list1;
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
209 else
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
210 {
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
211 struct atimer *p;
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
212
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
213 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
214 ;
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
215 p->next = list2;
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
216 return list1;
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
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
221 /* 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
222
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
223 void
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
224 stop_other_atimers (t)
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
225 struct atimer *t;
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
226 {
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
227 BLOCK_ATIMERS;
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
228
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
229 if (t)
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
230 {
27734
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
231 struct atimer *p, *prev;
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
232
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
233 /* See if T is active. */
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
234 for (p = atimers, prev = 0; p && p != t; p = p->next)
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
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
237 if (p == t)
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
238 {
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
239 if (prev)
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
240 prev->next = t->next;
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
241 else
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
242 atimers = t->next;
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
243 t->next = NULL;
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
244 }
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
245 else
5c49b0be3b7b (stop_other_atimers): Don't call cancel_atimer because
Gerd Moellmann <gerd@gnu.org>
parents: 27670
diff changeset
246 /* 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
247 t = NULL;
27670
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
248 }
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
249
27913
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
250 stopped_atimers = append_atimer_lists (atimers, stopped_atimers);
27670
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
251 atimers = t;
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
252 UNBLOCK_ATIMERS;
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
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
256 /* 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
257 stop_other_atimers. */
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
258
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
259 void
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
260 run_all_atimers ()
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
261 {
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
262 if (stopped_atimers)
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
263 {
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
264 struct atimer *t = atimers;
27913
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
265 struct atimer *next;
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
266
27670
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
267 BLOCK_ATIMERS;
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
268 atimers = stopped_atimers;
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
269 stopped_atimers = NULL;
27913
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
270
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
271 while (t)
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
272 {
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
273 next = t->next;
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
274 schedule_atimer (t);
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
275 t = next;
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
276 }
81d5641c8b04 (start_atimer): Don't abort when timers are stopped.
Gerd Moellmann <gerd@gnu.org>
parents: 27903
diff changeset
277
27670
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
278 UNBLOCK_ATIMERS;
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
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
283 /* 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
284
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
285 Lisp_Object
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
286 unwind_stop_other_atimers (dummy)
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
287 Lisp_Object dummy;
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
288 {
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
289 run_all_atimers ();
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
290 return Qnil;
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
cf2edc15eaa9 (stopped_atimers): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 27452
diff changeset
293
27433
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
294 /* Arrange for a SIGALRM to arrive when the next timer is ripe. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
295
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
296 static void
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
297 set_alarm ()
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
298 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
299 #if defined (USG) && !defined (POSIX_SIGNALS)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
300 /* USG systems forget handlers when they are used;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
301 must reestablish each time. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
302 signal (SIGALRM, alarm_signal_handler);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
303 #endif /* USG */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
304
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
305 if (atimers)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
306 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
307 EMACS_TIME now, time;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
308 #ifdef HAVE_SETITIMER
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
309 struct itimerval it;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
310 #endif
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
311
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
312 /* Determine s/us till the next timer is ripe. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
313 EMACS_GET_TIME (now);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
314 EMACS_SUB_TIME (time, atimers->expiration, now);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
315
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
316 #ifdef HAVE_SETITIMER
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
317 /* Don't set the interval to 0; this disables the timer. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
318 if (EMACS_TIME_LE (atimers->expiration, now))
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
319 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
320 EMACS_SET_SECS (time, 0);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
321 EMACS_SET_USECS (time, 1000);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
322 }
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
323
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
324 bzero (&it, sizeof it);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
325 it.it_value = time;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
326 setitimer (ITIMER_REAL, &it, 0);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
327 #else /* not HAVE_SETITIMER */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
328 alarm (max (EMACS_SECS (time), 1));
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
329 #endif /* not HAVE_SETITIMER */
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
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
334 /* Insert timer T into the list of active atimers `atimers', keeping
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
335 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
336 already. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
337
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
338 static void
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
339 schedule_atimer (t)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
340 struct atimer *t;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
341 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
342 struct atimer *a = atimers, *prev = NULL;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
343
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
344 /* Look for the first atimer that is ripe after T. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
345 while (a && EMACS_TIME_GT (t->expiration, a->expiration))
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
346 prev = a, a = a->next;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
347
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
348 /* Insert T in front of the atimer found, if any. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
349 if (prev)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
350 prev->next = t;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
351 else
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
352 atimers = t;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
353
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
354 t->next = a;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
355 }
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
356
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
357
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
358 /* Signal handler for SIGALRM. SIGNO is the signal number, i.e.
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
359 SIGALRM. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
360
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
361 SIGTYPE
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
362 alarm_signal_handler (signo)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
363 int signo;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
364 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
365 EMACS_TIME 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 EMACS_GET_TIME (now);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
368 pending_atimers = 0;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
369
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
370 while (atimers
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
371 && (pending_atimers = interrupt_input_blocked) == 0
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
372 && EMACS_TIME_LE (atimers->expiration, now))
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
373 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
374 struct atimer *t;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
375
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
376 t = atimers;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
377 atimers = atimers->next;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
378 t->fn (t);
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 if (t->type == ATIMER_CONTINUOUS)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
381 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
382 EMACS_ADD_TIME (t->expiration, now, t->interval);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
383 schedule_atimer (t);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
384 }
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
385 else
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
386 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
387 t->next = free_atimers;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
388 free_atimers = t;
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 EMACS_GET_TIME (now);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
392 }
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
393
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
394 set_alarm ();
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
395 }
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
396
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
397
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
398 /* Call alarm_signal_handler for pending timers. */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
399
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
400 void
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
401 do_pending_atimers ()
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
402 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
403 if (pending_atimers)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
404 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
405 BLOCK_ATIMERS;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
406 alarm_signal_handler (SIGALRM);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
407 UNBLOCK_ATIMERS;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
408 }
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
409 }
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
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
412 /* Turn alarms on/off. This seems to be temporarily necessary on
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
413 some systems like HPUX (see process.c). */
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
414
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
415 void
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
416 turn_on_atimers (on)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
417 int on;
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 if (on)
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
420 {
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
421 signal (SIGALRM, alarm_signal_handler);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
422 set_alarm ();
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
423 }
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
424 else
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
425 alarm (0);
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
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 void
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
430 init_atimer ()
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 free_atimers = atimers = NULL;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
433 pending_atimers = 0;
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
434 signal (SIGALRM, alarm_signal_handler);
87dcc6a2c31b *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
435 }