diff options
author | Jerome Guitton <guitton@adacore.com> | 2007-04-19 13:04:30 +0000 |
---|---|---|
committer | Jerome Guitton <guitton@adacore.com> | 2007-04-19 13:04:30 +0000 |
commit | 7e71daaa7bd7fa5a4735cd1366c8b43bfedc0b0d (patch) | |
tree | c9ea6fea926b0986ce70fb266bc56ca3b8e68239 /gdb/ser-mingw.c | |
parent | ec5fb24f940f412e437fe643470ef10c74a90bed (diff) | |
download | gdb-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.c | 52 |
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; |