aboutsummaryrefslogtreecommitdiff
path: root/gdb/ser-mingw.c
diff options
context:
space:
mode:
authorJerome Guitton <guitton@adacore.com>2007-04-19 13:04:30 +0000
committerJerome Guitton <guitton@adacore.com>2007-04-19 13:04:30 +0000
commit7e71daaa7bd7fa5a4735cd1366c8b43bfedc0b0d (patch)
treec9ea6fea926b0986ce70fb266bc56ca3b8e68239 /gdb/ser-mingw.c
parentec5fb24f940f412e437fe643470ef10c74a90bed (diff)
downloadgdb-7e71daaa7bd7fa5a4735cd1366c8b43bfedc0b0d.zip
gdb-7e71daaa7bd7fa5a4735cd1366c8b43bfedc0b0d.tar.gz
gdb-7e71daaa7bd7fa5a4735cd1366c8b43bfedc0b0d.tar.bz2
* ser-mingw.c (fd_is_file): New function.
(file_select_thread): New function. (ser_console_wait_handle): Add special handling for files.
Diffstat (limited to 'gdb/ser-mingw.c')
-rw-r--r--gdb/ser-mingw.c52
1 files changed, 50 insertions, 2 deletions
diff --git a/gdb/ser-mingw.c b/gdb/ser-mingw.c
index 074687d..dca3b90 100644
--- a/gdb/ser-mingw.c
+++ b/gdb/ser-mingw.c
@@ -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;