diff options
Diffstat (limited to 'gdbsupport/event-loop.cc')
-rw-r--r-- | gdbsupport/event-loop.cc | 491 |
1 files changed, 238 insertions, 253 deletions
diff --git a/gdbsupport/event-loop.cc b/gdbsupport/event-loop.cc index 52e7fd2..f9260f7 100644 --- a/gdbsupport/event-loop.cc +++ b/gdbsupport/event-loop.cc @@ -23,9 +23,9 @@ #include <chrono> #ifdef HAVE_POLL -#if defined (HAVE_POLL_H) +#if defined(HAVE_POLL_H) #include <poll.h> -#elif defined (HAVE_SYS_POLL_H) +#elif defined(HAVE_SYS_POLL_H) #include <sys/poll.h> #endif #endif @@ -43,9 +43,9 @@ debug_event_loop_kind debug_event_loop; /* Tell create_file_handler what events we are interested in. This is used by the select version of the event loop. */ -#define GDB_READABLE (1<<1) -#define GDB_WRITABLE (1<<2) -#define GDB_EXCEPTION (1<<3) +#define GDB_READABLE (1 << 1) +#define GDB_WRITABLE (1 << 2) +#define GDB_EXCEPTION (1 << 3) /* Information about each file descriptor we register with the event loop. */ @@ -101,81 +101,79 @@ static bool use_poll = true; in, for each fd. */ static struct - { - /* Ptr to head of file handler list. */ - file_handler *first_file_handler; +{ + /* Ptr to head of file handler list. */ + file_handler *first_file_handler; - /* Next file handler to handle, for the select variant. To level + /* Next file handler to handle, for the select variant. To level the fairness across event sources, we serve file handlers in a round-robin-like fashion. The number and order of the polled file handlers may change between invocations, but this is good enough. */ - file_handler *next_file_handler; + file_handler *next_file_handler; #ifdef HAVE_POLL - /* Ptr to array of pollfd structures. */ - struct pollfd *poll_fds; + /* Ptr to array of pollfd structures. */ + struct pollfd *poll_fds; - /* Next file descriptor to handle, for the poll variant. To level + /* Next file descriptor to handle, for the poll variant. To level the fairness across event sources, we poll the file descriptors in a round-robin-like fashion. The number and order of the polled file descriptors may change between invocations, but this is good enough. */ - int next_poll_fds_index; + int next_poll_fds_index; - /* Timeout in milliseconds for calls to poll(). */ - int poll_timeout; + /* Timeout in milliseconds for calls to poll(). */ + int poll_timeout; #endif - /* Masks to be used in the next call to select. + /* Masks to be used in the next call to select. Bits are set in response to calls to create_file_handler. */ - fd_set check_masks[3]; + fd_set check_masks[3]; - /* What file descriptors were found ready by select. */ - fd_set ready_masks[3]; + /* What file descriptors were found ready by select. */ + fd_set ready_masks[3]; - /* Number of file descriptors to monitor (for poll). */ - /* Number of valid bits (highest fd value + 1) (for select). */ - int num_fds; + /* Number of file descriptors to monitor (for poll). */ + /* Number of valid bits (highest fd value + 1) (for select). */ + int num_fds; - /* Time structure for calls to select(). */ - struct timeval select_timeout; + /* Time structure for calls to select(). */ + struct timeval select_timeout; - /* Flag to tell whether the timeout should be used. */ - int timeout_valid; - } -gdb_notifier; + /* Flag to tell whether the timeout should be used. */ + int timeout_valid; +} gdb_notifier; /* Structure associated with a timer. PROC will be executed at the first occasion after WHEN. */ struct gdb_timer - { - std::chrono::steady_clock::time_point when; - int timer_id; - struct gdb_timer *next; - timer_handler_func *proc; /* Function to call to do the work. */ - gdb_client_data client_data; /* Argument to async_handler_func. */ - }; +{ + std::chrono::steady_clock::time_point when; + int timer_id; + struct gdb_timer *next; + timer_handler_func *proc; /* Function to call to do the work. */ + gdb_client_data client_data; /* Argument to async_handler_func. */ +}; /* List of currently active timers. It is sorted in order of increasing timers. */ static struct - { - /* Pointer to first in timer list. */ - struct gdb_timer *first_timer; +{ + /* Pointer to first in timer list. */ + struct gdb_timer *first_timer; - /* Id of the last timer created. */ - int num_timers; - } -timer_list; + /* Id of the last timer created. */ + int num_timers; +} timer_list; static void create_file_handler (int fd, int mask, handler_func *proc, - gdb_client_data client_data, - std::string &&name, bool is_ui); + gdb_client_data client_data, + std::string &&name, bool is_ui); static int gdb_wait_for_event (int); static int update_wait_timeout (void); static int poll_timers (void); - + /* Process one high level event. If nothing is ready at this time, wait at most MSTIMEOUT milliseconds for something to happen (via gdb_wait_for_event), then process it. Returns >0 if something was @@ -206,35 +204,35 @@ gdb_do_one_event (int mstimeout) int res; switch (event_source_head) - { - case 0: - /* Are any timers that are ready? */ - res = poll_timers (); - break; - case 1: - /* Are there events already waiting to be collected on the + { + case 0: + /* Are any timers that are ready? */ + res = poll_timers (); + break; + case 1: + /* Are there events already waiting to be collected on the monitored file descriptors? */ - res = gdb_wait_for_event (0); - break; - case 2: - /* Are there any asynchronous event handlers ready? */ - res = check_async_event_handlers (); - break; - default: - internal_error ("unexpected event_source_head %d", - event_source_head); - } + res = gdb_wait_for_event (0); + break; + case 2: + /* Are there any asynchronous event handlers ready? */ + res = check_async_event_handlers (); + break; + default: + internal_error ("unexpected event_source_head %d", + event_source_head); + } event_source_head++; if (event_source_head == number_of_sources) - event_source_head = 0; + event_source_head = 0; if (res > 0) - return 1; + return 1; } if (mstimeout == 0) - return 0; /* 0ms timeout: do not wait for an event. */ + return 0; /* 0ms timeout: do not wait for an event. */ /* Block waiting for a new event. If gdb_wait_for_event returns -1, we should get out because this means that there are no event @@ -248,19 +246,17 @@ gdb_do_one_event (int mstimeout) gdb::optional<int> timer_id; - SCOPE_EXIT - { - if (timer_id.has_value ()) - delete_timer (*timer_id); - }; + SCOPE_EXIT + { + if (timer_id.has_value ()) + delete_timer (*timer_id); + }; if (mstimeout > 0) - timer_id = create_timer (mstimeout, - [] (gdb_client_data arg) - { - ((gdb::optional<int> *) arg)->reset (); - }, - &timer_id); + timer_id = create_timer ( + mstimeout, + [] (gdb_client_data arg) { ((gdb::optional<int> *) arg)->reset (); }, + &timer_id); return gdb_wait_for_event (1); } @@ -268,7 +264,7 @@ gdb_do_one_event (int mstimeout) void add_file_handler (int fd, handler_func *proc, gdb_client_data client_data, - std::string &&name, bool is_ui) + std::string &&name, bool is_ui) { #ifdef HAVE_POLL if (use_poll) @@ -283,17 +279,17 @@ add_file_handler (int fd, handler_func *proc, gdb_client_data client_data, fds.fd = fd; fds.events = POLLIN; if (poll (&fds, 1, 0) == 1 && (fds.revents & POLLNVAL)) - use_poll = false; + use_poll = false; } if (use_poll) { create_file_handler (fd, POLLIN, proc, client_data, std::move (name), - is_ui); + is_ui); } else #endif /* HAVE_POLL */ - create_file_handler (fd, GDB_READABLE | GDB_EXCEPTION, - proc, client_data, std::move (name), is_ui); + create_file_handler (fd, GDB_READABLE | GDB_EXCEPTION, proc, client_data, + std::move (name), is_ui); } /* Helper for add_file_handler. @@ -308,9 +304,9 @@ add_file_handler (int fd, handler_func *proc, gdb_client_data client_data, occurs for FD. CLIENT_DATA is the argument to pass to PROC. */ static void -create_file_handler (int fd, int mask, handler_func * proc, - gdb_client_data client_data, std::string &&name, - bool is_ui) +create_file_handler (int fd, int mask, handler_func *proc, + gdb_client_data client_data, std::string &&name, + bool is_ui) { file_handler *file_ptr; @@ -320,7 +316,7 @@ create_file_handler (int fd, int mask, handler_func * proc, file_ptr = file_ptr->next_file) { if (file_ptr->fd == fd) - break; + break; } /* It is a new file descriptor. Add it to the list. Otherwise, just @@ -335,41 +331,40 @@ create_file_handler (int fd, int mask, handler_func * proc, #ifdef HAVE_POLL if (use_poll) - { - gdb_notifier.num_fds++; - if (gdb_notifier.poll_fds) - gdb_notifier.poll_fds = - (struct pollfd *) xrealloc (gdb_notifier.poll_fds, - (gdb_notifier.num_fds - * sizeof (struct pollfd))); - else - gdb_notifier.poll_fds = - XNEW (struct pollfd); - (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->fd = fd; - (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->events = mask; - (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->revents = 0; - } + { + gdb_notifier.num_fds++; + if (gdb_notifier.poll_fds) + gdb_notifier.poll_fds + = (struct pollfd *) xrealloc (gdb_notifier.poll_fds, + (gdb_notifier.num_fds + * sizeof (struct pollfd))); + else + gdb_notifier.poll_fds = XNEW (struct pollfd); + (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->fd = fd; + (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->events = mask; + (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->revents = 0; + } else #endif /* HAVE_POLL */ - { - if (mask & GDB_READABLE) - FD_SET (fd, &gdb_notifier.check_masks[0]); - else - FD_CLR (fd, &gdb_notifier.check_masks[0]); - - if (mask & GDB_WRITABLE) - FD_SET (fd, &gdb_notifier.check_masks[1]); - else - FD_CLR (fd, &gdb_notifier.check_masks[1]); - - if (mask & GDB_EXCEPTION) - FD_SET (fd, &gdb_notifier.check_masks[2]); - else - FD_CLR (fd, &gdb_notifier.check_masks[2]); - - if (gdb_notifier.num_fds <= fd) - gdb_notifier.num_fds = fd + 1; - } + { + if (mask & GDB_READABLE) + FD_SET (fd, &gdb_notifier.check_masks[0]); + else + FD_CLR (fd, &gdb_notifier.check_masks[0]); + + if (mask & GDB_WRITABLE) + FD_SET (fd, &gdb_notifier.check_masks[1]); + else + FD_CLR (fd, &gdb_notifier.check_masks[1]); + + if (mask & GDB_EXCEPTION) + FD_SET (fd, &gdb_notifier.check_masks[2]); + else + FD_CLR (fd, &gdb_notifier.check_masks[2]); + + if (gdb_notifier.num_fds <= fd) + gdb_notifier.num_fds = fd + 1; + } } file_ptr->proc = proc; @@ -418,7 +413,7 @@ delete_file_handler (int fd) file_ptr = file_ptr->next_file) { if (file_ptr->fd == fd) - break; + break; } if (file_ptr == NULL) @@ -433,20 +428,20 @@ delete_file_handler (int fd) /* Create a new poll_fds array by copying every fd's information but the one we want to get rid of. */ - new_poll_fds = (struct pollfd *) - xmalloc ((gdb_notifier.num_fds - 1) * sizeof (struct pollfd)); + new_poll_fds = (struct pollfd *) xmalloc ((gdb_notifier.num_fds - 1) + * sizeof (struct pollfd)); for (i = 0, j = 0; i < gdb_notifier.num_fds; i++) - { - if ((gdb_notifier.poll_fds + i)->fd != fd) - { - (new_poll_fds + j)->fd = (gdb_notifier.poll_fds + i)->fd; - (new_poll_fds + j)->events = (gdb_notifier.poll_fds + i)->events; - (new_poll_fds + j)->revents - = (gdb_notifier.poll_fds + i)->revents; - j++; - } - } + { + if ((gdb_notifier.poll_fds + i)->fd != fd) + { + (new_poll_fds + j)->fd = (gdb_notifier.poll_fds + i)->fd; + (new_poll_fds + j)->events = (gdb_notifier.poll_fds + i)->events; + (new_poll_fds + j)->revents + = (gdb_notifier.poll_fds + i)->revents; + j++; + } + } xfree (gdb_notifier.poll_fds); gdb_notifier.poll_fds = new_poll_fds; gdb_notifier.num_fds--; @@ -455,26 +450,26 @@ delete_file_handler (int fd) #endif /* HAVE_POLL */ { if (file_ptr->mask & GDB_READABLE) - FD_CLR (fd, &gdb_notifier.check_masks[0]); + FD_CLR (fd, &gdb_notifier.check_masks[0]); if (file_ptr->mask & GDB_WRITABLE) - FD_CLR (fd, &gdb_notifier.check_masks[1]); + FD_CLR (fd, &gdb_notifier.check_masks[1]); if (file_ptr->mask & GDB_EXCEPTION) - FD_CLR (fd, &gdb_notifier.check_masks[2]); + FD_CLR (fd, &gdb_notifier.check_masks[2]); /* Find current max fd. */ if ((fd + 1) == gdb_notifier.num_fds) - { - gdb_notifier.num_fds--; - for (i = gdb_notifier.num_fds; i; i--) - { - if (FD_ISSET (i - 1, &gdb_notifier.check_masks[0]) - || FD_ISSET (i - 1, &gdb_notifier.check_masks[1]) - || FD_ISSET (i - 1, &gdb_notifier.check_masks[2])) - break; - } - gdb_notifier.num_fds = i; - } + { + gdb_notifier.num_fds--; + for (i = gdb_notifier.num_fds; i; i--) + { + if (FD_ISSET (i - 1, &gdb_notifier.check_masks[0]) + || FD_ISSET (i - 1, &gdb_notifier.check_masks[1]) + || FD_ISSET (i - 1, &gdb_notifier.check_masks[2])) + break; + } + gdb_notifier.num_fds = i; + } } /* Deactivate the file descriptor, by clearing its mask, @@ -487,10 +482,10 @@ delete_file_handler (int fd) if (gdb_notifier.next_file_handler == file_ptr) { if (file_ptr->next_file == NULL - && file_ptr == gdb_notifier.first_file_handler) - gdb_notifier.next_file_handler = NULL; + && file_ptr == gdb_notifier.first_file_handler) + gdb_notifier.next_file_handler = NULL; else - get_next_file_handler_to_handle_and_advance (); + get_next_file_handler_to_handle_and_advance (); } /* Get rid of the file handler in the file handler list. */ @@ -499,9 +494,8 @@ delete_file_handler (int fd) else { for (prev_ptr = gdb_notifier.first_file_handler; - prev_ptr->next_file != file_ptr; - prev_ptr = prev_ptr->next_file) - ; + prev_ptr->next_file != file_ptr; prev_ptr = prev_ptr->next_file) + ; prev_ptr->next_file = file_ptr->next_file; } @@ -537,30 +531,28 @@ handle_file_event (file_handler *file_ptr, int ready_mask) mask = ready_mask & (file_ptr->mask | error_mask); if ((mask & (POLLERR | POLLNVAL)) != 0) - { - /* Work in progress. We may need to tell somebody + { + /* Work in progress. We may need to tell somebody what kind of error we had. */ - if (mask & POLLERR) - warning (_("Error detected on fd %d"), file_ptr->fd); - if (mask & POLLNVAL) - warning (_("Invalid or non-`poll'able fd %d"), - file_ptr->fd); - file_ptr->error = 1; - } + if (mask & POLLERR) + warning (_ ("Error detected on fd %d"), file_ptr->fd); + if (mask & POLLNVAL) + warning (_ ("Invalid or non-`poll'able fd %d"), file_ptr->fd); + file_ptr->error = 1; + } else - file_ptr->error = 0; + file_ptr->error = 0; } else #endif /* HAVE_POLL */ { if (ready_mask & GDB_EXCEPTION) - { - warning (_("Exception condition detected on fd %d"), - file_ptr->fd); - file_ptr->error = 1; - } + { + warning (_ ("Exception condition detected on fd %d"), file_ptr->fd); + file_ptr->error = 1; + } else - file_ptr->error = 0; + file_ptr->error = 0; mask = ready_mask & file_ptr->mask; } @@ -568,8 +560,8 @@ handle_file_event (file_handler *file_ptr, int ready_mask) if (mask != 0) { event_loop_ui_debug_printf (file_ptr->is_ui, - "invoking fd file handler `%s`", - file_ptr->name.c_str ()); + "invoking fd file handler `%s`", + file_ptr->name.c_str ()); file_ptr->proc (file_ptr->error, file_ptr->client_data); } } @@ -602,17 +594,17 @@ gdb_wait_for_event (int block) int timeout; if (block) - timeout = gdb_notifier.timeout_valid ? gdb_notifier.poll_timeout : -1; + timeout = gdb_notifier.timeout_valid ? gdb_notifier.poll_timeout : -1; else - timeout = 0; + timeout = 0; num_found = poll (gdb_notifier.poll_fds, - (unsigned long) gdb_notifier.num_fds, timeout); + (unsigned long) gdb_notifier.num_fds, timeout); /* Don't print anything if we get out of poll because of a signal. */ if (num_found == -1 && errno != EINTR) - perror_with_name (("poll")); + perror_with_name (("poll")); } else #endif /* HAVE_POLL */ @@ -621,47 +613,46 @@ gdb_wait_for_event (int block) struct timeval *timeout_p; if (block) - timeout_p = gdb_notifier.timeout_valid - ? &gdb_notifier.select_timeout : NULL; + timeout_p + = gdb_notifier.timeout_valid ? &gdb_notifier.select_timeout : NULL; else - { - memset (&select_timeout, 0, sizeof (select_timeout)); - timeout_p = &select_timeout; - } + { + memset (&select_timeout, 0, sizeof (select_timeout)); + timeout_p = &select_timeout; + } gdb_notifier.ready_masks[0] = gdb_notifier.check_masks[0]; gdb_notifier.ready_masks[1] = gdb_notifier.check_masks[1]; gdb_notifier.ready_masks[2] = gdb_notifier.check_masks[2]; - num_found = gdb_select (gdb_notifier.num_fds, - &gdb_notifier.ready_masks[0], - &gdb_notifier.ready_masks[1], - &gdb_notifier.ready_masks[2], - timeout_p); + num_found + = gdb_select (gdb_notifier.num_fds, &gdb_notifier.ready_masks[0], + &gdb_notifier.ready_masks[1], + &gdb_notifier.ready_masks[2], timeout_p); /* Clear the masks after an error from select. */ if (num_found == -1) - { - FD_ZERO (&gdb_notifier.ready_masks[0]); - FD_ZERO (&gdb_notifier.ready_masks[1]); - FD_ZERO (&gdb_notifier.ready_masks[2]); + { + FD_ZERO (&gdb_notifier.ready_masks[0]); + FD_ZERO (&gdb_notifier.ready_masks[1]); + FD_ZERO (&gdb_notifier.ready_masks[2]); - /* Dont print anything if we got a signal, let gdb handle + /* Dont print anything if we got a signal, let gdb handle it. */ - if (errno != EINTR) - perror_with_name (("select")); - } + if (errno != EINTR) + perror_with_name (("select")); + } } /* Avoid looking at poll_fds[i]->revents if no event fired. */ if (num_found <= 0) return 0; - /* Run event handlers. We always run just one handler and go back + /* Run event handlers. We always run just one handler and go back to polling, in case a handler changes the notifier list. Since events for sources we haven't consumed yet wake poll/select immediately, no event is lost. */ - /* To level the fairness across event descriptors, we handle them in + /* To level the fairness across event descriptors, we handle them in a round-robin-like fashion. The number and order of descriptors may change between invocations, but this is good enough. */ #ifdef HAVE_POLL @@ -671,23 +662,22 @@ gdb_wait_for_event (int block) int mask; while (1) - { - if (gdb_notifier.next_poll_fds_index >= gdb_notifier.num_fds) - gdb_notifier.next_poll_fds_index = 0; - i = gdb_notifier.next_poll_fds_index++; - - gdb_assert (i < gdb_notifier.num_fds); - if ((gdb_notifier.poll_fds + i)->revents) - break; - } - - for (file_ptr = gdb_notifier.first_file_handler; - file_ptr != NULL; - file_ptr = file_ptr->next_file) - { - if (file_ptr->fd == (gdb_notifier.poll_fds + i)->fd) - break; - } + { + if (gdb_notifier.next_poll_fds_index >= gdb_notifier.num_fds) + gdb_notifier.next_poll_fds_index = 0; + i = gdb_notifier.next_poll_fds_index++; + + gdb_assert (i < gdb_notifier.num_fds); + if ((gdb_notifier.poll_fds + i)->revents) + break; + } + + for (file_ptr = gdb_notifier.first_file_handler; file_ptr != NULL; + file_ptr = file_ptr->next_file) + { + if (file_ptr->fd == (gdb_notifier.poll_fds + i)->fd) + break; + } gdb_assert (file_ptr != NULL); mask = (gdb_notifier.poll_fds + i)->revents; @@ -701,16 +691,16 @@ gdb_wait_for_event (int block) int mask = 0; do - { - file_ptr = get_next_file_handler_to_handle_and_advance (); - - if (FD_ISSET (file_ptr->fd, &gdb_notifier.ready_masks[0])) - mask |= GDB_READABLE; - if (FD_ISSET (file_ptr->fd, &gdb_notifier.ready_masks[1])) - mask |= GDB_WRITABLE; - if (FD_ISSET (file_ptr->fd, &gdb_notifier.ready_masks[2])) - mask |= GDB_EXCEPTION; - } + { + file_ptr = get_next_file_handler_to_handle_and_advance (); + + if (FD_ISSET (file_ptr->fd, &gdb_notifier.ready_masks[0])) + mask |= GDB_READABLE; + if (FD_ISSET (file_ptr->fd, &gdb_notifier.ready_masks[1])) + mask |= GDB_WRITABLE; + if (FD_ISSET (file_ptr->fd, &gdb_notifier.ready_masks[2])) + mask |= GDB_EXCEPTION; + } while (mask == 0); handle_file_event (file_ptr, mask); @@ -718,15 +708,14 @@ gdb_wait_for_event (int block) } return 0; } - + /* Create a timer that will expire in MS milliseconds from now. When the timer is ready, PROC will be executed. At creation, the timer is added to the timers queue. This queue is kept sorted in order of increasing timers. Return a handle to the timer struct. */ int -create_timer (int ms, timer_handler_func *proc, - gdb_client_data client_data) +create_timer (int ms, timer_handler_func *proc, gdb_client_data client_data) { using namespace std::chrono; struct gdb_timer *timer_ptr, *timer_index, *prev_timer; @@ -743,26 +732,23 @@ create_timer (int ms, timer_handler_func *proc, /* Now add the timer to the timer queue, making sure it is sorted in increasing order of expiration. */ - for (timer_index = timer_list.first_timer; - timer_index != NULL; + for (timer_index = timer_list.first_timer; timer_index != NULL; timer_index = timer_index->next) { if (timer_index->when > timer_ptr->when) - break; + break; } if (timer_index == timer_list.first_timer) { timer_ptr->next = timer_list.first_timer; timer_list.first_timer = timer_ptr; - } else { for (prev_timer = timer_list.first_timer; - prev_timer->next != timer_index; - prev_timer = prev_timer->next) - ; + prev_timer->next != timer_index; prev_timer = prev_timer->next) + ; prev_timer->next = timer_ptr; timer_ptr->next = timer_index; @@ -785,7 +771,7 @@ delete_timer (int id) timer_ptr = timer_ptr->next) { if (timer_ptr->timer_id == id) - break; + break; } if (timer_ptr == NULL) @@ -795,10 +781,9 @@ delete_timer (int id) timer_list.first_timer = timer_ptr->next; else { - for (prev_timer = timer_list.first_timer; - prev_timer->next != timer_ptr; - prev_timer = prev_timer->next) - ; + for (prev_timer = timer_list.first_timer; prev_timer->next != timer_ptr; + prev_timer = prev_timer->next) + ; prev_timer->next = timer_ptr->next; } delete timer_ptr; @@ -835,31 +820,31 @@ update_wait_timeout (void) struct timeval timeout; if (timer_list.first_timer->when < time_now) - { - /* It expired already. */ - timeout.tv_sec = 0; - timeout.tv_usec = 0; - } + { + /* It expired already. */ + timeout.tv_sec = 0; + timeout.tv_usec = 0; + } else - { - steady_clock::duration d = timer_list.first_timer->when - time_now; - timeout = duration_cast_timeval (d); - } + { + steady_clock::duration d = timer_list.first_timer->when - time_now; + timeout = duration_cast_timeval (d); + } - /* Update the timeout for select/ poll. */ + /* Update the timeout for select/ poll. */ #ifdef HAVE_POLL if (use_poll) - gdb_notifier.poll_timeout = timeout.tv_sec * 1000; + gdb_notifier.poll_timeout = timeout.tv_sec * 1000; else #endif /* HAVE_POLL */ - { - gdb_notifier.select_timeout.tv_sec = timeout.tv_sec; - gdb_notifier.select_timeout.tv_usec = timeout.tv_usec; - } + { + gdb_notifier.select_timeout.tv_sec = timeout.tv_sec; + gdb_notifier.select_timeout.tv_usec = timeout.tv_usec; + } gdb_notifier.timeout_valid = 1; if (timer_list.first_timer->when < time_now) - return 1; + return 1; } else gdb_notifier.timeout_valid = 0; |