*** empty log message ***
[deliverable/binutils-gdb.git] / gdb / event-loop.c
index 2f3d5359b79baa94fc2e30b3f11c9e1aea6b0f52..e9f171969974e0d429a68b236d8596f5e819cdd1 100644 (file)
@@ -1,12 +1,13 @@
 /* Event loop machinery for GDB, the GNU debugger.
-   Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2000, 2001, 2002, 2005, 2006, 2007
+   Free Software Foundation, Inc.
    Written by Elena Zannoni <ezannoni@cygnus.com> of Cygnus Solutions.
 
    This file is part of GDB.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -15,9 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA. */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>. */
 
 #include "defs.h"
 #include "event-loop.h"
@@ -37,6 +36,7 @@
 #include <sys/time.h>
 #include "exceptions.h"
 #include "gdb_assert.h"
+#include "gdb_select.h"
 
 typedef struct gdb_event gdb_event;
 typedef void (event_handler_func) (int);
@@ -731,84 +731,6 @@ handle_file_event (int event_file_desc)
     }
 }
 
-/* Wrapper for select.  This function is not yet exported from this
-   file because it is not sufficiently general.  For example,
-   ser-base.c uses select to check for socket activity, and this
-   function does not support sockets under Windows, so we do not want
-   to use gdb_select in ser-base.c.  */
-
-static int 
-gdb_select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
-           struct timeval *timeout)
-{
-#ifdef USE_WIN32API
-  HANDLE handles[MAXIMUM_WAIT_OBJECTS];
-  HANDLE h;
-  DWORD event;
-  DWORD num_handles;
-  int fd;
-  int num_ready;
-
-  num_handles = 0;
-  for (fd = 0; fd < n; ++fd)
-    {
-      /* EXCEPTFDS is silently ignored.  GDB always sets GDB_EXCEPTION
-        when calling add_file_handler, but there is no natural analog
-        under Windows.  */
-      /* There is no support yet for WRITEFDS.  At present, this isn't
-        used by GDB -- but we do not want to silently ignore WRITEFDS
-        if something starts using it.  */
-      gdb_assert (!FD_ISSET (fd, writefds));
-      if (FD_ISSET (fd, readfds))
-       {
-         gdb_assert (num_handles < MAXIMUM_WAIT_OBJECTS);
-         handles[num_handles++] = (HANDLE) _get_osfhandle (fd);
-       }
-    }
-  event = WaitForMultipleObjects (num_handles,
-                                 handles,
-                                 FALSE,
-                                 timeout 
-                                 ? (timeout->tv_sec * 1000 + timeout->tv_usec)
-                                 : INFINITE);
-  /* EVENT can only be a value in the WAIT_ABANDONED_0 range if the
-     HANDLES included an abandoned mutex.  Since GDB doesn't use
-     mutexes, that should never occur.  */
-  gdb_assert (!(WAIT_ABANDONED_0 <= event
-               && event < WAIT_ABANDONED_0 + num_handles));
-  if (event == WAIT_FAILED)
-    return -1;
-  if (event == WAIT_TIMEOUT)
-    return 0;
-  /* Run through the READFDS, clearing bits corresponding to descriptors
-     for which input is unavailable.  */
-  num_ready = num_handles; 
-  h = handles[event - WAIT_OBJECT_0];
-  for (fd = 0; fd < n; ++fd)
-    {
-      HANDLE fd_h;
-      if (!FD_ISSET (fd, readfds))
-       continue;
-      fd_h = (HANDLE) _get_osfhandle (fd);
-      /* This handle might be ready, even though it wasn't the handle
-        returned by WaitForMultipleObjects.  */
-      if (fd_h != h && WaitForSingleObject (fd_h, 0) != WAIT_OBJECT_0)
-       {
-         FD_CLR (fd, readfds);
-         --num_ready;
-       }
-    }
-  /* We never report any descriptors available for writing or with
-     exceptional conditions.  */ 
-  FD_ZERO (writefds);
-  FD_ZERO (exceptfds);
-
-  return num_ready;
-#else
-  return select (n, readfds, writefds, exceptfds, timeout);
-#endif
-}
-
 /* Called by gdb_do_one_event to wait for new events on the 
    monitored file descriptors. Queue file events as they are 
    detected by the poll. 
@@ -901,9 +823,8 @@ gdb_wait_for_event (void)
                  file_event_ptr = create_file_event (file_ptr->fd);
                  async_queue_event (file_event_ptr, TAIL);
                }
+             file_ptr->ready_mask = (gdb_notifier.poll_fds + i)->revents;
            }
-
-         file_ptr->ready_mask = (gdb_notifier.poll_fds + i)->revents;
        }
 #else
       internal_error (__FILE__, __LINE__,
@@ -1027,7 +948,7 @@ delete_async_signal_handler (async_signal_handler ** async_handler_ptr)
   else
     {
       prev_ptr = sighandler_list.first_handler;
-      while (prev_ptr->next_handler != (*async_handler_ptr) && prev_ptr)
+      while (prev_ptr && prev_ptr->next_handler != (*async_handler_ptr))
        prev_ptr = prev_ptr->next_handler;
       prev_ptr->next_handler = (*async_handler_ptr)->next_handler;
       if (sighandler_list.last_handler == (*async_handler_ptr))
This page took 0.025689 seconds and 4 git commands to generate.