quit_force: Replace TRY_CATCH wrapper macros
[deliverable/binutils-gdb.git] / gdb / event-loop.c
CommitLineData
b5a0ac70 1/* Event loop machinery for GDB, the GNU debugger.
32d0add0 2 Copyright (C) 1999-2015 Free Software Foundation, Inc.
b5a0ac70
SS
3 Written by Elena Zannoni <ezannoni@cygnus.com> of Cygnus Solutions.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
b5a0ac70
SS
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
371d5dec 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
b5a0ac70 19
b5a0ac70 20#include "defs.h"
9e0b60a8 21#include "event-loop.h"
c2c6d25f 22#include "event-top.h"
843b20dc 23#include "queue.h"
409a3f64 24
b5a0ac70 25#ifdef HAVE_POLL
409a3f64 26#if defined (HAVE_POLL_H)
9e0b60a8 27#include <poll.h>
409a3f64
AC
28#elif defined (HAVE_SYS_POLL_H)
29#include <sys/poll.h>
30#endif
44f45770 31#endif
409a3f64 32
9e0b60a8 33#include <sys/types.h>
c2c6d25f 34#include <sys/time.h>
0ea3f30e 35#include "gdb_select.h"
92bcb5f9 36#include "observer.h"
c2c6d25f 37
371d5dec
MS
38/* Tell create_file_handler what events we are interested in.
39 This is used by the select version of the event loop. */
01f69b38
DE
40
41#define GDB_READABLE (1<<1)
42#define GDB_WRITABLE (1<<2)
43#define GDB_EXCEPTION (1<<3)
44
50d01748
PA
45/* Data point to pass to the event handler. */
46typedef union event_data
47{
48 void *ptr;
49 int integer;
50} event_data;
51
c2c6d25f 52typedef struct gdb_event gdb_event;
50d01748 53typedef void (event_handler_func) (event_data);
c2c6d25f
JM
54
55/* Event for the GDB event system. Events are queued by calling
371d5dec 56 async_queue_event and serviced later on by gdb_do_one_event. An
c2c6d25f 57 event can be, for instance, a file descriptor becoming ready to be
50d01748 58 read. Servicing an event simply means that the procedure PROC will
c2c6d25f
JM
59 be called. We have 2 queues, one for file handlers that we listen
60 to in the event loop, and one for the file handlers+events that are
371d5dec 61 ready. The procedure PROC associated with each event is dependant
50d01748
PA
62 of the event source. In the case of monitored file descriptors, it
63 is always the same (handle_file_event). Its duty is to invoke the
64 handler associated with the file descriptor whose state change
65 generated the event, plus doing other cleanups and such. In the
66 case of async signal handlers, it is
67 invoke_async_signal_handler. */
c2c6d25f 68
843b20dc 69typedef struct gdb_event
c2c6d25f 70 {
50d01748
PA
71 /* Procedure to call to service this event. */
72 event_handler_func *proc;
73
74 /* Data to pass to the event handler. */
75 event_data data;
843b20dc 76 } *gdb_event_p;
c2c6d25f
JM
77
78/* Information about each file descriptor we register with the event
371d5dec 79 loop. */
c2c6d25f
JM
80
81typedef struct file_handler
82 {
371d5dec
MS
83 int fd; /* File descriptor. */
84 int mask; /* Events we want to monitor: POLLIN, etc. */
c2c6d25f 85 int ready_mask; /* Events that have been seen since
371d5dec
MS
86 the last time. */
87 handler_func *proc; /* Procedure to call when fd is ready. */
88 gdb_client_data client_data; /* Argument to pass to proc. */
89 int error; /* Was an error detected on this fd? */
90 struct file_handler *next_file; /* Next registered file descriptor. */
c2c6d25f
JM
91 }
92file_handler;
93
371d5dec 94/* PROC is a function to be invoked when the READY flag is set. This
c2c6d25f 95 happens when there has been a signal and the corresponding signal
371d5dec
MS
96 handler has 'triggered' this async_signal_handler for execution.
97 The actual work to be done in response to a signal will be carried
98 out by PROC at a later time, within process_event. This provides a
99 deferred execution of signal handlers.
100
c2c6d25f 101 Async_init_signals takes care of setting up such an
371d5dec
MS
102 async_signal_handler for each interesting signal. */
103
c2c6d25f
JM
104typedef struct async_signal_handler
105 {
371d5dec
MS
106 int ready; /* If ready, call this handler
107 from the main event loop, using
108 invoke_async_handler. */
109 struct async_signal_handler *next_handler; /* Ptr to next handler. */
110 sig_handler_func *proc; /* Function to call to do the work. */
111 gdb_client_data client_data; /* Argument to async_handler_func. */
c2c6d25f
JM
112 }
113async_signal_handler;
114
50d01748
PA
115/* PROC is a function to be invoked when the READY flag is set. This
116 happens when the event has been marked with
117 MARK_ASYNC_EVENT_HANDLER. The actual work to be done in response
118 to an event will be carried out by PROC at a later time, within
119 process_event. This provides a deferred execution of event
120 handlers. */
121typedef struct async_event_handler
122 {
123 /* If ready, call this handler from the main event loop, using
124 invoke_event_handler. */
125 int ready;
126
127 /* Point to next handler. */
128 struct async_event_handler *next_handler;
129
130 /* Function to call to do the work. */
131 async_event_handler_func *proc;
132
133 /* Argument to PROC. */
134 gdb_client_data client_data;
135 }
136async_event_handler;
137
b5a0ac70
SS
138/* Gdb_notifier is just a list of file descriptors gdb is interested in.
139 These are the input file descriptor, and the target file
371d5dec 140 descriptor. We have two flavors of the notifier, one for platforms
b5a0ac70 141 that have the POLL function, the other for those that don't, and
371d5dec 142 only support SELECT. Each of the elements in the gdb_notifier list is
b5a0ac70 143 basically a description of what kind of events gdb is interested
371d5dec 144 in, for each fd. */
b5a0ac70 145
392a587b 146/* As of 1999-04-30 only the input file descriptor is registered with the
371d5dec 147 event loop. */
b5a0ac70 148
44f45770 149/* Do we use poll or select ? */
b5a0ac70 150#ifdef HAVE_POLL
44f45770
EZ
151#define USE_POLL 1
152#else
153#define USE_POLL 0
154#endif /* HAVE_POLL */
155
156static unsigned char use_poll = USE_POLL;
b5a0ac70 157
011825f0
MM
158#ifdef USE_WIN32API
159#include <windows.h>
160#include <io.h>
161#endif
162
b5a0ac70
SS
163static struct
164 {
371d5dec 165 /* Ptr to head of file handler list. */
b5a0ac70
SS
166 file_handler *first_file_handler;
167
44f45770 168#ifdef HAVE_POLL
371d5dec 169 /* Ptr to array of pollfd structures. */
b5a0ac70
SS
170 struct pollfd *poll_fds;
171
371d5dec 172 /* Timeout in milliseconds for calls to poll(). */
44f45770
EZ
173 int poll_timeout;
174#endif
b5a0ac70
SS
175
176 /* Masks to be used in the next call to select.
371d5dec 177 Bits are set in response to calls to create_file_handler. */
58a2c44a 178 fd_set check_masks[3];
b5a0ac70 179
371d5dec 180 /* What file descriptors were found ready by select. */
58a2c44a 181 fd_set ready_masks[3];
b5a0ac70 182
371d5dec
MS
183 /* Number of file descriptors to monitor (for poll). */
184 /* Number of valid bits (highest fd value + 1) (for select). */
b5a0ac70
SS
185 int num_fds;
186
371d5dec 187 /* Time structure for calls to select(). */
44f45770 188 struct timeval select_timeout;
c2c6d25f 189
371d5dec 190 /* Flag to tell whether the timeout should be used. */
c2c6d25f 191 int timeout_valid;
6426a772 192 }
b5a0ac70
SS
193gdb_notifier;
194
371d5dec
MS
195/* Structure associated with a timer. PROC will be executed at the
196 first occasion after WHEN. */
c2c6d25f
JM
197struct gdb_timer
198 {
199 struct timeval when;
200 int timer_id;
201 struct gdb_timer *next;
371d5dec
MS
202 timer_handler_func *proc; /* Function to call to do the work. */
203 gdb_client_data client_data; /* Argument to async_handler_func. */
ae462839 204 };
c2c6d25f 205
371d5dec
MS
206/* List of currently active timers. It is sorted in order of
207 increasing timers. */
c2c6d25f
JM
208static struct
209 {
371d5dec 210 /* Pointer to first in timer list. */
c2c6d25f
JM
211 struct gdb_timer *first_timer;
212
371d5dec 213 /* Id of the last timer created. */
c2c6d25f
JM
214 int num_timers;
215 }
216timer_list;
217
b5a0ac70 218/* All the async_signal_handlers gdb is interested in are kept onto
371d5dec 219 this list. */
b5a0ac70
SS
220static struct
221 {
371d5dec 222 /* Pointer to first in handler list. */
c5aa993b
JM
223 async_signal_handler *first_handler;
224
371d5dec 225 /* Pointer to last in handler list. */
c5aa993b 226 async_signal_handler *last_handler;
b5a0ac70
SS
227 }
228sighandler_list;
229
50d01748 230/* All the async_event_handlers gdb is interested in are kept onto
371d5dec 231 this list. */
50d01748
PA
232static struct
233 {
371d5dec 234 /* Pointer to first in handler list. */
50d01748
PA
235 async_event_handler *first_handler;
236
371d5dec 237 /* Pointer to last in handler list. */
50d01748
PA
238 async_event_handler *last_handler;
239 }
240async_event_handler_list;
241
242static int invoke_async_signal_handlers (void);
243static void create_file_handler (int fd, int mask, handler_func *proc,
244 gdb_client_data client_data);
70b66289 245static int check_async_event_handlers (void);
50d01748 246static int gdb_wait_for_event (int);
70b66289
PA
247static int update_wait_timeout (void);
248static int poll_timers (void);
b5a0ac70
SS
249\f
250
b5a0ac70
SS
251/* Process one high level event. If nothing is ready at this time,
252 wait for something to happen (via gdb_wait_for_event), then process
11cf8741 253 it. Returns >0 if something was done otherwise returns <0 (this
e0dd0826 254 can happen if there are no event sources to wait for). */
11cf8741 255
99656a61 256int
e0dd0826 257gdb_do_one_event (void)
b5a0ac70 258{
50d01748
PA
259 static int event_source_head = 0;
260 const int number_of_sources = 3;
261 int current = 0;
262
70b66289
PA
263 /* First let's see if there are any asynchronous signal handlers
264 that are ready. These would be the result of invoking any of the
265 signal handlers. */
266 if (invoke_async_signal_handlers ())
50d01748
PA
267 return 1;
268
269 /* To level the fairness across event sources, we poll them in a
270 round-robin fashion. */
271 for (current = 0; current < number_of_sources; current++)
11cf8741 272 {
70b66289
PA
273 int res;
274
50d01748
PA
275 switch (event_source_head)
276 {
277 case 0:
70b66289
PA
278 /* Are any timers that are ready? */
279 res = poll_timers ();
50d01748
PA
280 break;
281 case 1:
282 /* Are there events already waiting to be collected on the
283 monitored file descriptors? */
70b66289 284 res = gdb_wait_for_event (0);
50d01748
PA
285 break;
286 case 2:
287 /* Are there any asynchronous event handlers ready? */
70b66289 288 res = check_async_event_handlers ();
50d01748 289 break;
80bd5fab
PA
290 default:
291 internal_error (__FILE__, __LINE__,
292 "unexpected event_source_head %d",
293 event_source_head);
50d01748
PA
294 }
295
296 event_source_head++;
297 if (event_source_head == number_of_sources)
298 event_source_head = 0;
7e5cd2de 299
70b66289
PA
300 if (res > 0)
301 return 1;
302 }
7e5cd2de 303
50d01748
PA
304 /* Block waiting for a new event. If gdb_wait_for_event returns -1,
305 we should get out because this means that there are no event
306 sources left. This will make the event loop stop, and the
307 application exit. */
7e5cd2de 308
50d01748
PA
309 if (gdb_wait_for_event (1) < 0)
310 return -1;
7e5cd2de 311
50d01748
PA
312 /* If gdb_wait_for_event has returned 1, it means that one event has
313 been handled. We break out of the loop. */
11cf8741
JM
314 return 1;
315}
316
371d5dec
MS
317/* Start up the event loop. This is the entry point to the event loop
318 from the command loop. */
b5a0ac70 319
11cf8741
JM
320void
321start_event_loop (void)
322{
e0dd0826
PA
323 /* Loop until there is nothing to do. This is the entry point to
324 the event loop engine. gdb_do_one_event will process one event
325 for each invocation. It blocks waiting for an event and then
326 processes it. */
b5a0ac70
SS
327 while (1)
328 {
e0dd0826
PA
329 volatile struct gdb_exception ex;
330 int result = 0;
3b8630c3 331
e0dd0826 332 TRY_CATCH (ex, RETURN_MASK_ALL)
b5a0ac70 333 {
e0dd0826
PA
334 result = gdb_do_one_event ();
335 }
336 if (ex.reason < 0)
337 {
338 exception_print (gdb_stderr, ex);
339
32c1e744
VP
340 /* If any exception escaped to here, we better enable
341 stdin. Otherwise, any command that calls async_disable_stdin,
342 and then throws, will leave stdin inoperable. */
712af3be 343 async_enable_stdin ();
e0dd0826
PA
344 /* If we long-jumped out of do_one_event, we probably didn't
345 get around to resetting the prompt, which leaves readline
346 in a messed-up state. Reset it here. */
92bcb5f9 347 observer_notify_command_error ();
467d8519
TT
348 /* This call looks bizarre, but it is required. If the user
349 entered a command that caused an error,
350 after_char_processing_hook won't be called from
351 rl_callback_read_char_wrapper. Using a cleanup there
352 won't work, since we want this function to be called
353 after a new prompt is printed. */
354 if (after_char_processing_hook)
355 (*after_char_processing_hook) ();
b5a0ac70 356 /* Maybe better to set a flag to be checked somewhere as to
371d5dec 357 whether display the prompt or not. */
b5a0ac70 358 }
e0dd0826
PA
359 if (result < 0)
360 break;
b5a0ac70 361 }
085dd6e6 362
371d5dec
MS
363 /* We are done with the event loop. There are no more event sources
364 to listen to. So we exit GDB. */
085dd6e6
JM
365 return;
366}
b5a0ac70
SS
367\f
368
085dd6e6
JM
369/* Wrapper function for create_file_handler, so that the caller
370 doesn't have to know implementation details about the use of poll
371d5dec 371 vs. select. */
c5aa993b 372void
6426a772 373add_file_handler (int fd, handler_func * proc, gdb_client_data client_data)
085dd6e6
JM
374{
375#ifdef HAVE_POLL
44f45770
EZ
376 struct pollfd fds;
377#endif
378
379 if (use_poll)
380 {
381#ifdef HAVE_POLL
371d5dec
MS
382 /* Check to see if poll () is usable. If not, we'll switch to
383 use select. This can happen on systems like
7e5cd2de
EZ
384 m68k-motorola-sys, `poll' cannot be used to wait for `stdin'.
385 On m68k-motorola-sysv, tty's are not stream-based and not
371d5dec 386 `poll'able. */
7e5cd2de
EZ
387 fds.fd = fd;
388 fds.events = POLLIN;
389 if (poll (&fds, 1, 0) == 1 && (fds.revents & POLLNVAL))
390 use_poll = 0;
44f45770 391#else
8e65ff28 392 internal_error (__FILE__, __LINE__,
e2e0b3e5 393 _("use_poll without HAVE_POLL"));
44f45770
EZ
394#endif /* HAVE_POLL */
395 }
396 if (use_poll)
397 {
398#ifdef HAVE_POLL
399 create_file_handler (fd, POLLIN, proc, client_data);
085dd6e6 400#else
8e65ff28 401 internal_error (__FILE__, __LINE__,
e2e0b3e5 402 _("use_poll without HAVE_POLL"));
085dd6e6 403#endif
44f45770
EZ
404 }
405 else
371d5dec
MS
406 create_file_handler (fd, GDB_READABLE | GDB_EXCEPTION,
407 proc, client_data);
085dd6e6
JM
408}
409
b5a0ac70 410/* Add a file handler/descriptor to the list of descriptors we are
371d5dec
MS
411 interested in.
412
413 FD is the file descriptor for the file/stream to be listened to.
414
415 For the poll case, MASK is a combination (OR) of POLLIN,
416 POLLRDNORM, POLLRDBAND, POLLPRI, POLLOUT, POLLWRNORM, POLLWRBAND:
417 these are the events we are interested in. If any of them occurs,
418 proc should be called.
419
420 For the select case, MASK is a combination of READABLE, WRITABLE,
421 EXCEPTION. PROC is the procedure that will be called when an event
422 occurs for FD. CLIENT_DATA is the argument to pass to PROC. */
423
085dd6e6 424static void
371d5dec
MS
425create_file_handler (int fd, int mask, handler_func * proc,
426 gdb_client_data client_data)
b5a0ac70
SS
427{
428 file_handler *file_ptr;
429
371d5dec
MS
430 /* Do we already have a file handler for this file? (We may be
431 changing its associated procedure). */
b5a0ac70
SS
432 for (file_ptr = gdb_notifier.first_file_handler; file_ptr != NULL;
433 file_ptr = file_ptr->next_file)
434 {
435 if (file_ptr->fd == fd)
436 break;
437 }
438
371d5dec
MS
439 /* It is a new file descriptor. Add it to the list. Otherwise, just
440 change the data associated with it. */
b5a0ac70
SS
441 if (file_ptr == NULL)
442 {
443 file_ptr = (file_handler *) xmalloc (sizeof (file_handler));
444 file_ptr->fd = fd;
445 file_ptr->ready_mask = 0;
446 file_ptr->next_file = gdb_notifier.first_file_handler;
447 gdb_notifier.first_file_handler = file_ptr;
b5a0ac70 448
05a6c72c
KS
449 if (use_poll)
450 {
b5a0ac70 451#ifdef HAVE_POLL
05a6c72c
KS
452 gdb_notifier.num_fds++;
453 if (gdb_notifier.poll_fds)
454 gdb_notifier.poll_fds =
455 (struct pollfd *) xrealloc (gdb_notifier.poll_fds,
456 (gdb_notifier.num_fds
457 * sizeof (struct pollfd)));
458 else
459 gdb_notifier.poll_fds =
460 (struct pollfd *) xmalloc (sizeof (struct pollfd));
461 (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->fd = fd;
462 (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->events = mask;
463 (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->revents = 0;
44f45770 464#else
05a6c72c 465 internal_error (__FILE__, __LINE__,
e2e0b3e5 466 _("use_poll without HAVE_POLL"));
44f45770 467#endif /* HAVE_POLL */
05a6c72c 468 }
44f45770 469 else
05a6c72c
KS
470 {
471 if (mask & GDB_READABLE)
472 FD_SET (fd, &gdb_notifier.check_masks[0]);
473 else
474 FD_CLR (fd, &gdb_notifier.check_masks[0]);
475
476 if (mask & GDB_WRITABLE)
477 FD_SET (fd, &gdb_notifier.check_masks[1]);
478 else
479 FD_CLR (fd, &gdb_notifier.check_masks[1]);
480
481 if (mask & GDB_EXCEPTION)
482 FD_SET (fd, &gdb_notifier.check_masks[2]);
483 else
484 FD_CLR (fd, &gdb_notifier.check_masks[2]);
485
486 if (gdb_notifier.num_fds <= fd)
487 gdb_notifier.num_fds = fd + 1;
488 }
44f45770 489 }
05a6c72c
KS
490
491 file_ptr->proc = proc;
492 file_ptr->client_data = client_data;
493 file_ptr->mask = mask;
b5a0ac70
SS
494}
495
496/* Remove the file descriptor FD from the list of monitored fd's:
371d5dec 497 i.e. we don't care anymore about events on the FD. */
b5a0ac70 498void
c2c6d25f 499delete_file_handler (int fd)
b5a0ac70
SS
500{
501 file_handler *file_ptr, *prev_ptr = NULL;
58a2c44a
EZ
502 int i;
503#ifdef HAVE_POLL
504 int j;
b5a0ac70 505 struct pollfd *new_poll_fds;
b5a0ac70
SS
506#endif
507
371d5dec 508 /* Find the entry for the given file. */
b5a0ac70
SS
509
510 for (file_ptr = gdb_notifier.first_file_handler; file_ptr != NULL;
511 file_ptr = file_ptr->next_file)
512 {
513 if (file_ptr->fd == fd)
514 break;
515 }
516
517 if (file_ptr == NULL)
518 return;
519
44f45770
EZ
520 if (use_poll)
521 {
b5a0ac70 522#ifdef HAVE_POLL
371d5dec
MS
523 /* Create a new poll_fds array by copying every fd's information
524 but the one we want to get rid of. */
b5a0ac70 525
371d5dec
MS
526 new_poll_fds = (struct pollfd *)
527 xmalloc ((gdb_notifier.num_fds - 1) * sizeof (struct pollfd));
b5a0ac70 528
44f45770 529 for (i = 0, j = 0; i < gdb_notifier.num_fds; i++)
b5a0ac70 530 {
44f45770
EZ
531 if ((gdb_notifier.poll_fds + i)->fd != fd)
532 {
533 (new_poll_fds + j)->fd = (gdb_notifier.poll_fds + i)->fd;
534 (new_poll_fds + j)->events = (gdb_notifier.poll_fds + i)->events;
3e43a32a
MS
535 (new_poll_fds + j)->revents
536 = (gdb_notifier.poll_fds + i)->revents;
44f45770
EZ
537 j++;
538 }
b5a0ac70 539 }
b8c9b27d 540 xfree (gdb_notifier.poll_fds);
44f45770
EZ
541 gdb_notifier.poll_fds = new_poll_fds;
542 gdb_notifier.num_fds--;
543#else
8e65ff28 544 internal_error (__FILE__, __LINE__,
e2e0b3e5 545 _("use_poll without HAVE_POLL"));
44f45770 546#endif /* HAVE_POLL */
b5a0ac70 547 }
44f45770
EZ
548 else
549 {
550 if (file_ptr->mask & GDB_READABLE)
551 FD_CLR (fd, &gdb_notifier.check_masks[0]);
552 if (file_ptr->mask & GDB_WRITABLE)
553 FD_CLR (fd, &gdb_notifier.check_masks[1]);
554 if (file_ptr->mask & GDB_EXCEPTION)
555 FD_CLR (fd, &gdb_notifier.check_masks[2]);
b5a0ac70 556
371d5dec 557 /* Find current max fd. */
b5a0ac70 558
44f45770 559 if ((fd + 1) == gdb_notifier.num_fds)
b5a0ac70 560 {
44f45770
EZ
561 gdb_notifier.num_fds--;
562 for (i = gdb_notifier.num_fds; i; i--)
563 {
564 if (FD_ISSET (i - 1, &gdb_notifier.check_masks[0])
565 || FD_ISSET (i - 1, &gdb_notifier.check_masks[1])
566 || FD_ISSET (i - 1, &gdb_notifier.check_masks[2]))
567 break;
568 }
569 gdb_notifier.num_fds = i;
b5a0ac70
SS
570 }
571 }
b5a0ac70 572
cff3e48b 573 /* Deactivate the file descriptor, by clearing its mask,
371d5dec 574 so that it will not fire again. */
cff3e48b
JM
575
576 file_ptr->mask = 0;
577
371d5dec 578 /* Get rid of the file handler in the file handler list. */
b5a0ac70
SS
579 if (file_ptr == gdb_notifier.first_file_handler)
580 gdb_notifier.first_file_handler = file_ptr->next_file;
581 else
582 {
583 for (prev_ptr = gdb_notifier.first_file_handler;
9e0b60a8 584 prev_ptr->next_file != file_ptr;
b5a0ac70
SS
585 prev_ptr = prev_ptr->next_file)
586 ;
587 prev_ptr->next_file = file_ptr->next_file;
588 }
b8c9b27d 589 xfree (file_ptr);
b5a0ac70
SS
590}
591
592/* Handle the given event by calling the procedure associated to the
70b66289
PA
593 corresponding file handler. */
594
b5a0ac70 595static void
70b66289 596handle_file_event (file_handler *file_ptr, int ready_mask)
b5a0ac70 597{
c2c6d25f
JM
598 int mask;
599#ifdef HAVE_POLL
600 int error_mask;
c2c6d25f 601#endif
b5a0ac70 602
b5a0ac70 603 {
b5a0ac70
SS
604 {
605 /* With poll, the ready_mask could have any of three events
371d5dec
MS
606 set to 1: POLLHUP, POLLERR, POLLNVAL. These events
607 cannot be used in the requested event mask (events), but
608 they can be returned in the return mask (revents). We
609 need to check for those event too, and add them to the
610 mask which will be passed to the handler. */
b5a0ac70
SS
611
612 /* See if the desired events (mask) match the received
371d5dec 613 events (ready_mask). */
b5a0ac70 614
44f45770 615 if (use_poll)
c2c6d25f 616 {
44f45770 617#ifdef HAVE_POLL
652c71b4
AS
618 /* POLLHUP means EOF, but can be combined with POLLIN to
619 signal more data to read. */
44f45770 620 error_mask = POLLHUP | POLLERR | POLLNVAL;
70b66289 621 mask = ready_mask & (file_ptr->mask | error_mask);
44f45770 622
652c71b4 623 if ((mask & (POLLERR | POLLNVAL)) != 0)
44f45770 624 {
371d5dec
MS
625 /* Work in progress. We may need to tell somebody
626 what kind of error we had. */
652c71b4 627 if (mask & POLLERR)
3e43a32a
MS
628 printf_unfiltered (_("Error detected on fd %d\n"),
629 file_ptr->fd);
652c71b4 630 if (mask & POLLNVAL)
3e43a32a
MS
631 printf_unfiltered (_("Invalid or non-`poll'able fd %d\n"),
632 file_ptr->fd);
44f45770
EZ
633 file_ptr->error = 1;
634 }
635 else
636 file_ptr->error = 0;
637#else
8e65ff28 638 internal_error (__FILE__, __LINE__,
e2e0b3e5 639 _("use_poll without HAVE_POLL"));
44f45770 640#endif /* HAVE_POLL */
6426a772
JM
641 }
642 else
c2c6d25f 643 {
70b66289 644 if (ready_mask & GDB_EXCEPTION)
44f45770 645 {
3e43a32a
MS
646 printf_unfiltered (_("Exception condition detected "
647 "on fd %d\n"), file_ptr->fd);
44f45770
EZ
648 file_ptr->error = 1;
649 }
650 else
651 file_ptr->error = 0;
70b66289 652 mask = ready_mask & file_ptr->mask;
c2c6d25f 653 }
b5a0ac70 654
371d5dec 655 /* If there was a match, then call the handler. */
b5a0ac70 656 if (mask != 0)
2acceee2 657 (*file_ptr->proc) (file_ptr->error, file_ptr->client_data);
b5a0ac70
SS
658 }
659 }
660}
661
70b66289
PA
662/* Wait for new events on the monitored file descriptors. Run the
663 event handler if the first descriptor that is detected by the poll.
664 If BLOCK and if there are no events, this function will block in
665 the call to poll. Return 1 if an event was handled. Return -1 if
666 there are no file descriptors to monitor. Return 1 if an event was
667 handled, otherwise returns 0. */
668
b5a0ac70 669static int
50d01748 670gdb_wait_for_event (int block)
b5a0ac70
SS
671{
672 file_handler *file_ptr;
0f71a2f6
JM
673 int num_found = 0;
674 int i;
b5a0ac70 675
371d5dec 676 /* Make sure all output is done before getting another event. */
7be570e7
JM
677 gdb_flush (gdb_stdout);
678 gdb_flush (gdb_stderr);
679
b5a0ac70
SS
680 if (gdb_notifier.num_fds == 0)
681 return -1;
682
70b66289
PA
683 if (block)
684 update_wait_timeout ();
685
44f45770
EZ
686 if (use_poll)
687 {
b5a0ac70 688#ifdef HAVE_POLL
50d01748
PA
689 int timeout;
690
691 if (block)
692 timeout = gdb_notifier.timeout_valid ? gdb_notifier.poll_timeout : -1;
693 else
694 timeout = 0;
695
696 num_found = poll (gdb_notifier.poll_fds,
697 (unsigned long) gdb_notifier.num_fds, timeout);
44f45770
EZ
698
699 /* Don't print anything if we get out of poll because of a
50d01748 700 signal. */
44f45770 701 if (num_found == -1 && errno != EINTR)
e2e0b3e5 702 perror_with_name (("poll"));
44f45770 703#else
8e65ff28 704 internal_error (__FILE__, __LINE__,
e2e0b3e5 705 _("use_poll without HAVE_POLL"));
44f45770
EZ
706#endif /* HAVE_POLL */
707 }
708 else
c2c6d25f 709 {
50d01748 710 struct timeval select_timeout;
50d01748 711 struct timeval *timeout_p;
d7f9d729 712
50d01748
PA
713 if (block)
714 timeout_p = gdb_notifier.timeout_valid
715 ? &gdb_notifier.select_timeout : NULL;
716 else
717 {
718 memset (&select_timeout, 0, sizeof (select_timeout));
719 timeout_p = &select_timeout;
720 }
721
44f45770
EZ
722 gdb_notifier.ready_masks[0] = gdb_notifier.check_masks[0];
723 gdb_notifier.ready_masks[1] = gdb_notifier.check_masks[1];
724 gdb_notifier.ready_masks[2] = gdb_notifier.check_masks[2];
011825f0
MM
725 num_found = gdb_select (gdb_notifier.num_fds,
726 &gdb_notifier.ready_masks[0],
727 &gdb_notifier.ready_masks[1],
728 &gdb_notifier.ready_masks[2],
50d01748 729 timeout_p);
44f45770 730
371d5dec 731 /* Clear the masks after an error from select. */
44f45770
EZ
732 if (num_found == -1)
733 {
734 FD_ZERO (&gdb_notifier.ready_masks[0]);
735 FD_ZERO (&gdb_notifier.ready_masks[1]);
736 FD_ZERO (&gdb_notifier.ready_masks[2]);
50d01748
PA
737
738 /* Dont print anything if we got a signal, let gdb handle
739 it. */
44f45770 740 if (errno != EINTR)
e2e0b3e5 741 perror_with_name (("select"));
44f45770 742 }
c2c6d25f 743 }
b5a0ac70 744
70b66289
PA
745 /* Run event handlers. We always run just one handler and go back
746 to polling, in case a handler changes the notifier list. Since
747 events for sources we haven't consumed yet wake poll/select
748 immediately, no event is lost. */
b5a0ac70 749
44f45770
EZ
750 if (use_poll)
751 {
b5a0ac70 752#ifdef HAVE_POLL
44f45770
EZ
753 for (i = 0; (i < gdb_notifier.num_fds) && (num_found > 0); i++)
754 {
755 if ((gdb_notifier.poll_fds + i)->revents)
756 num_found--;
757 else
758 continue;
b5a0ac70 759
44f45770
EZ
760 for (file_ptr = gdb_notifier.first_file_handler;
761 file_ptr != NULL;
762 file_ptr = file_ptr->next_file)
763 {
764 if (file_ptr->fd == (gdb_notifier.poll_fds + i)->fd)
765 break;
766 }
767
768 if (file_ptr)
769 {
70b66289
PA
770 int mask = (gdb_notifier.poll_fds + i)->revents;
771
772 handle_file_event (file_ptr, mask);
773 return 1;
44f45770 774 }
44f45770
EZ
775 }
776#else
8e65ff28 777 internal_error (__FILE__, __LINE__,
e2e0b3e5 778 _("use_poll without HAVE_POLL"));
44f45770
EZ
779#endif /* HAVE_POLL */
780 }
781 else
782 {
b5a0ac70 783 for (file_ptr = gdb_notifier.first_file_handler;
44f45770 784 (file_ptr != NULL) && (num_found > 0);
b5a0ac70
SS
785 file_ptr = file_ptr->next_file)
786 {
44f45770
EZ
787 int mask = 0;
788
789 if (FD_ISSET (file_ptr->fd, &gdb_notifier.ready_masks[0]))
790 mask |= GDB_READABLE;
791 if (FD_ISSET (file_ptr->fd, &gdb_notifier.ready_masks[1]))
792 mask |= GDB_WRITABLE;
793 if (FD_ISSET (file_ptr->fd, &gdb_notifier.ready_masks[2]))
794 mask |= GDB_EXCEPTION;
795
796 if (!mask)
797 continue;
798 else
799 num_found--;
b5a0ac70 800
70b66289
PA
801 handle_file_event (file_ptr, mask);
802 return 1;
b5a0ac70 803 }
b5a0ac70 804 }
b5a0ac70
SS
805 return 0;
806}
807\f
808
371d5dec 809/* Create an asynchronous handler, allocating memory for it.
b5a0ac70
SS
810 Return a pointer to the newly created handler.
811 This pointer will be used to invoke the handler by
812 invoke_async_signal_handler.
813 PROC is the function to call with CLIENT_DATA argument
371d5dec 814 whenever the handler is invoked. */
b5a0ac70 815async_signal_handler *
3e43a32a
MS
816create_async_signal_handler (sig_handler_func * proc,
817 gdb_client_data client_data)
b5a0ac70
SS
818{
819 async_signal_handler *async_handler_ptr;
820
821 async_handler_ptr =
822 (async_signal_handler *) xmalloc (sizeof (async_signal_handler));
823 async_handler_ptr->ready = 0;
824 async_handler_ptr->next_handler = NULL;
825 async_handler_ptr->proc = proc;
826 async_handler_ptr->client_data = client_data;
827 if (sighandler_list.first_handler == NULL)
828 sighandler_list.first_handler = async_handler_ptr;
829 else
830 sighandler_list.last_handler->next_handler = async_handler_ptr;
831 sighandler_list.last_handler = async_handler_ptr;
832 return async_handler_ptr;
833}
834
b803fb0f
DJ
835/* Call the handler from HANDLER immediately. This function runs
836 signal handlers when returning to the event loop would be too
837 slow. */
838void
839call_async_signal_handler (struct async_signal_handler *handler)
840{
841 (*handler->proc) (handler->client_data);
842}
843
371d5dec
MS
844/* Mark the handler (ASYNC_HANDLER_PTR) as ready. This information
845 will be used when the handlers are invoked, after we have waited
846 for some event. The caller of this function is the interrupt
847 handler associated with a signal. */
b5a0ac70 848void
6426a772 849mark_async_signal_handler (async_signal_handler * async_handler_ptr)
b5a0ac70 850{
50d01748 851 async_handler_ptr->ready = 1;
b5a0ac70
SS
852}
853
50d01748
PA
854/* Call all the handlers that are ready. Returns true if any was
855 indeed ready. */
856static int
857invoke_async_signal_handlers (void)
b5a0ac70
SS
858{
859 async_signal_handler *async_handler_ptr;
50d01748 860 int any_ready = 0;
b5a0ac70 861
50d01748 862 /* Invoke ready handlers. */
b5a0ac70
SS
863
864 while (1)
865 {
c5aa993b 866 for (async_handler_ptr = sighandler_list.first_handler;
b5a0ac70
SS
867 async_handler_ptr != NULL;
868 async_handler_ptr = async_handler_ptr->next_handler)
869 {
870 if (async_handler_ptr->ready)
871 break;
872 }
873 if (async_handler_ptr == NULL)
874 break;
50d01748 875 any_ready = 1;
b5a0ac70
SS
876 async_handler_ptr->ready = 0;
877 (*async_handler_ptr->proc) (async_handler_ptr->client_data);
878 }
879
50d01748 880 return any_ready;
b5a0ac70
SS
881}
882
371d5dec 883/* Delete an asynchronous handler (ASYNC_HANDLER_PTR).
b5a0ac70
SS
884 Free the space allocated for it. */
885void
6426a772 886delete_async_signal_handler (async_signal_handler ** async_handler_ptr)
b5a0ac70
SS
887{
888 async_signal_handler *prev_ptr;
889
43ff13b4 890 if (sighandler_list.first_handler == (*async_handler_ptr))
b5a0ac70 891 {
43ff13b4 892 sighandler_list.first_handler = (*async_handler_ptr)->next_handler;
b5a0ac70
SS
893 if (sighandler_list.first_handler == NULL)
894 sighandler_list.last_handler = NULL;
895 }
896 else
897 {
898 prev_ptr = sighandler_list.first_handler;
32107cd5 899 while (prev_ptr && prev_ptr->next_handler != (*async_handler_ptr))
b5a0ac70 900 prev_ptr = prev_ptr->next_handler;
60bc018f 901 gdb_assert (prev_ptr);
43ff13b4
JM
902 prev_ptr->next_handler = (*async_handler_ptr)->next_handler;
903 if (sighandler_list.last_handler == (*async_handler_ptr))
b5a0ac70
SS
904 sighandler_list.last_handler = prev_ptr;
905 }
b8c9b27d 906 xfree ((*async_handler_ptr));
43ff13b4 907 (*async_handler_ptr) = NULL;
b5a0ac70
SS
908}
909
50d01748
PA
910/* Create an asynchronous event handler, allocating memory for it.
911 Return a pointer to the newly created handler. PROC is the
912 function to call with CLIENT_DATA argument whenever the handler is
913 invoked. */
914async_event_handler *
915create_async_event_handler (async_event_handler_func *proc,
916 gdb_client_data client_data)
917{
918 async_event_handler *h;
919
920 h = xmalloc (sizeof (*h));
921 h->ready = 0;
922 h->next_handler = NULL;
923 h->proc = proc;
924 h->client_data = client_data;
925 if (async_event_handler_list.first_handler == NULL)
926 async_event_handler_list.first_handler = h;
927 else
928 async_event_handler_list.last_handler->next_handler = h;
929 async_event_handler_list.last_handler = h;
930 return h;
931}
932
933/* Mark the handler (ASYNC_HANDLER_PTR) as ready. This information
934 will be used by gdb_do_one_event. The caller will be whoever
935 created the event source, and wants to signal that the event is
936 ready to be handled. */
937void
938mark_async_event_handler (async_event_handler *async_handler_ptr)
939{
940 async_handler_ptr->ready = 1;
941}
942
b7d2e916
PA
943/* See event-loop.h. */
944
945void
946clear_async_event_handler (async_event_handler *async_handler_ptr)
947{
948 async_handler_ptr->ready = 0;
949}
950
70b66289
PA
951/* Check if asynchronous event handlers are ready, and call the
952 handler function for one that is. */
50d01748 953
70b66289 954static int
50d01748
PA
955check_async_event_handlers (void)
956{
957 async_event_handler *async_handler_ptr;
50d01748
PA
958
959 for (async_handler_ptr = async_event_handler_list.first_handler;
960 async_handler_ptr != NULL;
961 async_handler_ptr = async_handler_ptr->next_handler)
962 {
963 if (async_handler_ptr->ready)
964 {
965 async_handler_ptr->ready = 0;
70b66289
PA
966 (*async_handler_ptr->proc) (async_handler_ptr->client_data);
967 return 1;
50d01748
PA
968 }
969 }
70b66289
PA
970
971 return 0;
50d01748
PA
972}
973
974/* Delete an asynchronous handler (ASYNC_HANDLER_PTR).
975 Free the space allocated for it. */
976void
977delete_async_event_handler (async_event_handler **async_handler_ptr)
b5a0ac70 978{
50d01748
PA
979 async_event_handler *prev_ptr;
980
981 if (async_event_handler_list.first_handler == *async_handler_ptr)
982 {
3e43a32a
MS
983 async_event_handler_list.first_handler
984 = (*async_handler_ptr)->next_handler;
50d01748
PA
985 if (async_event_handler_list.first_handler == NULL)
986 async_event_handler_list.last_handler = NULL;
987 }
988 else
989 {
990 prev_ptr = async_event_handler_list.first_handler;
991 while (prev_ptr && prev_ptr->next_handler != *async_handler_ptr)
992 prev_ptr = prev_ptr->next_handler;
60bc018f 993 gdb_assert (prev_ptr);
50d01748
PA
994 prev_ptr->next_handler = (*async_handler_ptr)->next_handler;
995 if (async_event_handler_list.last_handler == (*async_handler_ptr))
996 async_event_handler_list.last_handler = prev_ptr;
997 }
998 xfree (*async_handler_ptr);
999 *async_handler_ptr = NULL;
b5a0ac70 1000}
c2c6d25f 1001
371d5dec
MS
1002/* Create a timer that will expire in MILLISECONDS from now. When the
1003 timer is ready, PROC will be executed. At creation, the timer is
c2c6d25f 1004 aded to the timers queue. This queue is kept sorted in order of
371d5dec 1005 increasing timers. Return a handle to the timer struct. */
c2c6d25f 1006int
371d5dec
MS
1007create_timer (int milliseconds, timer_handler_func * proc,
1008 gdb_client_data client_data)
c2c6d25f
JM
1009{
1010 struct gdb_timer *timer_ptr, *timer_index, *prev_timer;
1011 struct timeval time_now, delta;
1012
371d5dec 1013 /* Compute seconds. */
c2c6d25f 1014 delta.tv_sec = milliseconds / 1000;
371d5dec 1015 /* Compute microseconds. */
6426a772
JM
1016 delta.tv_usec = (milliseconds % 1000) * 1000;
1017
c2c6d25f
JM
1018 gettimeofday (&time_now, NULL);
1019
ae462839 1020 timer_ptr = (struct gdb_timer *) xmalloc (sizeof (*timer_ptr));
c2c6d25f
JM
1021 timer_ptr->when.tv_sec = time_now.tv_sec + delta.tv_sec;
1022 timer_ptr->when.tv_usec = time_now.tv_usec + delta.tv_usec;
371d5dec 1023 /* Carry? */
6426a772 1024 if (timer_ptr->when.tv_usec >= 1000000)
c2c6d25f
JM
1025 {
1026 timer_ptr->when.tv_sec += 1;
1027 timer_ptr->when.tv_usec -= 1000000;
1028 }
1029 timer_ptr->proc = proc;
1030 timer_ptr->client_data = client_data;
6426a772 1031 timer_list.num_timers++;
c2c6d25f
JM
1032 timer_ptr->timer_id = timer_list.num_timers;
1033
1034 /* Now add the timer to the timer queue, making sure it is sorted in
371d5dec 1035 increasing order of expiration. */
c2c6d25f 1036
6426a772
JM
1037 for (timer_index = timer_list.first_timer;
1038 timer_index != NULL;
c2c6d25f
JM
1039 timer_index = timer_index->next)
1040 {
1041 /* If the seconds field is greater or if it is the same, but the
371d5dec 1042 microsecond field is greater. */
905e0470
PM
1043 if ((timer_index->when.tv_sec > timer_ptr->when.tv_sec)
1044 || ((timer_index->when.tv_sec == timer_ptr->when.tv_sec)
1045 && (timer_index->when.tv_usec > timer_ptr->when.tv_usec)))
c2c6d25f
JM
1046 break;
1047 }
6426a772 1048
c2c6d25f
JM
1049 if (timer_index == timer_list.first_timer)
1050 {
1051 timer_ptr->next = timer_list.first_timer;
1052 timer_list.first_timer = timer_ptr;
1053
1054 }
1055 else
1056 {
6426a772
JM
1057 for (prev_timer = timer_list.first_timer;
1058 prev_timer->next != timer_index;
c2c6d25f
JM
1059 prev_timer = prev_timer->next)
1060 ;
6426a772 1061
c2c6d25f
JM
1062 prev_timer->next = timer_ptr;
1063 timer_ptr->next = timer_index;
1064 }
1065
1066 gdb_notifier.timeout_valid = 0;
1067 return timer_ptr->timer_id;
1068}
1069
1070/* There is a chance that the creator of the timer wants to get rid of
371d5dec 1071 it before it expires. */
c2c6d25f
JM
1072void
1073delete_timer (int id)
1074{
1075 struct gdb_timer *timer_ptr, *prev_timer = NULL;
1076
371d5dec 1077 /* Find the entry for the given timer. */
c2c6d25f
JM
1078
1079 for (timer_ptr = timer_list.first_timer; timer_ptr != NULL;
1080 timer_ptr = timer_ptr->next)
1081 {
1082 if (timer_ptr->timer_id == id)
1083 break;
1084 }
1085
1086 if (timer_ptr == NULL)
1087 return;
371d5dec 1088 /* Get rid of the timer in the timer list. */
c2c6d25f
JM
1089 if (timer_ptr == timer_list.first_timer)
1090 timer_list.first_timer = timer_ptr->next;
1091 else
1092 {
1093 for (prev_timer = timer_list.first_timer;
1094 prev_timer->next != timer_ptr;
1095 prev_timer = prev_timer->next)
1096 ;
1097 prev_timer->next = timer_ptr->next;
1098 }
b8c9b27d 1099 xfree (timer_ptr);
c2c6d25f
JM
1100
1101 gdb_notifier.timeout_valid = 0;
1102}
1103
70b66289
PA
1104/* Update the timeout for the select() or poll(). Returns true if the
1105 timer has already expired, false otherwise. */
6426a772 1106
70b66289
PA
1107static int
1108update_wait_timeout (void)
c2c6d25f
JM
1109{
1110 struct timeval time_now, delta;
6426a772 1111
2acceee2 1112 if (timer_list.first_timer != NULL)
c2c6d25f
JM
1113 {
1114 gettimeofday (&time_now, NULL);
1115 delta.tv_sec = timer_list.first_timer->when.tv_sec - time_now.tv_sec;
1116 delta.tv_usec = timer_list.first_timer->when.tv_usec - time_now.tv_usec;
371d5dec 1117 /* Borrow? */
c2c6d25f
JM
1118 if (delta.tv_usec < 0)
1119 {
1120 delta.tv_sec -= 1;
1121 delta.tv_usec += 1000000;
1122 }
6426a772 1123
70b66289
PA
1124 /* Cannot simply test if delta.tv_sec is negative because time_t
1125 might be unsigned. */
2f16bb32
EZ
1126 if (timer_list.first_timer->when.tv_sec < time_now.tv_sec
1127 || (timer_list.first_timer->when.tv_sec == time_now.tv_sec
1128 && timer_list.first_timer->when.tv_usec < time_now.tv_usec))
c2c6d25f 1129 {
70b66289 1130 /* It expired already. */
c2c6d25f
JM
1131 delta.tv_sec = 0;
1132 delta.tv_usec = 0;
1133 }
1134
70b66289 1135 /* Update the timeout for select/ poll. */
44f45770
EZ
1136 if (use_poll)
1137 {
c2c6d25f 1138#ifdef HAVE_POLL
44f45770 1139 gdb_notifier.poll_timeout = delta.tv_sec * 1000;
c2c6d25f 1140#else
8e65ff28 1141 internal_error (__FILE__, __LINE__,
e2e0b3e5 1142 _("use_poll without HAVE_POLL"));
44f45770
EZ
1143#endif /* HAVE_POLL */
1144 }
1145 else
1146 {
1147 gdb_notifier.select_timeout.tv_sec = delta.tv_sec;
1148 gdb_notifier.select_timeout.tv_usec = delta.tv_usec;
1149 }
c2c6d25f 1150 gdb_notifier.timeout_valid = 1;
70b66289
PA
1151
1152 if (delta.tv_sec == 0 && delta.tv_usec == 0)
1153 return 1;
c2c6d25f 1154 }
6426a772 1155 else
c2c6d25f 1156 gdb_notifier.timeout_valid = 0;
70b66289
PA
1157
1158 return 0;
1159}
1160
1161/* Check whether a timer in the timers queue is ready. If a timer is
1162 ready, call its handler and return. Update the timeout for the
1163 select() or poll() as well. Return 1 if an event was handled,
1164 otherwise returns 0.*/
1165
1166static int
1167poll_timers (void)
1168{
1169 if (update_wait_timeout ())
1170 {
1171 struct gdb_timer *timer_ptr = timer_list.first_timer;
1172 timer_handler_func *proc = timer_ptr->proc;
1173 gdb_client_data client_data = timer_ptr->client_data;
1174
1175 /* Get rid of the timer from the beginning of the list. */
1176 timer_list.first_timer = timer_ptr->next;
1177
1178 /* Delete the timer before calling the callback, not after, in
1179 case the callback itself decides to try deleting the timer
1180 too. */
1181 xfree (timer_ptr);
1182
1183 /* Call the procedure associated with that timer. */
1184 (proc) (client_data);
1185
1186 return 1;
1187 }
1188
1189 return 0;
c2c6d25f 1190}
This page took 1.218052 seconds and 4 git commands to generate.