mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-23 18:14:13 +08:00
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:
parent
e90601a4f1
commit
36a5b37053
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user