From 21b3bc779ca64a3b1d39886a74f0304c8dc96368 Mon Sep 17 00:00:00 2001 From: Keith Seitz Date: Sun, 24 May 1998 21:05:12 +0000 Subject: [PATCH] * ser-unix.c (wait_for): Do not reset timeout_remaining for cygwin32 so that we can use this member to track real timeouts. (hardwire_readchar): Modify for cygwin32 so that we only ever use a real system timeout of one second. Track the "real" timeout as a series of th ese one second timeouts. Call ui_loop_hook to keep the gui alive. * top.c: Define new hook for cygwin32, "ui_loop_hook". * gdbtk.c (gdbtk_init): Add ui_loop_hook for CygWin32 to work around update problems. --- gdb/ChangeLog-gdbtk | 14 ++++++++++++++ gdb/gdbtk.c | 13 +++++++++++++ gdb/ser-unix.c | 29 ++++++++++++++++++++++++++--- gdb/top.c | 3 +++ 4 files changed, 56 insertions(+), 3 deletions(-) diff --git a/gdb/ChangeLog-gdbtk b/gdb/ChangeLog-gdbtk index 1113816cb2..0833e5442f 100644 --- a/gdb/ChangeLog-gdbtk +++ b/gdb/ChangeLog-gdbtk @@ -1,3 +1,17 @@ +Sun May 24 14:00:24 1998 Keith Seitz + + * ser-unix.c (wait_for): Do not reset timeout_remaining for cygwin32 so that + we can use this member to track real timeouts. + (hardwire_readchar): Modify for cygwin32 so that we only ever use a real + system timeout of one second. Track the "real" timeout as a series of these + one second timeouts. + Call ui_loop_hook to keep the gui alive. + + * top.c: Define new hook for cygwin32, "ui_loop_hook". + + * gdbtk.c (gdbtk_init): Add ui_loop_hook for CygWin32 to work around + update problems. + Thu May 21 13:56:24 1998 Elena Zannoni * gdbtk.c: reinserted the changes that were accidentally deleted: diff --git a/gdb/gdbtk.c b/gdb/gdbtk.c index 6027cdbec3..4ca7a63b5a 100644 --- a/gdb/gdbtk.c +++ b/gdb/gdbtk.c @@ -91,6 +91,10 @@ int (*ui_load_progress_hook) PARAMS ((char *, unsigned long)); void (*pre_add_symbol_hook) PARAMS ((char *)); void (*post_add_symbol_hook) PARAMS ((void)); +#ifdef __CYGWIN32__ +extern void (*ui_loop_hook) PARAMS ((int)); +#endif + char * get_prompt PARAMS ((void)); static void null_routine PARAMS ((int)); @@ -1895,6 +1899,12 @@ x_event (signo) in_x_event = 1; +#ifdef __CYGWIN32__ + if (signo == -2) + if (gdbtk_timer_going) + gdbtk_stop_timer (); +#endif + /* Process pending events */ while (Tcl_DoOneEvent (TCL_DONT_WAIT|TCL_ALL_EVENTS) != 0) ; @@ -2305,6 +2315,9 @@ gdbtk_init ( argv0 ) readline_hook = gdbtk_readline; readline_end_hook = gdbtk_readline_end; ui_load_progress_hook = gdbtk_load_hash; +#ifdef __CYGWIN32__ + ui_loop_hook = x_event; +#endif pre_add_symbol_hook = gdbtk_pre_add_symbol; post_add_symbol_hook = gdbtk_post_add_symbol; create_tracepoint_hook = gdbtk_create_tracepoint; diff --git a/gdb/ser-unix.c b/gdb/ser-unix.c index c365434bc2..81374eaf37 100644 --- a/gdb/ser-unix.c +++ b/gdb/ser-unix.c @@ -83,6 +83,10 @@ static int hardwire_flush_input PARAMS ((serial_t)); static int hardwire_send_break PARAMS ((serial_t)); static int hardwire_setstopbits PARAMS ((serial_t, int)); +#ifdef __CYGWIN32__ +extern void ui_loop_hook PARAMS ((int)); +#endif + /* Open up a real live device for serial I/O */ static int @@ -430,7 +434,9 @@ wait_for(scb, timeout) serial_t scb; int timeout; { +#ifndef __CYGWIN32__ scb->timeout_remaining = 0; +#endif #ifdef HAVE_SGTTY { @@ -539,21 +545,34 @@ wait_for(scb, timeout) to wait, or -1 to wait forever. Use timeout of 0 to effect a poll. Returns char if successful. Returns SERIAL_TIMEOUT if timeout expired, EOF if line dropped dead, or SERIAL_ERROR for any other error (see errno in that case). */ - static int hardwire_readchar(scb, timeout) serial_t scb; int timeout; { - int status; + int status, t; if (scb->bufcnt-- > 0) return *scb->bufp++; +#ifdef __CYGWIN32__ + if (timeout > 0) + timeout++; +#endif + while (1) { +#ifdef __CYGWIN32__ + t = timeout == 0 ? 0 : 1; + scb->timeout_remaining = timeout < 0 ? timeout : timeout - t; + status = wait_for (scb, t); + + /* -2 means disable timer */ + if (ui_loop_hook) + ui_loop_hook (-2); +#else status = wait_for (scb, timeout); - +#endif if (status < 0) return status; @@ -570,6 +589,10 @@ hardwire_readchar(scb, timeout) timeout = scb->timeout_remaining; continue; } +#ifdef __CYGWIN32__ + else if (scb->timeout_remaining < 0) + continue; +#endif else return SERIAL_TIMEOUT; } diff --git a/gdb/top.c b/gdb/top.c index 248a44df63..b9d759b3e0 100644 --- a/gdb/top.c +++ b/gdb/top.c @@ -379,6 +379,9 @@ static void stop_sig PARAMS ((int)); command file. */ void (*init_ui_hook) PARAMS ((char *argv0)); +#ifdef __CYGWIN32__ +void (*ui_loop_hook) PARAMS ((int)); +#endif /* Called instead of command_loop at top level. Can be invoked via return_to_top_level. */ -- 2.34.1