* ser-mingw.c (fd_is_file): New function.
authorJerome Guitton <guitton@adacore.com>
Thu, 19 Apr 2007 13:04:30 +0000 (13:04 +0000)
committerJerome Guitton <guitton@adacore.com>
Thu, 19 Apr 2007 13:04:30 +0000 (13:04 +0000)
(file_select_thread): New function.
(ser_console_wait_handle): Add special handling for files.

gdb/ChangeLog
gdb/ser-mingw.c

index 8334b12ab4e94255ab07136dbb0f1b2ad233f40a..b2c35fe81ffa70e24fa5c7291b8f57659f8c8aab 100644 (file)
@@ -1,3 +1,9 @@
+2007-04-19  Jerome Guitton  <guitton@adacore.com>
+
+       * ser-mingw.c (fd_is_file): New function.
+       (file_select_thread): New function.
+       (ser_console_wait_handle): Add special handling for files.
+
 2007-04-18  Denis Pilat  <denis.pilat@st.com>
 
        * dwarf2read.c (read_subrange_type): Use DW_ATE_signed default type
index 074687df618c6a6187b10889aef2d42ee12bf7c0..dca3b9065979e4fdb96f63f10619f32cc17144c8 100644 (file)
@@ -453,6 +453,15 @@ fd_is_pipe (int fd)
     return 0;
 }
 
+static int
+fd_is_file (int fd)
+{
+  if (GetFileType ((HANDLE) _get_osfhandle (fd)) == FILE_TYPE_DISK)
+    return 1;
+  else
+    return 0;
+}
+
 static DWORD WINAPI
 pipe_select_thread (void *arg)
 {
@@ -501,6 +510,42 @@ pipe_select_thread (void *arg)
     }
 }
 
+static DWORD WINAPI
+file_select_thread (void *arg)
+{
+  struct serial *scb = arg;
+  struct ser_console_state *state;
+  int event_index;
+  HANDLE h;
+
+  state = scb->state;
+  h = (HANDLE) _get_osfhandle (scb->fd);
+
+  while (1)
+    {
+      HANDLE wait_events[2];
+      DWORD n_avail;
+
+      SetEvent (state->have_stopped);
+
+      wait_events[0] = state->start_select;
+      wait_events[1] = state->exit_select;
+
+      if (WaitForMultipleObjects (2, wait_events, FALSE, INFINITE) != WAIT_OBJECT_0)
+       return 0;
+
+      ResetEvent (state->have_stopped);
+
+      if (SetFilePointer (h, 0, NULL, FILE_CURRENT) == INVALID_SET_FILE_POINTER)
+       {
+         SetEvent (state->except_event);
+         continue;
+       }
+
+      SetEvent (state->read_event);
+    }
+}
+
 static void
 ser_console_wait_handle (struct serial *scb, HANDLE *read, HANDLE *except)
 {
@@ -512,7 +557,7 @@ ser_console_wait_handle (struct serial *scb, HANDLE *read, HANDLE *except)
       int is_tty;
 
       is_tty = isatty (scb->fd);
-      if (!is_tty && !fd_is_pipe (scb->fd))
+      if (!is_tty && !fd_is_file (scb->fd) && !fd_is_pipe (scb->fd))
        {
          *read = NULL;
          *except = NULL;
@@ -541,9 +586,12 @@ ser_console_wait_handle (struct serial *scb, HANDLE *read, HANDLE *except)
       if (is_tty)
        state->thread = CreateThread (NULL, 0, console_select_thread, scb, 0,
                                      &threadId);
-      else
+      else if (fd_is_pipe (scb->fd))
        state->thread = CreateThread (NULL, 0, pipe_select_thread, scb, 0,
                                      &threadId);
+      else
+       state->thread = CreateThread (NULL, 0, file_select_thread, scb, 0,
+                                     &threadId);
     }
 
   *read = state->read_event;