From c889972e7aa3342b68fe1005dd6954a19a0918e4 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Mon, 28 Mar 2005 19:10:24 +0000 Subject: * gdb/configure.ac: No tgetent on MinGW. * gdb/event-loop.c (struct gdb_notifier): Add "handles" for Windows. (create_file_handler): On Windows, update handles, rather than check_masks and ready_masks. (delete_file_handler): Likewise. (gdb_wait_for_event): Use WaitForMultipleObjects, not select, on Windows. * gdb/event-top.c (gdb_setup_readline): Put console into character-at-a-time mode under Windows. --- ChangeLog.csl | 12 ++++++++++++ gdb/configure | 2 +- gdb/configure.ac | 2 +- gdb/event-loop.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- gdb/event-top.c | 19 +++++++++++++++++++ 5 files changed, 89 insertions(+), 3 deletions(-) diff --git a/ChangeLog.csl b/ChangeLog.csl index 21998566df0..cc0d3ef9d6c 100644 --- a/ChangeLog.csl +++ b/ChangeLog.csl @@ -1,3 +1,15 @@ +2005-03-28 Mark Mitchell + + * gdb/configure.ac: No tgetent on MinGW. + * gdb/event-loop.c (struct gdb_notifier): Add "handles" for Windows. + (create_file_handler): On Windows, update handles, rather than + check_masks and ready_masks. + (delete_file_handler): Likewise. + (gdb_wait_for_event): Use WaitForMultipleObjects, not select, on + Windows. + * gdb/event-top.c (gdb_setup_readline): Put console into + character-at-a-time mode under Windows. + 2005-03-25 Mark Mitchell * gdb/configure.ac: Link with -lws2_32 on mingw. diff --git a/gdb/configure b/gdb/configure index fa00f773099..e8e370014e2 100755 --- a/gdb/configure +++ b/gdb/configure @@ -8189,7 +8189,7 @@ case $host_os in LIBS="../libtermcap/libtermcap.a $LIBS" ac_cv_search_tgetent="../libtermcap/libtermcap.a" fi ;; - go32* | *djgpp*) + go32* | *djgpp* | *mingw32* ) ac_cv_search_tgetent="none required" ;; esac diff --git a/gdb/configure.ac b/gdb/configure.ac index 146f0e880c8..7b2883f633d 100644 --- a/gdb/configure.ac +++ b/gdb/configure.ac @@ -329,7 +329,7 @@ case $host_os in LIBS="../libtermcap/libtermcap.a $LIBS" ac_cv_search_tgetent="../libtermcap/libtermcap.a" fi ;; - go32* | *djgpp*) + go32* | *djgpp* | *mingw32* ) ac_cv_search_tgetent="none required" ;; esac diff --git a/gdb/event-loop.c b/gdb/event-loop.c index e4b09f42faa..46112f660b1 100644 --- a/gdb/event-loop.c +++ b/gdb/event-loop.c @@ -133,6 +133,11 @@ event_queue; static unsigned char use_poll = USE_POLL; +#ifdef WINAPI +#include +#include +#endif + static struct { /* Ptr to head of file handler list. */ @@ -146,15 +151,19 @@ static struct int poll_timeout; #endif +#ifdef WINAPI + HANDLE handles[MAXIMUM_WAIT_OBJECTS]; +#else /* Masks to be used in the next call to select. Bits are set in response to calls to create_file_handler. */ fd_set check_masks[3]; /* What file descriptors were found ready by select. */ fd_set ready_masks[3]; - +#endif /* Number of file descriptors to monitor. (for poll) */ /* Number of valid bits (highest fd value + 1). (for select) */ + /* Number of handles (for Windows). */ int num_fds; /* Time structure for calls to select(). */ @@ -524,6 +533,10 @@ create_file_handler (int fd, int mask, handler_func * proc, gdb_client_data clie } else { +#ifdef WINAPI + gdb_notifier.handles[gdb_notifier.num_fds++] + = (HANDLE) _get_osfhandle (fd); +#else if (mask & GDB_READABLE) FD_SET (fd, &gdb_notifier.check_masks[0]); else @@ -541,6 +554,7 @@ create_file_handler (int fd, int mask, handler_func * proc, gdb_client_data clie if (gdb_notifier.num_fds <= fd) gdb_notifier.num_fds = fd + 1; +#endif } } @@ -602,6 +616,16 @@ delete_file_handler (int fd) } else { +#ifdef WINAPI + HANDLE h = (HANDLE) _get_osfhandle (fd); + for (i = 0; i < gdb_notifier.num_fds; ++i) + if (gdb_notifier.handles[i] == h) + { + gdb_notifier.handles[i] = + gdb_notifier.handles[gdb_notifier.num_fds--]; + break; + } +#else if (file_ptr->mask & GDB_READABLE) FD_CLR (fd, &gdb_notifier.check_masks[0]); if (file_ptr->mask & GDB_WRITABLE) @@ -623,6 +647,7 @@ delete_file_handler (int fd) } gdb_notifier.num_fds = i; } +#endif } /* Deactivate the file descriptor, by clearing its mask, @@ -737,7 +762,11 @@ gdb_wait_for_event (void) { file_handler *file_ptr; gdb_event *file_event_ptr; +#ifdef WINAPI + DWORD event = 0; +#else int num_found = 0; +#endif int i; /* Make sure all output is done before getting another event. */ @@ -766,6 +795,16 @@ gdb_wait_for_event (void) } else { +#ifdef WINAPI + event + = WaitForMultipleObjects(gdb_notifier.num_fds, + gdb_notifier.handles, + FALSE, + gdb_notifier.timeout_valid + ? (gdb_notifier.select_timeout.tv_sec * 1000 + + gdb_notifier.select_timeout.tv_usec) + : INFINITE); +#else gdb_notifier.ready_masks[0] = gdb_notifier.check_masks[0]; gdb_notifier.ready_masks[1] = gdb_notifier.check_masks[1]; gdb_notifier.ready_masks[2] = gdb_notifier.check_masks[2]; @@ -786,6 +825,7 @@ gdb_wait_for_event (void) if (errno != EINTR) perror_with_name (("select")); } +#endif } /* Enqueue all detected file events. */ @@ -828,6 +868,20 @@ gdb_wait_for_event (void) } else { +#ifdef WINAPI + HANDLE h; + + h = gdb_notifier.handles[event - WAIT_OBJECT_0]; + file_ptr = gdb_notifier.first_file_handler; + while ((HANDLE) _get_osfhandle (file_ptr->fd) != h) + file_ptr = file_ptr->next_file; + if (file_ptr->ready_mask == 0) + { + file_event_ptr = create_file_event (file_ptr->fd); + async_queue_event (file_event_ptr, TAIL); + } + file_ptr->ready_mask = GDB_READABLE; +#else for (file_ptr = gdb_notifier.first_file_handler; (file_ptr != NULL) && (num_found > 0); file_ptr = file_ptr->next_file) @@ -856,6 +910,7 @@ gdb_wait_for_event (void) } file_ptr->ready_mask = mask; } +#endif } return 0; } diff --git a/gdb/event-top.c b/gdb/event-top.c index 4614d4d2f4c..f65c98b9572 100644 --- a/gdb/event-top.c +++ b/gdb/event-top.c @@ -40,6 +40,11 @@ #include "readline/readline.h" #include "readline/history.h" +#ifdef __MINGW32__ +#include +#include +#endif + /* readline defines this. */ #undef savestring @@ -1128,6 +1133,20 @@ gdb_setup_readline (void) /* When a character is detected on instream by select or poll, readline will be invoked via this callback function. */ call_readline = rl_callback_read_char_wrapper; +#ifdef WINAPI + /* Set the console to character-at-a-time (as opposed to + line-at-a-time) mode. Otherwise, we will get only a single + keyboard event for the entire line, and readline will not + see each character as it arrives. */ + { + DWORD mode; + HANDLE console_handle; + console_handle = (HANDLE) _get_osfhandle (fileno (instream)); + GetConsoleMode(console_handle, &mode); + mode &= ~ENABLE_LINE_INPUT; + SetConsoleMode(console_handle, mode); + } +#endif } else { -- cgit v1.2.1