Re: [RFC] control-c handling on Windows...

Joel Brobecker
2008-05-20T18:38:44Z

[-- Attachment #1: Type: text/plain, Size: 450 bytes --]

Hi Chris,

> Checking this in is ok with me but it would be nice to consider a better
> solution eventually. Could you put a note to that effect in the patch

Attached is the patch that I ended up checking in. Let me know if you'd
like me to make some adjustments to the comment...

2008-05-20 Joel Brobecker <brobecker@adacore.com>

* win32-nat.c (win32_wait): Block the control-c event while
waiting for a debug event.

--
Joel

[-- Attachment #2: win32-nat.c.diff --]
[-- Type: text/plain, Size: 1598 bytes --]

Index: win32-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/win32-nat.c,v
retrieving revision 1.151
diff -u -p -r1.151 win32-nat.c
--- win32-nat.c 11 Mar 2008 05:21:38 -0000 1.151
+++ win32-nat.c 20 May 2008 18:33:29 -0000
@@ -1458,7 +1458,25 @@ win32_wait (ptid_t ptid, struct target_w

while (1)
{
- int retval = get_win32_debug_event (pid, ourstatus);
+ int retval;
+
+ /* Ignore CTRL+C signals while waiting for a debug event.
+ FIXME: brobecker/2008-05-20: When the user presses CTRL+C while
+ the inferior is running, both the inferior and GDB receive the
+ associated signal. If the inferior receives the signal first
+ and the delay until GDB receives that signal is sufficiently long,
+ GDB can sometimes receive the SIGINT after we have unblocked
+ the CTRL+C handler. This would lead to the debugger to stop
+ prematurely while handling the new-thread event that comes
+ with the handling of the SIGINT inside the inferior, and then
+ stop again immediately when the user tries to resume the execution
+ in the inferior. This is a classic race, and it would be nice
+ to find a better solution to that problem. But in the meantime,
+ the current approach already greatly mitigate this issue. */
+ SetConsoleCtrlHandler (NULL, TRUE);
+ retval = get_win32_debug_event (pid, ourstatus);
+ SetConsoleCtrlHandler (NULL, FALSE);
+
if (retval)
return pid_to_ptid (retval);
else