gdbsupport/event-loop.cc: simplify !HAVE_POLL paths

gdbsupport/event-loop.cc throughout handles the case of use_poll being
true on a system where HAVE_POLL is not defined, by calling
internal_error if that situation ever happens.

Simplify this by moving the "use_poll" global itself under HAVE_POLL,
so that it's way more unlikely to ever end up in such a situation.
Then, move the code that checks the value of use_poll under HAVE_POLL
too, and remove the internal_error calls.  Like, from:

    if (use_poll)
      {
  #ifdef HAVE_POLL
        // poll code
  #else
      internal_error (....);
  #endif /* HAVE_POLL */
      }
    else
      {
	// select code
      }

to

  #ifdef HAVE_POLL
    if (use_poll)
      {
        // poll code
      }
    else
  #endif /* HAVE_POLL */
      {
	// select code
      }

While at it, make use_poll be a bool.  The current code is using
unsigned char most probably to save space, but I don't think it really
matters here.

Co-Authored-By: Youling Tang <tangyouling@loongson.cn>
Change-Id: I0dd74fdd4d393ccd057906df4cd75e8e83c1cdb4
This commit is contained in:
Pedro Alves 2022-05-16 10:11:15 +01:00
parent e90601a4f1
commit 36a5b37053

View File

@ -78,14 +78,12 @@ struct file_handler
struct file_handler *next_file; struct file_handler *next_file;
}; };
/* Do we use poll or select ? */
#ifdef HAVE_POLL #ifdef HAVE_POLL
#define USE_POLL 1 /* Do we use poll or select? Some systems have poll, but then it's
#else not useable with all kinds of files. We probe that whenever a new
#define USE_POLL 0 file handler is added. */
#endif /* HAVE_POLL */ static bool use_poll = true;
#endif
static unsigned char use_poll = USE_POLL;
#ifdef USE_WIN32API #ifdef USE_WIN32API
#include <windows.h> #include <windows.h>
@ -249,12 +247,10 @@ 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 #ifdef HAVE_POLL
struct pollfd fds;
#endif
if (use_poll) if (use_poll)
{ {
#ifdef HAVE_POLL struct pollfd fds;
/* Check to see if poll () is usable. If not, we'll switch to /* Check to see if poll () is usable. If not, we'll switch to
use select. This can happen on systems like use select. This can happen on systems like
m68k-motorola-sys, `poll' cannot be used to wait for `stdin'. m68k-motorola-sys, `poll' cannot be used to wait for `stdin'.
@ -263,23 +259,15 @@ add_file_handler (int fd, handler_func *proc, gdb_client_data client_data,
fds.fd = fd; fds.fd = fd;
fds.events = POLLIN; fds.events = POLLIN;
if (poll (&fds, 1, 0) == 1 && (fds.revents & POLLNVAL)) if (poll (&fds, 1, 0) == 1 && (fds.revents & POLLNVAL))
use_poll = 0; use_poll = false;
#else
internal_error (__FILE__, __LINE__,
_("use_poll without HAVE_POLL"));
#endif /* HAVE_POLL */
} }
if (use_poll) if (use_poll)
{ {
#ifdef HAVE_POLL
create_file_handler (fd, POLLIN, proc, client_data, std::move (name), create_file_handler (fd, POLLIN, proc, client_data, std::move (name),
is_ui); is_ui);
#else
internal_error (__FILE__, __LINE__,
_("use_poll without HAVE_POLL"));
#endif
} }
else else
#endif /* HAVE_POLL */
create_file_handler (fd, GDB_READABLE | GDB_EXCEPTION, create_file_handler (fd, GDB_READABLE | GDB_EXCEPTION,
proc, client_data, std::move (name), is_ui); proc, client_data, std::move (name), is_ui);
} }
@ -321,9 +309,9 @@ create_file_handler (int fd, int mask, handler_func * proc,
file_ptr->next_file = gdb_notifier.first_file_handler; file_ptr->next_file = gdb_notifier.first_file_handler;
gdb_notifier.first_file_handler = file_ptr; gdb_notifier.first_file_handler = file_ptr;
#ifdef HAVE_POLL
if (use_poll) if (use_poll)
{ {
#ifdef HAVE_POLL
gdb_notifier.num_fds++; gdb_notifier.num_fds++;
if (gdb_notifier.poll_fds) if (gdb_notifier.poll_fds)
gdb_notifier.poll_fds = gdb_notifier.poll_fds =
@ -336,12 +324,9 @@ create_file_handler (int fd, int mask, handler_func * proc,
(gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->fd = fd; (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)->events = mask;
(gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->revents = 0; (gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->revents = 0;
#else
internal_error (__FILE__, __LINE__,
_("use_poll without HAVE_POLL"));
#endif /* HAVE_POLL */
} }
else else
#endif /* HAVE_POLL */
{ {
if (mask & GDB_READABLE) if (mask & GDB_READABLE)
FD_SET (fd, &gdb_notifier.check_masks[0]); FD_SET (fd, &gdb_notifier.check_masks[0]);
@ -402,10 +387,6 @@ delete_file_handler (int fd)
{ {
file_handler *file_ptr, *prev_ptr = NULL; file_handler *file_ptr, *prev_ptr = NULL;
int i; int i;
#ifdef HAVE_POLL
int j;
struct pollfd *new_poll_fds;
#endif
/* Find the entry for the given file. */ /* Find the entry for the given file. */
@ -419,9 +400,12 @@ delete_file_handler (int fd)
if (file_ptr == NULL) if (file_ptr == NULL)
return; return;
#ifdef HAVE_POLL
if (use_poll) if (use_poll)
{ {
#ifdef HAVE_POLL int j;
struct pollfd *new_poll_fds;
/* Create a new poll_fds array by copying every fd's information /* Create a new poll_fds array by copying every fd's information
but the one we want to get rid of. */ but the one we want to get rid of. */
@ -442,12 +426,9 @@ delete_file_handler (int fd)
xfree (gdb_notifier.poll_fds); xfree (gdb_notifier.poll_fds);
gdb_notifier.poll_fds = new_poll_fds; gdb_notifier.poll_fds = new_poll_fds;
gdb_notifier.num_fds--; gdb_notifier.num_fds--;
#else
internal_error (__FILE__, __LINE__,
_("use_poll without HAVE_POLL"));
#endif /* HAVE_POLL */
} }
else else
#endif /* HAVE_POLL */
{ {
if (file_ptr->mask & GDB_READABLE) if (file_ptr->mask & GDB_READABLE)
FD_CLR (fd, &gdb_notifier.check_masks[0]); FD_CLR (fd, &gdb_notifier.check_masks[0]);
@ -510,9 +491,6 @@ static void
handle_file_event (file_handler *file_ptr, int ready_mask) handle_file_event (file_handler *file_ptr, int ready_mask)
{ {
int mask; int mask;
#ifdef HAVE_POLL
int error_mask;
#endif
{ {
{ {
@ -526,9 +504,11 @@ handle_file_event (file_handler *file_ptr, int ready_mask)
/* See if the desired events (mask) match the received /* See if the desired events (mask) match the received
events (ready_mask). */ events (ready_mask). */
#ifdef HAVE_POLL
if (use_poll) if (use_poll)
{ {
#ifdef HAVE_POLL int error_mask;
/* POLLHUP means EOF, but can be combined with POLLIN to /* POLLHUP means EOF, but can be combined with POLLIN to
signal more data to read. */ signal more data to read. */
error_mask = POLLHUP | POLLERR | POLLNVAL; error_mask = POLLHUP | POLLERR | POLLNVAL;
@ -547,12 +527,9 @@ handle_file_event (file_handler *file_ptr, int ready_mask)
} }
else else
file_ptr->error = 0; file_ptr->error = 0;
#else
internal_error (__FILE__, __LINE__,
_("use_poll without HAVE_POLL"));
#endif /* HAVE_POLL */
} }
else else
#endif /* HAVE_POLL */
{ {
if (ready_mask & GDB_EXCEPTION) if (ready_mask & GDB_EXCEPTION)
{ {
@ -599,9 +576,9 @@ gdb_wait_for_event (int block)
if (block) if (block)
update_wait_timeout (); update_wait_timeout ();
#ifdef HAVE_POLL
if (use_poll) if (use_poll)
{ {
#ifdef HAVE_POLL
int timeout; int timeout;
if (block) if (block)
@ -616,12 +593,9 @@ gdb_wait_for_event (int block)
signal. */ signal. */
if (num_found == -1 && errno != EINTR) if (num_found == -1 && errno != EINTR)
perror_with_name (("poll")); perror_with_name (("poll"));
#else
internal_error (__FILE__, __LINE__,
_("use_poll without HAVE_POLL"));
#endif /* HAVE_POLL */
} }
else else
#endif /* HAVE_POLL */
{ {
struct timeval select_timeout; struct timeval select_timeout;
struct timeval *timeout_p; struct timeval *timeout_p;
@ -670,9 +644,9 @@ gdb_wait_for_event (int block)
/* 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 a round-robin-like fashion. The number and order of descriptors
may change between invocations, but this is good enough. */ may change between invocations, but this is good enough. */
#ifdef HAVE_POLL
if (use_poll) if (use_poll)
{ {
#ifdef HAVE_POLL
int i; int i;
int mask; int mask;
@ -699,12 +673,9 @@ gdb_wait_for_event (int block)
mask = (gdb_notifier.poll_fds + i)->revents; mask = (gdb_notifier.poll_fds + i)->revents;
handle_file_event (file_ptr, mask); handle_file_event (file_ptr, mask);
return 1; return 1;
#else
internal_error (__FILE__, __LINE__,
_("use_poll without HAVE_POLL"));
#endif /* HAVE_POLL */
} }
else else
#endif /* HAVE_POLL */
{ {
/* See comment about even source fairness above. */ /* See comment about even source fairness above. */
int mask = 0; int mask = 0;
@ -856,16 +827,11 @@ update_wait_timeout (void)
} }
/* Update the timeout for select/ poll. */ /* Update the timeout for select/ poll. */
if (use_poll)
{
#ifdef HAVE_POLL #ifdef HAVE_POLL
gdb_notifier.poll_timeout = timeout.tv_sec * 1000; if (use_poll)
#else gdb_notifier.poll_timeout = timeout.tv_sec * 1000;
internal_error (__FILE__, __LINE__,
_("use_poll without HAVE_POLL"));
#endif /* HAVE_POLL */
}
else else
#endif /* HAVE_POLL */
{ {
gdb_notifier.select_timeout.tv_sec = timeout.tv_sec; gdb_notifier.select_timeout.tv_sec = timeout.tv_sec;
gdb_notifier.select_timeout.tv_usec = timeout.tv_usec; gdb_notifier.select_timeout.tv_usec = timeout.tv_usec;