Home | History | Annotate | Line # | Download | only in gdbsupport
event-loop.cc revision 1.1.1.3
      1      1.1  christos /* Event loop machinery for GDB, the GNU debugger.
      2  1.1.1.3  christos    Copyright (C) 1999-2024 Free Software Foundation, Inc.
      3      1.1  christos    Written by Elena Zannoni <ezannoni (at) cygnus.com> of Cygnus Solutions.
      4      1.1  christos 
      5      1.1  christos    This file is part of GDB.
      6      1.1  christos 
      7      1.1  christos    This program is free software; you can redistribute it and/or modify
      8      1.1  christos    it under the terms of the GNU General Public License as published by
      9      1.1  christos    the Free Software Foundation; either version 3 of the License, or
     10      1.1  christos    (at your option) any later version.
     11      1.1  christos 
     12      1.1  christos    This program is distributed in the hope that it will be useful,
     13      1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14      1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15      1.1  christos    GNU General Public License for more details.
     16      1.1  christos 
     17      1.1  christos    You should have received a copy of the GNU General Public License
     18      1.1  christos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     19      1.1  christos 
     20      1.1  christos #include "gdbsupport/event-loop.h"
     21      1.1  christos 
     22      1.1  christos #include <chrono>
     23      1.1  christos 
     24      1.1  christos #ifdef HAVE_POLL
     25      1.1  christos #if defined (HAVE_POLL_H)
     26      1.1  christos #include <poll.h>
     27      1.1  christos #elif defined (HAVE_SYS_POLL_H)
     28      1.1  christos #include <sys/poll.h>
     29      1.1  christos #endif
     30      1.1  christos #endif
     31      1.1  christos 
     32      1.1  christos #include <sys/types.h>
     33      1.1  christos #include "gdbsupport/gdb_sys_time.h"
     34      1.1  christos #include "gdbsupport/gdb_select.h"
     35  1.1.1.3  christos #include <optional>
     36  1.1.1.2  christos #include "gdbsupport/scope-exit.h"
     37  1.1.1.2  christos 
     38  1.1.1.2  christos /* See event-loop.h.  */
     39  1.1.1.2  christos 
     40  1.1.1.2  christos debug_event_loop_kind debug_event_loop;
     41      1.1  christos 
     42      1.1  christos /* Tell create_file_handler what events we are interested in.
     43      1.1  christos    This is used by the select version of the event loop.  */
     44      1.1  christos 
     45      1.1  christos #define GDB_READABLE	(1<<1)
     46      1.1  christos #define GDB_WRITABLE	(1<<2)
     47      1.1  christos #define GDB_EXCEPTION	(1<<3)
     48      1.1  christos 
     49      1.1  christos /* Information about each file descriptor we register with the event
     50      1.1  christos    loop.  */
     51      1.1  christos 
     52  1.1.1.2  christos struct file_handler
     53  1.1.1.2  christos {
     54  1.1.1.2  christos   /* File descriptor.  */
     55  1.1.1.2  christos   int fd;
     56      1.1  christos 
     57  1.1.1.2  christos   /* Events we want to monitor: POLLIN, etc.  */
     58  1.1.1.2  christos   int mask;
     59  1.1.1.2  christos 
     60  1.1.1.2  christos   /* Events that have been seen since the last time.  */
     61  1.1.1.2  christos   int ready_mask;
     62  1.1.1.2  christos 
     63  1.1.1.2  christos   /* Procedure to call when fd is ready.  */
     64  1.1.1.2  christos   handler_func *proc;
     65  1.1.1.2  christos 
     66  1.1.1.2  christos   /* Argument to pass to proc.  */
     67  1.1.1.2  christos   gdb_client_data client_data;
     68      1.1  christos 
     69  1.1.1.2  christos   /* User-friendly name of this handler.  */
     70  1.1.1.2  christos   std::string name;
     71  1.1.1.2  christos 
     72  1.1.1.2  christos   /* If set, this file descriptor is used for a user interface.  */
     73  1.1.1.2  christos   bool is_ui;
     74  1.1.1.2  christos 
     75  1.1.1.2  christos   /* Was an error detected on this fd?  */
     76  1.1.1.2  christos   int error;
     77  1.1.1.2  christos 
     78  1.1.1.2  christos   /* Next registered file descriptor.  */
     79  1.1.1.2  christos   struct file_handler *next_file;
     80  1.1.1.2  christos };
     81  1.1.1.2  christos 
     82  1.1.1.2  christos #ifdef HAVE_POLL
     83  1.1.1.2  christos /* Do we use poll or select?  Some systems have poll, but then it's
     84  1.1.1.2  christos    not useable with all kinds of files.  We probe that whenever a new
     85  1.1.1.2  christos    file handler is added.  */
     86  1.1.1.2  christos static bool use_poll = true;
     87  1.1.1.2  christos #endif
     88      1.1  christos 
     89      1.1  christos #ifdef USE_WIN32API
     90      1.1  christos #include <windows.h>
     91      1.1  christos #include <io.h>
     92      1.1  christos #endif
     93      1.1  christos 
     94      1.1  christos /* Gdb_notifier is just a list of file descriptors gdb is interested in.
     95      1.1  christos    These are the input file descriptor, and the target file
     96      1.1  christos    descriptor.  We have two flavors of the notifier, one for platforms
     97      1.1  christos    that have the POLL function, the other for those that don't, and
     98      1.1  christos    only support SELECT.  Each of the elements in the gdb_notifier list is
     99      1.1  christos    basically a description of what kind of events gdb is interested
    100      1.1  christos    in, for each fd.  */
    101      1.1  christos 
    102      1.1  christos static struct
    103      1.1  christos   {
    104      1.1  christos     /* Ptr to head of file handler list.  */
    105      1.1  christos     file_handler *first_file_handler;
    106      1.1  christos 
    107      1.1  christos     /* Next file handler to handle, for the select variant.  To level
    108      1.1  christos        the fairness across event sources, we serve file handlers in a
    109      1.1  christos        round-robin-like fashion.  The number and order of the polled
    110      1.1  christos        file handlers may change between invocations, but this is good
    111      1.1  christos        enough.  */
    112      1.1  christos     file_handler *next_file_handler;
    113      1.1  christos 
    114      1.1  christos #ifdef HAVE_POLL
    115  1.1.1.3  christos     /* Descriptors to poll.  */
    116  1.1.1.3  christos     std::vector<struct pollfd> poll_fds;
    117      1.1  christos 
    118      1.1  christos     /* Next file descriptor to handle, for the poll variant.  To level
    119      1.1  christos        the fairness across event sources, we poll the file descriptors
    120      1.1  christos        in a round-robin-like fashion.  The number and order of the
    121      1.1  christos        polled file descriptors may change between invocations, but
    122      1.1  christos        this is good enough.  */
    123      1.1  christos     int next_poll_fds_index;
    124      1.1  christos 
    125      1.1  christos     /* Timeout in milliseconds for calls to poll().  */
    126      1.1  christos     int poll_timeout;
    127      1.1  christos #endif
    128      1.1  christos 
    129      1.1  christos     /* Masks to be used in the next call to select.
    130      1.1  christos        Bits are set in response to calls to create_file_handler.  */
    131      1.1  christos     fd_set check_masks[3];
    132      1.1  christos 
    133      1.1  christos     /* What file descriptors were found ready by select.  */
    134      1.1  christos     fd_set ready_masks[3];
    135      1.1  christos 
    136      1.1  christos     /* Number of file descriptors to monitor (for poll).  */
    137      1.1  christos     /* Number of valid bits (highest fd value + 1) (for select).  */
    138      1.1  christos     int num_fds;
    139      1.1  christos 
    140      1.1  christos     /* Time structure for calls to select().  */
    141      1.1  christos     struct timeval select_timeout;
    142      1.1  christos 
    143      1.1  christos     /* Flag to tell whether the timeout should be used.  */
    144      1.1  christos     int timeout_valid;
    145      1.1  christos   }
    146      1.1  christos gdb_notifier;
    147      1.1  christos 
    148      1.1  christos /* Structure associated with a timer.  PROC will be executed at the
    149      1.1  christos    first occasion after WHEN.  */
    150      1.1  christos struct gdb_timer
    151      1.1  christos   {
    152      1.1  christos     std::chrono::steady_clock::time_point when;
    153      1.1  christos     int timer_id;
    154      1.1  christos     struct gdb_timer *next;
    155      1.1  christos     timer_handler_func *proc;	    /* Function to call to do the work.  */
    156      1.1  christos     gdb_client_data client_data;    /* Argument to async_handler_func.  */
    157      1.1  christos   };
    158      1.1  christos 
    159      1.1  christos /* List of currently active timers.  It is sorted in order of
    160      1.1  christos    increasing timers.  */
    161      1.1  christos static struct
    162      1.1  christos   {
    163      1.1  christos     /* Pointer to first in timer list.  */
    164      1.1  christos     struct gdb_timer *first_timer;
    165      1.1  christos 
    166      1.1  christos     /* Id of the last timer created.  */
    167      1.1  christos     int num_timers;
    168      1.1  christos   }
    169      1.1  christos timer_list;
    170      1.1  christos 
    171      1.1  christos static void create_file_handler (int fd, int mask, handler_func *proc,
    172  1.1.1.2  christos 				 gdb_client_data client_data,
    173  1.1.1.2  christos 				 std::string &&name, bool is_ui);
    174      1.1  christos static int gdb_wait_for_event (int);
    175      1.1  christos static int update_wait_timeout (void);
    176      1.1  christos static int poll_timers (void);
    177      1.1  christos 
    178      1.1  christos /* Process one high level event.  If nothing is ready at this time,
    180  1.1.1.2  christos    wait at most MSTIMEOUT milliseconds for something to happen (via
    181  1.1.1.2  christos    gdb_wait_for_event), then process it.  Returns >0 if something was
    182  1.1.1.2  christos    done, <0 if there are no event sources to wait for, =0 if timeout occurred.
    183  1.1.1.2  christos    A timeout of 0 allows to serve an already pending event, but does not
    184  1.1.1.2  christos    wait if none found.
    185  1.1.1.2  christos    Setting the timeout to a negative value disables it.
    186  1.1.1.2  christos    The timeout is never used by gdb itself, it is however needed to
    187      1.1  christos    integrate gdb event handling within Insight's GUI event loop. */
    188      1.1  christos 
    189  1.1.1.2  christos int
    190      1.1  christos gdb_do_one_event (int mstimeout)
    191      1.1  christos {
    192      1.1  christos   static int event_source_head = 0;
    193      1.1  christos   const int number_of_sources = 3;
    194      1.1  christos   int current = 0;
    195      1.1  christos 
    196      1.1  christos   /* First let's see if there are any asynchronous signal handlers
    197      1.1  christos      that are ready.  These would be the result of invoking any of the
    198      1.1  christos      signal handlers.  */
    199      1.1  christos   if (invoke_async_signal_handlers ())
    200      1.1  christos     return 1;
    201      1.1  christos 
    202      1.1  christos   /* To level the fairness across event sources, we poll them in a
    203      1.1  christos      round-robin fashion.  */
    204      1.1  christos   for (current = 0; current < number_of_sources; current++)
    205      1.1  christos     {
    206      1.1  christos       int res;
    207      1.1  christos 
    208      1.1  christos       switch (event_source_head)
    209      1.1  christos 	{
    210      1.1  christos 	case 0:
    211      1.1  christos 	  /* Are any timers that are ready?  */
    212      1.1  christos 	  res = poll_timers ();
    213      1.1  christos 	  break;
    214      1.1  christos 	case 1:
    215      1.1  christos 	  /* Are there events already waiting to be collected on the
    216      1.1  christos 	     monitored file descriptors?  */
    217      1.1  christos 	  res = gdb_wait_for_event (0);
    218      1.1  christos 	  break;
    219      1.1  christos 	case 2:
    220      1.1  christos 	  /* Are there any asynchronous event handlers ready?  */
    221      1.1  christos 	  res = check_async_event_handlers ();
    222      1.1  christos 	  break;
    223  1.1.1.2  christos 	default:
    224      1.1  christos 	  internal_error ("unexpected event_source_head %d",
    225      1.1  christos 			  event_source_head);
    226      1.1  christos 	}
    227      1.1  christos 
    228      1.1  christos       event_source_head++;
    229      1.1  christos       if (event_source_head == number_of_sources)
    230      1.1  christos 	event_source_head = 0;
    231      1.1  christos 
    232      1.1  christos       if (res > 0)
    233      1.1  christos 	return 1;
    234      1.1  christos     }
    235  1.1.1.2  christos 
    236  1.1.1.2  christos   if (mstimeout == 0)
    237  1.1.1.2  christos     return 0;	/* 0ms timeout: do not wait for an event. */
    238      1.1  christos 
    239      1.1  christos   /* Block waiting for a new event.  If gdb_wait_for_event returns -1,
    240      1.1  christos      we should get out because this means that there are no event
    241  1.1.1.2  christos      sources left.  This will make the event loop stop, and the
    242  1.1.1.2  christos      application exit.
    243  1.1.1.2  christos      If a timeout has been given, a new timer is set accordingly
    244  1.1.1.2  christos      to abort event wait.  It is deleted upon gdb_wait_for_event
    245  1.1.1.2  christos      termination and thus should never be triggered.
    246  1.1.1.2  christos      When the timeout is reached, events are not monitored again:
    247  1.1.1.2  christos      they already have been checked in the loop above. */
    248  1.1.1.3  christos 
    249  1.1.1.2  christos   std::optional<int> timer_id;
    250  1.1.1.2  christos 
    251  1.1.1.2  christos   SCOPE_EXIT
    252  1.1.1.2  christos     {
    253  1.1.1.2  christos       if (timer_id.has_value ())
    254  1.1.1.2  christos 	delete_timer (*timer_id);
    255  1.1.1.2  christos     };
    256  1.1.1.2  christos 
    257  1.1.1.2  christos   if (mstimeout > 0)
    258  1.1.1.2  christos     timer_id = create_timer (mstimeout,
    259  1.1.1.2  christos 			     [] (gdb_client_data arg)
    260  1.1.1.3  christos 			     {
    261  1.1.1.2  christos 			       ((std::optional<int> *) arg)->reset ();
    262  1.1.1.2  christos 			     },
    263  1.1.1.2  christos 			     &timer_id);
    264      1.1  christos   return gdb_wait_for_event (1);
    265      1.1  christos }
    266  1.1.1.2  christos 
    267      1.1  christos /* See event-loop.h  */
    268      1.1  christos 
    269  1.1.1.2  christos void
    270  1.1.1.2  christos add_file_handler (int fd, handler_func *proc, gdb_client_data client_data,
    271      1.1  christos 		  std::string &&name, bool is_ui)
    272      1.1  christos {
    273      1.1  christos #ifdef HAVE_POLL
    274      1.1  christos   if (use_poll)
    275  1.1.1.2  christos     {
    276  1.1.1.2  christos       struct pollfd fds;
    277      1.1  christos 
    278  1.1.1.2  christos       /* Check to see if poll () is usable.  If not, we'll switch to
    279  1.1.1.2  christos 	 use select.  This can happen on systems like
    280  1.1.1.2  christos 	 m68k-motorola-sys, `poll' cannot be used to wait for `stdin'.
    281  1.1.1.2  christos 	 On m68k-motorola-sysv, tty's are not stream-based and not
    282      1.1  christos 	 `poll'able.  */
    283      1.1  christos       fds.fd = fd;
    284      1.1  christos       fds.events = POLLIN;
    285  1.1.1.2  christos       if (poll (&fds, 1, 0) == 1 && (fds.revents & POLLNVAL))
    286      1.1  christos 	use_poll = false;
    287      1.1  christos     }
    288      1.1  christos   if (use_poll)
    289  1.1.1.2  christos     {
    290  1.1.1.2  christos       create_file_handler (fd, POLLIN, proc, client_data, std::move (name),
    291      1.1  christos 			   is_ui);
    292      1.1  christos     }
    293  1.1.1.2  christos   else
    294  1.1.1.2  christos #endif /* HAVE_POLL */
    295  1.1.1.2  christos     create_file_handler (fd, GDB_READABLE | GDB_EXCEPTION,
    296      1.1  christos 			 proc, client_data, std::move (name), is_ui);
    297      1.1  christos }
    298  1.1.1.2  christos 
    299      1.1  christos /* Helper for add_file_handler.
    300      1.1  christos 
    301      1.1  christos    For the poll case, MASK is a combination (OR) of POLLIN,
    302      1.1  christos    POLLRDNORM, POLLRDBAND, POLLPRI, POLLOUT, POLLWRNORM, POLLWRBAND:
    303      1.1  christos    these are the events we are interested in.  If any of them occurs,
    304      1.1  christos    proc should be called.
    305      1.1  christos 
    306      1.1  christos    For the select case, MASK is a combination of READABLE, WRITABLE,
    307      1.1  christos    EXCEPTION.  PROC is the procedure that will be called when an event
    308      1.1  christos    occurs for FD.  CLIENT_DATA is the argument to pass to PROC.  */
    309      1.1  christos 
    310  1.1.1.2  christos static void
    311  1.1.1.2  christos create_file_handler (int fd, int mask, handler_func * proc,
    312  1.1.1.2  christos 		     gdb_client_data client_data, std::string &&name,
    313      1.1  christos 		     bool is_ui)
    314      1.1  christos {
    315      1.1  christos   file_handler *file_ptr;
    316      1.1  christos 
    317      1.1  christos   /* Do we already have a file handler for this file?  (We may be
    318      1.1  christos      changing its associated procedure).  */
    319      1.1  christos   for (file_ptr = gdb_notifier.first_file_handler; file_ptr != NULL;
    320      1.1  christos        file_ptr = file_ptr->next_file)
    321      1.1  christos     {
    322      1.1  christos       if (file_ptr->fd == fd)
    323      1.1  christos 	break;
    324      1.1  christos     }
    325      1.1  christos 
    326      1.1  christos   /* It is a new file descriptor.  Add it to the list.  Otherwise, just
    327      1.1  christos      change the data associated with it.  */
    328      1.1  christos   if (file_ptr == NULL)
    329  1.1.1.2  christos     {
    330      1.1  christos       file_ptr = new file_handler;
    331      1.1  christos       file_ptr->fd = fd;
    332      1.1  christos       file_ptr->ready_mask = 0;
    333      1.1  christos       file_ptr->next_file = gdb_notifier.first_file_handler;
    334      1.1  christos       gdb_notifier.first_file_handler = file_ptr;
    335  1.1.1.2  christos 
    336      1.1  christos #ifdef HAVE_POLL
    337      1.1  christos       if (use_poll)
    338      1.1  christos 	{
    339  1.1.1.3  christos 	  gdb_notifier.num_fds++;
    340  1.1.1.3  christos 	  struct pollfd new_fd;
    341  1.1.1.3  christos 	  new_fd.fd = fd;
    342  1.1.1.3  christos 	  new_fd.events = mask;
    343  1.1.1.3  christos 	  new_fd.revents = 0;
    344      1.1  christos 	  gdb_notifier.poll_fds.push_back (new_fd);
    345      1.1  christos 	}
    346  1.1.1.2  christos       else
    347      1.1  christos #endif /* HAVE_POLL */
    348      1.1  christos 	{
    349      1.1  christos 	  if (mask & GDB_READABLE)
    350      1.1  christos 	    FD_SET (fd, &gdb_notifier.check_masks[0]);
    351      1.1  christos 	  else
    352      1.1  christos 	    FD_CLR (fd, &gdb_notifier.check_masks[0]);
    353      1.1  christos 
    354      1.1  christos 	  if (mask & GDB_WRITABLE)
    355      1.1  christos 	    FD_SET (fd, &gdb_notifier.check_masks[1]);
    356      1.1  christos 	  else
    357      1.1  christos 	    FD_CLR (fd, &gdb_notifier.check_masks[1]);
    358      1.1  christos 
    359      1.1  christos 	  if (mask & GDB_EXCEPTION)
    360      1.1  christos 	    FD_SET (fd, &gdb_notifier.check_masks[2]);
    361      1.1  christos 	  else
    362      1.1  christos 	    FD_CLR (fd, &gdb_notifier.check_masks[2]);
    363      1.1  christos 
    364      1.1  christos 	  if (gdb_notifier.num_fds <= fd)
    365      1.1  christos 	    gdb_notifier.num_fds = fd + 1;
    366      1.1  christos 	}
    367      1.1  christos     }
    368      1.1  christos 
    369      1.1  christos   file_ptr->proc = proc;
    370      1.1  christos   file_ptr->client_data = client_data;
    371  1.1.1.2  christos   file_ptr->mask = mask;
    372  1.1.1.2  christos   file_ptr->name = std::move (name);
    373      1.1  christos   file_ptr->is_ui = is_ui;
    374      1.1  christos }
    375      1.1  christos 
    376      1.1  christos /* Return the next file handler to handle, and advance to the next
    377      1.1  christos    file handler, wrapping around if the end of the list is
    378      1.1  christos    reached.  */
    379      1.1  christos 
    380      1.1  christos static file_handler *
    381      1.1  christos get_next_file_handler_to_handle_and_advance (void)
    382      1.1  christos {
    383      1.1  christos   file_handler *curr_next;
    384      1.1  christos 
    385      1.1  christos   /* The first time around, this is still NULL.  */
    386      1.1  christos   if (gdb_notifier.next_file_handler == NULL)
    387      1.1  christos     gdb_notifier.next_file_handler = gdb_notifier.first_file_handler;
    388      1.1  christos 
    389      1.1  christos   curr_next = gdb_notifier.next_file_handler;
    390      1.1  christos   gdb_assert (curr_next != NULL);
    391      1.1  christos 
    392      1.1  christos   /* Advance.  */
    393      1.1  christos   gdb_notifier.next_file_handler = curr_next->next_file;
    394      1.1  christos   /* Wrap around, if necessary.  */
    395      1.1  christos   if (gdb_notifier.next_file_handler == NULL)
    396      1.1  christos     gdb_notifier.next_file_handler = gdb_notifier.first_file_handler;
    397      1.1  christos 
    398      1.1  christos   return curr_next;
    399      1.1  christos }
    400      1.1  christos 
    401      1.1  christos /* Remove the file descriptor FD from the list of monitored fd's:
    402      1.1  christos    i.e. we don't care anymore about events on the FD.  */
    403      1.1  christos void
    404      1.1  christos delete_file_handler (int fd)
    405      1.1  christos {
    406      1.1  christos   file_handler *file_ptr, *prev_ptr = NULL;
    407      1.1  christos   int i;
    408      1.1  christos 
    409      1.1  christos   /* Find the entry for the given file.  */
    410      1.1  christos 
    411      1.1  christos   for (file_ptr = gdb_notifier.first_file_handler; file_ptr != NULL;
    412      1.1  christos        file_ptr = file_ptr->next_file)
    413      1.1  christos     {
    414      1.1  christos       if (file_ptr->fd == fd)
    415      1.1  christos 	break;
    416      1.1  christos     }
    417      1.1  christos 
    418      1.1  christos   if (file_ptr == NULL)
    419      1.1  christos     return;
    420  1.1.1.2  christos 
    421      1.1  christos #ifdef HAVE_POLL
    422      1.1  christos   if (use_poll)
    423  1.1.1.3  christos     {
    424  1.1.1.3  christos       auto iter = std::remove_if (gdb_notifier.poll_fds.begin (),
    425  1.1.1.3  christos 				  gdb_notifier.poll_fds.end (),
    426  1.1.1.3  christos 				  [=] (const pollfd &item)
    427  1.1.1.3  christos 				  {
    428  1.1.1.3  christos 				    return item.fd == fd;
    429  1.1.1.3  christos 				  });
    430      1.1  christos       gdb_notifier.poll_fds.erase (iter, gdb_notifier.poll_fds.end());
    431      1.1  christos       gdb_notifier.num_fds--;
    432      1.1  christos     }
    433  1.1.1.2  christos   else
    434      1.1  christos #endif /* HAVE_POLL */
    435      1.1  christos     {
    436      1.1  christos       if (file_ptr->mask & GDB_READABLE)
    437      1.1  christos 	FD_CLR (fd, &gdb_notifier.check_masks[0]);
    438      1.1  christos       if (file_ptr->mask & GDB_WRITABLE)
    439      1.1  christos 	FD_CLR (fd, &gdb_notifier.check_masks[1]);
    440      1.1  christos       if (file_ptr->mask & GDB_EXCEPTION)
    441      1.1  christos 	FD_CLR (fd, &gdb_notifier.check_masks[2]);
    442      1.1  christos 
    443      1.1  christos       /* Find current max fd.  */
    444      1.1  christos 
    445      1.1  christos       if ((fd + 1) == gdb_notifier.num_fds)
    446      1.1  christos 	{
    447      1.1  christos 	  gdb_notifier.num_fds--;
    448      1.1  christos 	  for (i = gdb_notifier.num_fds; i; i--)
    449      1.1  christos 	    {
    450      1.1  christos 	      if (FD_ISSET (i - 1, &gdb_notifier.check_masks[0])
    451      1.1  christos 		  || FD_ISSET (i - 1, &gdb_notifier.check_masks[1])
    452      1.1  christos 		  || FD_ISSET (i - 1, &gdb_notifier.check_masks[2]))
    453      1.1  christos 		break;
    454      1.1  christos 	    }
    455      1.1  christos 	  gdb_notifier.num_fds = i;
    456      1.1  christos 	}
    457      1.1  christos     }
    458      1.1  christos 
    459      1.1  christos   /* Deactivate the file descriptor, by clearing its mask,
    460      1.1  christos      so that it will not fire again.  */
    461      1.1  christos 
    462      1.1  christos   file_ptr->mask = 0;
    463      1.1  christos 
    464      1.1  christos   /* If this file handler was going to be the next one to be handled,
    465      1.1  christos      advance to the next's next, if any.  */
    466      1.1  christos   if (gdb_notifier.next_file_handler == file_ptr)
    467      1.1  christos     {
    468      1.1  christos       if (file_ptr->next_file == NULL
    469      1.1  christos 	  && file_ptr == gdb_notifier.first_file_handler)
    470      1.1  christos 	gdb_notifier.next_file_handler = NULL;
    471      1.1  christos       else
    472      1.1  christos 	get_next_file_handler_to_handle_and_advance ();
    473      1.1  christos     }
    474      1.1  christos 
    475      1.1  christos   /* Get rid of the file handler in the file handler list.  */
    476      1.1  christos   if (file_ptr == gdb_notifier.first_file_handler)
    477      1.1  christos     gdb_notifier.first_file_handler = file_ptr->next_file;
    478      1.1  christos   else
    479      1.1  christos     {
    480      1.1  christos       for (prev_ptr = gdb_notifier.first_file_handler;
    481      1.1  christos 	   prev_ptr->next_file != file_ptr;
    482      1.1  christos 	   prev_ptr = prev_ptr->next_file)
    483      1.1  christos 	;
    484      1.1  christos       prev_ptr->next_file = file_ptr->next_file;
    485  1.1.1.2  christos     }
    486  1.1.1.2  christos 
    487      1.1  christos   delete file_ptr;
    488      1.1  christos }
    489      1.1  christos 
    490      1.1  christos /* Handle the given event by calling the procedure associated to the
    491      1.1  christos    corresponding file handler.  */
    492      1.1  christos 
    493      1.1  christos static void
    494      1.1  christos handle_file_event (file_handler *file_ptr, int ready_mask)
    495      1.1  christos {
    496      1.1  christos   int mask;
    497  1.1.1.2  christos 
    498  1.1.1.2  christos   /* See if the desired events (mask) match the received events
    499      1.1  christos      (ready_mask).  */
    500      1.1  christos 
    501  1.1.1.2  christos #ifdef HAVE_POLL
    502  1.1.1.2  christos   if (use_poll)
    503  1.1.1.2  christos     {
    504      1.1  christos       int error_mask;
    505  1.1.1.2  christos 
    506  1.1.1.2  christos       /* With poll, the ready_mask could have any of three events set
    507  1.1.1.2  christos 	 to 1: POLLHUP, POLLERR, POLLNVAL.  These events cannot be
    508  1.1.1.2  christos 	 used in the requested event mask (events), but they can be
    509  1.1.1.2  christos 	 returned in the return mask (revents).  We need to check for
    510  1.1.1.2  christos 	 those event too, and add them to the mask which will be
    511  1.1.1.2  christos 	 passed to the handler.  */
    512  1.1.1.2  christos 
    513  1.1.1.2  christos       /* POLLHUP means EOF, but can be combined with POLLIN to
    514  1.1.1.2  christos 	 signal more data to read.  */
    515  1.1.1.2  christos       error_mask = POLLHUP | POLLERR | POLLNVAL;
    516  1.1.1.2  christos       mask = ready_mask & (file_ptr->mask | error_mask);
    517  1.1.1.2  christos 
    518  1.1.1.2  christos       if ((mask & (POLLERR | POLLNVAL)) != 0)
    519  1.1.1.2  christos 	{
    520  1.1.1.2  christos 	  /* Work in progress.  We may need to tell somebody
    521  1.1.1.2  christos 	     what kind of error we had.  */
    522  1.1.1.2  christos 	  if (mask & POLLERR)
    523  1.1.1.2  christos 	    warning (_("Error detected on fd %d"), file_ptr->fd);
    524  1.1.1.2  christos 	  if (mask & POLLNVAL)
    525  1.1.1.2  christos 	    warning (_("Invalid or non-`poll'able fd %d"),
    526  1.1.1.2  christos 		     file_ptr->fd);
    527  1.1.1.2  christos 	  file_ptr->error = 1;
    528  1.1.1.2  christos 	}
    529  1.1.1.2  christos       else
    530  1.1.1.2  christos 	file_ptr->error = 0;
    531  1.1.1.2  christos     }
    532  1.1.1.2  christos   else
    533  1.1.1.2  christos #endif /* HAVE_POLL */
    534  1.1.1.2  christos     {
    535  1.1.1.2  christos       if (ready_mask & GDB_EXCEPTION)
    536  1.1.1.2  christos 	{
    537  1.1.1.2  christos 	  warning (_("Exception condition detected on fd %d"),
    538  1.1.1.2  christos 		   file_ptr->fd);
    539      1.1  christos 	  file_ptr->error = 1;
    540  1.1.1.2  christos 	}
    541  1.1.1.2  christos       else
    542  1.1.1.2  christos 	file_ptr->error = 0;
    543  1.1.1.2  christos       mask = ready_mask & file_ptr->mask;
    544  1.1.1.2  christos     }
    545  1.1.1.2  christos 
    546  1.1.1.2  christos   /* If there was a match, then call the handler.  */
    547  1.1.1.2  christos   if (mask != 0)
    548  1.1.1.2  christos     {
    549  1.1.1.2  christos       event_loop_ui_debug_printf (file_ptr->is_ui,
    550  1.1.1.2  christos 				  "invoking fd file handler `%s`",
    551  1.1.1.2  christos 				  file_ptr->name.c_str ());
    552      1.1  christos       file_ptr->proc (file_ptr->error, file_ptr->client_data);
    553      1.1  christos     }
    554      1.1  christos }
    555      1.1  christos 
    556      1.1  christos /* Wait for new events on the monitored file descriptors.  Run the
    557      1.1  christos    event handler if the first descriptor that is detected by the poll.
    558      1.1  christos    If BLOCK and if there are no events, this function will block in
    559      1.1  christos    the call to poll.  Return 1 if an event was handled.  Return -1 if
    560      1.1  christos    there are no file descriptors to monitor.  Return 1 if an event was
    561      1.1  christos    handled, otherwise returns 0.  */
    562      1.1  christos 
    563      1.1  christos static int
    564      1.1  christos gdb_wait_for_event (int block)
    565      1.1  christos {
    566      1.1  christos   file_handler *file_ptr;
    567      1.1  christos   int num_found = 0;
    568      1.1  christos 
    569      1.1  christos   /* Make sure all output is done before getting another event.  */
    570      1.1  christos   flush_streams ();
    571      1.1  christos 
    572      1.1  christos   if (gdb_notifier.num_fds == 0)
    573      1.1  christos     return -1;
    574      1.1  christos 
    575      1.1  christos   if (block)
    576      1.1  christos     update_wait_timeout ();
    577  1.1.1.2  christos 
    578      1.1  christos #ifdef HAVE_POLL
    579      1.1  christos   if (use_poll)
    580      1.1  christos     {
    581      1.1  christos       int timeout;
    582      1.1  christos 
    583      1.1  christos       if (block)
    584      1.1  christos 	timeout = gdb_notifier.timeout_valid ? gdb_notifier.poll_timeout : -1;
    585      1.1  christos       else
    586      1.1  christos 	timeout = 0;
    587  1.1.1.3  christos 
    588      1.1  christos       num_found = poll (gdb_notifier.poll_fds.data (),
    589      1.1  christos 			(unsigned long) gdb_notifier.num_fds, timeout);
    590      1.1  christos 
    591      1.1  christos       /* Don't print anything if we get out of poll because of a
    592      1.1  christos 	 signal.  */
    593      1.1  christos       if (num_found == -1 && errno != EINTR)
    594      1.1  christos 	perror_with_name (("poll"));
    595      1.1  christos     }
    596  1.1.1.2  christos   else
    597      1.1  christos #endif /* HAVE_POLL */
    598      1.1  christos     {
    599      1.1  christos       struct timeval select_timeout;
    600      1.1  christos       struct timeval *timeout_p;
    601      1.1  christos 
    602      1.1  christos       if (block)
    603      1.1  christos 	timeout_p = gdb_notifier.timeout_valid
    604      1.1  christos 	  ? &gdb_notifier.select_timeout : NULL;
    605      1.1  christos       else
    606      1.1  christos 	{
    607      1.1  christos 	  memset (&select_timeout, 0, sizeof (select_timeout));
    608      1.1  christos 	  timeout_p = &select_timeout;
    609      1.1  christos 	}
    610      1.1  christos 
    611      1.1  christos       gdb_notifier.ready_masks[0] = gdb_notifier.check_masks[0];
    612      1.1  christos       gdb_notifier.ready_masks[1] = gdb_notifier.check_masks[1];
    613      1.1  christos       gdb_notifier.ready_masks[2] = gdb_notifier.check_masks[2];
    614      1.1  christos       num_found = gdb_select (gdb_notifier.num_fds,
    615      1.1  christos 			      &gdb_notifier.ready_masks[0],
    616      1.1  christos 			      &gdb_notifier.ready_masks[1],
    617      1.1  christos 			      &gdb_notifier.ready_masks[2],
    618      1.1  christos 			      timeout_p);
    619      1.1  christos 
    620      1.1  christos       /* Clear the masks after an error from select.  */
    621      1.1  christos       if (num_found == -1)
    622      1.1  christos 	{
    623      1.1  christos 	  FD_ZERO (&gdb_notifier.ready_masks[0]);
    624      1.1  christos 	  FD_ZERO (&gdb_notifier.ready_masks[1]);
    625      1.1  christos 	  FD_ZERO (&gdb_notifier.ready_masks[2]);
    626      1.1  christos 
    627      1.1  christos 	  /* Dont print anything if we got a signal, let gdb handle
    628      1.1  christos 	     it.  */
    629      1.1  christos 	  if (errno != EINTR)
    630      1.1  christos 	    perror_with_name (("select"));
    631      1.1  christos 	}
    632      1.1  christos     }
    633      1.1  christos 
    634      1.1  christos   /* Avoid looking at poll_fds[i]->revents if no event fired.  */
    635      1.1  christos   if (num_found <= 0)
    636      1.1  christos     return 0;
    637      1.1  christos 
    638      1.1  christos   /* Run event handlers.  We always run just one handler and go back
    639      1.1  christos      to polling, in case a handler changes the notifier list.  Since
    640      1.1  christos      events for sources we haven't consumed yet wake poll/select
    641      1.1  christos      immediately, no event is lost.  */
    642      1.1  christos 
    643      1.1  christos   /* To level the fairness across event descriptors, we handle them in
    644      1.1  christos      a round-robin-like fashion.  The number and order of descriptors
    645  1.1.1.2  christos      may change between invocations, but this is good enough.  */
    646      1.1  christos #ifdef HAVE_POLL
    647      1.1  christos   if (use_poll)
    648      1.1  christos     {
    649      1.1  christos       int i;
    650      1.1  christos       int mask;
    651      1.1  christos 
    652      1.1  christos       while (1)
    653      1.1  christos 	{
    654      1.1  christos 	  if (gdb_notifier.next_poll_fds_index >= gdb_notifier.num_fds)
    655      1.1  christos 	    gdb_notifier.next_poll_fds_index = 0;
    656      1.1  christos 	  i = gdb_notifier.next_poll_fds_index++;
    657      1.1  christos 
    658  1.1.1.3  christos 	  gdb_assert (i < gdb_notifier.num_fds);
    659      1.1  christos 	  if (gdb_notifier.poll_fds[i].revents)
    660      1.1  christos 	    break;
    661      1.1  christos 	}
    662      1.1  christos 
    663      1.1  christos       for (file_ptr = gdb_notifier.first_file_handler;
    664      1.1  christos 	   file_ptr != NULL;
    665      1.1  christos 	   file_ptr = file_ptr->next_file)
    666  1.1.1.3  christos 	{
    667      1.1  christos 	  if (file_ptr->fd == gdb_notifier.poll_fds[i].fd)
    668      1.1  christos 	    break;
    669      1.1  christos 	}
    670      1.1  christos       gdb_assert (file_ptr != NULL);
    671  1.1.1.3  christos 
    672      1.1  christos       mask = gdb_notifier.poll_fds[i].revents;
    673      1.1  christos       handle_file_event (file_ptr, mask);
    674      1.1  christos       return 1;
    675      1.1  christos     }
    676  1.1.1.2  christos   else
    677      1.1  christos #endif /* HAVE_POLL */
    678      1.1  christos     {
    679      1.1  christos       /* See comment about even source fairness above.  */
    680      1.1  christos       int mask = 0;
    681      1.1  christos 
    682      1.1  christos       do
    683      1.1  christos 	{
    684      1.1  christos 	  file_ptr = get_next_file_handler_to_handle_and_advance ();
    685      1.1  christos 
    686      1.1  christos 	  if (FD_ISSET (file_ptr->fd, &gdb_notifier.ready_masks[0]))
    687      1.1  christos 	    mask |= GDB_READABLE;
    688      1.1  christos 	  if (FD_ISSET (file_ptr->fd, &gdb_notifier.ready_masks[1]))
    689      1.1  christos 	    mask |= GDB_WRITABLE;
    690      1.1  christos 	  if (FD_ISSET (file_ptr->fd, &gdb_notifier.ready_masks[2]))
    691      1.1  christos 	    mask |= GDB_EXCEPTION;
    692      1.1  christos 	}
    693      1.1  christos       while (mask == 0);
    694      1.1  christos 
    695      1.1  christos       handle_file_event (file_ptr, mask);
    696      1.1  christos       return 1;
    697      1.1  christos     }
    698      1.1  christos   return 0;
    699      1.1  christos }
    700      1.1  christos 
    701      1.1  christos /* Create a timer that will expire in MS milliseconds from now.  When
    703      1.1  christos    the timer is ready, PROC will be executed.  At creation, the timer
    704      1.1  christos    is added to the timers queue.  This queue is kept sorted in order
    705      1.1  christos    of increasing timers.  Return a handle to the timer struct.  */
    706      1.1  christos 
    707      1.1  christos int
    708      1.1  christos create_timer (int ms, timer_handler_func *proc,
    709      1.1  christos 	      gdb_client_data client_data)
    710      1.1  christos {
    711      1.1  christos   using namespace std::chrono;
    712      1.1  christos   struct gdb_timer *timer_ptr, *timer_index, *prev_timer;
    713      1.1  christos 
    714      1.1  christos   steady_clock::time_point time_now = steady_clock::now ();
    715      1.1  christos 
    716      1.1  christos   timer_ptr = new gdb_timer ();
    717      1.1  christos   timer_ptr->when = time_now + milliseconds (ms);
    718      1.1  christos   timer_ptr->proc = proc;
    719      1.1  christos   timer_ptr->client_data = client_data;
    720      1.1  christos   timer_list.num_timers++;
    721      1.1  christos   timer_ptr->timer_id = timer_list.num_timers;
    722      1.1  christos 
    723      1.1  christos   /* Now add the timer to the timer queue, making sure it is sorted in
    724      1.1  christos      increasing order of expiration.  */
    725      1.1  christos 
    726      1.1  christos   for (timer_index = timer_list.first_timer;
    727      1.1  christos        timer_index != NULL;
    728      1.1  christos        timer_index = timer_index->next)
    729      1.1  christos     {
    730      1.1  christos       if (timer_index->when > timer_ptr->when)
    731      1.1  christos 	break;
    732      1.1  christos     }
    733      1.1  christos 
    734      1.1  christos   if (timer_index == timer_list.first_timer)
    735      1.1  christos     {
    736      1.1  christos       timer_ptr->next = timer_list.first_timer;
    737      1.1  christos       timer_list.first_timer = timer_ptr;
    738      1.1  christos 
    739      1.1  christos     }
    740      1.1  christos   else
    741      1.1  christos     {
    742      1.1  christos       for (prev_timer = timer_list.first_timer;
    743      1.1  christos 	   prev_timer->next != timer_index;
    744      1.1  christos 	   prev_timer = prev_timer->next)
    745      1.1  christos 	;
    746      1.1  christos 
    747      1.1  christos       prev_timer->next = timer_ptr;
    748      1.1  christos       timer_ptr->next = timer_index;
    749      1.1  christos     }
    750      1.1  christos 
    751      1.1  christos   gdb_notifier.timeout_valid = 0;
    752      1.1  christos   return timer_ptr->timer_id;
    753      1.1  christos }
    754      1.1  christos 
    755      1.1  christos /* There is a chance that the creator of the timer wants to get rid of
    756      1.1  christos    it before it expires.  */
    757      1.1  christos void
    758      1.1  christos delete_timer (int id)
    759      1.1  christos {
    760      1.1  christos   struct gdb_timer *timer_ptr, *prev_timer = NULL;
    761      1.1  christos 
    762      1.1  christos   /* Find the entry for the given timer.  */
    763      1.1  christos 
    764      1.1  christos   for (timer_ptr = timer_list.first_timer; timer_ptr != NULL;
    765      1.1  christos        timer_ptr = timer_ptr->next)
    766      1.1  christos     {
    767      1.1  christos       if (timer_ptr->timer_id == id)
    768      1.1  christos 	break;
    769      1.1  christos     }
    770      1.1  christos 
    771      1.1  christos   if (timer_ptr == NULL)
    772      1.1  christos     return;
    773      1.1  christos   /* Get rid of the timer in the timer list.  */
    774      1.1  christos   if (timer_ptr == timer_list.first_timer)
    775      1.1  christos     timer_list.first_timer = timer_ptr->next;
    776      1.1  christos   else
    777      1.1  christos     {
    778      1.1  christos       for (prev_timer = timer_list.first_timer;
    779      1.1  christos 	   prev_timer->next != timer_ptr;
    780      1.1  christos 	   prev_timer = prev_timer->next)
    781      1.1  christos 	;
    782      1.1  christos       prev_timer->next = timer_ptr->next;
    783      1.1  christos     }
    784      1.1  christos   delete timer_ptr;
    785      1.1  christos 
    786      1.1  christos   gdb_notifier.timeout_valid = 0;
    787      1.1  christos }
    788      1.1  christos 
    789      1.1  christos /* Convert a std::chrono duration to a struct timeval.  */
    790      1.1  christos 
    791      1.1  christos template<typename Duration>
    792      1.1  christos static struct timeval
    793      1.1  christos duration_cast_timeval (const Duration &d)
    794      1.1  christos {
    795      1.1  christos   using namespace std::chrono;
    796      1.1  christos   seconds sec = duration_cast<seconds> (d);
    797      1.1  christos   microseconds msec = duration_cast<microseconds> (d - sec);
    798      1.1  christos 
    799      1.1  christos   struct timeval tv;
    800      1.1  christos   tv.tv_sec = sec.count ();
    801      1.1  christos   tv.tv_usec = msec.count ();
    802      1.1  christos   return tv;
    803      1.1  christos }
    804      1.1  christos 
    805      1.1  christos /* Update the timeout for the select() or poll().  Returns true if the
    806      1.1  christos    timer has already expired, false otherwise.  */
    807      1.1  christos 
    808      1.1  christos static int
    809      1.1  christos update_wait_timeout (void)
    810      1.1  christos {
    811      1.1  christos   if (timer_list.first_timer != NULL)
    812      1.1  christos     {
    813      1.1  christos       using namespace std::chrono;
    814      1.1  christos       steady_clock::time_point time_now = steady_clock::now ();
    815      1.1  christos       struct timeval timeout;
    816      1.1  christos 
    817      1.1  christos       if (timer_list.first_timer->when < time_now)
    818      1.1  christos 	{
    819      1.1  christos 	  /* It expired already.  */
    820      1.1  christos 	  timeout.tv_sec = 0;
    821      1.1  christos 	  timeout.tv_usec = 0;
    822      1.1  christos 	}
    823      1.1  christos       else
    824      1.1  christos 	{
    825      1.1  christos 	  steady_clock::duration d = timer_list.first_timer->when - time_now;
    826      1.1  christos 	  timeout = duration_cast_timeval (d);
    827      1.1  christos 	}
    828      1.1  christos 
    829  1.1.1.2  christos       /* Update the timeout for select/ poll.  */
    830  1.1.1.2  christos #ifdef HAVE_POLL
    831      1.1  christos       if (use_poll)
    832  1.1.1.2  christos 	gdb_notifier.poll_timeout = timeout.tv_sec * 1000;
    833      1.1  christos       else
    834      1.1  christos #endif /* HAVE_POLL */
    835      1.1  christos 	{
    836      1.1  christos 	  gdb_notifier.select_timeout.tv_sec = timeout.tv_sec;
    837      1.1  christos 	  gdb_notifier.select_timeout.tv_usec = timeout.tv_usec;
    838      1.1  christos 	}
    839      1.1  christos       gdb_notifier.timeout_valid = 1;
    840      1.1  christos 
    841      1.1  christos       if (timer_list.first_timer->when < time_now)
    842      1.1  christos 	return 1;
    843      1.1  christos     }
    844      1.1  christos   else
    845      1.1  christos     gdb_notifier.timeout_valid = 0;
    846      1.1  christos 
    847      1.1  christos   return 0;
    848      1.1  christos }
    849      1.1  christos 
    850      1.1  christos /* Check whether a timer in the timers queue is ready.  If a timer is
    851      1.1  christos    ready, call its handler and return.  Update the timeout for the
    852      1.1  christos    select() or poll() as well.  Return 1 if an event was handled,
    853      1.1  christos    otherwise returns 0.*/
    854      1.1  christos 
    855      1.1  christos static int
    856      1.1  christos poll_timers (void)
    857      1.1  christos {
    858      1.1  christos   if (update_wait_timeout ())
    859      1.1  christos     {
    860      1.1  christos       struct gdb_timer *timer_ptr = timer_list.first_timer;
    861      1.1  christos       timer_handler_func *proc = timer_ptr->proc;
    862      1.1  christos       gdb_client_data client_data = timer_ptr->client_data;
    863      1.1  christos 
    864      1.1  christos       /* Get rid of the timer from the beginning of the list.  */
    865      1.1  christos       timer_list.first_timer = timer_ptr->next;
    866      1.1  christos 
    867      1.1  christos       /* Delete the timer before calling the callback, not after, in
    868      1.1  christos 	 case the callback itself decides to try deleting the timer
    869      1.1  christos 	 too.  */
    870      1.1  christos       delete timer_ptr;
    871      1.1  christos 
    872      1.1  christos       /* Call the procedure associated with that timer.  */
    873      1.1  christos       (proc) (client_data);
    874      1.1  christos 
    875      1.1  christos       return 1;
    876      1.1  christos     }
    877      1.1  christos 
    878                      return 0;
    879                    }
    880