diff options
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/ser-mingw.c | 52 |
2 files changed, 56 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 8334b12..b2c35fe 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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 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; |