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