aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdbsupport/event-loop.cc88
1 files changed, 27 insertions, 61 deletions
diff --git a/gdbsupport/event-loop.cc b/gdbsupport/event-loop.cc
index 385b45b..18f57ef 100644
--- a/gdbsupport/event-loop.cc
+++ b/gdbsupport/event-loop.cc
@@ -78,14 +78,12 @@ struct file_handler
struct file_handler *next_file;
};
-/* Do we use poll or select ? */
#ifdef HAVE_POLL
-#define USE_POLL 1
-#else
-#define USE_POLL 0
-#endif /* HAVE_POLL */
-
-static unsigned char use_poll = USE_POLL;
+/* Do we use poll or select? Some systems have poll, but then it's
+ not useable with all kinds of files. We probe that whenever a new
+ file handler is added. */
+static bool use_poll = true;
+#endif
#ifdef USE_WIN32API
#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)
{
#ifdef HAVE_POLL
- struct pollfd fds;
-#endif
-
if (use_poll)
{
-#ifdef HAVE_POLL
+ struct pollfd fds;
+
/* Check to see if poll () is usable. If not, we'll switch to
use select. This can happen on systems like
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.events = POLLIN;
if (poll (&fds, 1, 0) == 1 && (fds.revents & POLLNVAL))
- use_poll = 0;
-#else
- internal_error (__FILE__, __LINE__,
- _("use_poll without HAVE_POLL"));
-#endif /* HAVE_POLL */
+ use_poll = false;
}
if (use_poll)
{
-#ifdef HAVE_POLL
create_file_handler (fd, POLLIN, proc, client_data, std::move (name),
is_ui);
-#else
- internal_error (__FILE__, __LINE__,
- _("use_poll without HAVE_POLL"));
-#endif
}
else
+#endif /* HAVE_POLL */
create_file_handler (fd, GDB_READABLE | GDB_EXCEPTION,
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;
gdb_notifier.first_file_handler = file_ptr;
+#ifdef HAVE_POLL
if (use_poll)
{
-#ifdef HAVE_POLL
gdb_notifier.num_fds++;
if (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)->events = mask;
(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
+#endif /* HAVE_POLL */
{
if (mask & GDB_READABLE)
FD_SET (fd, &gdb_notifier.check_masks[0]);
@@ -402,10 +387,6 @@ delete_file_handler (int fd)
{
file_handler *file_ptr, *prev_ptr = NULL;
int i;
-#ifdef HAVE_POLL
- int j;
- struct pollfd *new_poll_fds;
-#endif
/* Find the entry for the given file. */
@@ -419,9 +400,12 @@ delete_file_handler (int fd)
if (file_ptr == NULL)
return;
+#ifdef HAVE_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
but the one we want to get rid of. */
@@ -442,12 +426,9 @@ delete_file_handler (int fd)
xfree (gdb_notifier.poll_fds);
gdb_notifier.poll_fds = new_poll_fds;
gdb_notifier.num_fds--;
-#else
- internal_error (__FILE__, __LINE__,
- _("use_poll without HAVE_POLL"));
-#endif /* HAVE_POLL */
}
else
+#endif /* HAVE_POLL */
{
if (file_ptr->mask & GDB_READABLE)
FD_CLR (fd, &gdb_notifier.check_masks[0]);
@@ -510,9 +491,6 @@ static void
handle_file_event (file_handler *file_ptr, int ready_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
events (ready_mask). */
+#ifdef HAVE_POLL
if (use_poll)
{
-#ifdef HAVE_POLL
+ int error_mask;
+
/* POLLHUP means EOF, but can be combined with POLLIN to
signal more data to read. */
error_mask = POLLHUP | POLLERR | POLLNVAL;
@@ -547,12 +527,9 @@ handle_file_event (file_handler *file_ptr, int ready_mask)
}
else
file_ptr->error = 0;
-#else
- internal_error (__FILE__, __LINE__,
- _("use_poll without HAVE_POLL"));
-#endif /* HAVE_POLL */
}
else
+#endif /* HAVE_POLL */
{
if (ready_mask & GDB_EXCEPTION)
{
@@ -599,9 +576,9 @@ gdb_wait_for_event (int block)
if (block)
update_wait_timeout ();
+#ifdef HAVE_POLL
if (use_poll)
{
-#ifdef HAVE_POLL
int timeout;
if (block)
@@ -616,12 +593,9 @@ gdb_wait_for_event (int block)
signal. */
if (num_found == -1 && errno != EINTR)
perror_with_name (("poll"));
-#else
- internal_error (__FILE__, __LINE__,
- _("use_poll without HAVE_POLL"));
-#endif /* HAVE_POLL */
}
else
+#endif /* HAVE_POLL */
{
struct timeval select_timeout;
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
a round-robin-like fashion. The number and order of descriptors
may change between invocations, but this is good enough. */
+#ifdef HAVE_POLL
if (use_poll)
{
-#ifdef HAVE_POLL
int i;
int mask;
@@ -699,12 +673,9 @@ gdb_wait_for_event (int block)
mask = (gdb_notifier.poll_fds + i)->revents;
handle_file_event (file_ptr, mask);
return 1;
-#else
- internal_error (__FILE__, __LINE__,
- _("use_poll without HAVE_POLL"));
-#endif /* HAVE_POLL */
}
else
+#endif /* HAVE_POLL */
{
/* See comment about even source fairness above. */
int mask = 0;
@@ -856,16 +827,11 @@ update_wait_timeout (void)
}
/* Update the timeout for select/ poll. */
- if (use_poll)
- {
#ifdef HAVE_POLL
- gdb_notifier.poll_timeout = timeout.tv_sec * 1000;
-#else
- internal_error (__FILE__, __LINE__,
- _("use_poll without HAVE_POLL"));
-#endif /* HAVE_POLL */
- }
+ if (use_poll)
+ 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;