mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-21 04:42:53 +08:00
c88afe9cf5
As Hannes pointed out, the Windows target-async patches broke C-c handling there. Looking into this, I found a few oddities, fixed here. First, windows_nat_target::interrupt calls GenerateConsoleCtrlEvent. I think this event can be ignored by the inferior, so it's not a great way to interrupt. Instead, using DebugBreakProcess (or a more complicated thing for Wow64) seems better. Second, windows_nat_target did not implement the pass_ctrlc method. Implementing this lets us remove the special code to call SetConsoleCtrlHandler and instead integrate into gdb's approach to C-c handling. I believe that this should also fix the race that's described in the comment that's being removed. Initially, I thought a simpler version of this patch would work. However, I think what happens is that some other library (I'm not sure what) calls SetConsoleCtrlHandler while gdb is running, and this intercepts and handles C-c -- so that the gdb SIGINT handler is not called. C-break continues to work, presumably because whatever handler is installed ignores it. This patch works around this issue by ensuring that the gdb handler always comes first.
83 lines
2.2 KiB
C
83 lines
2.2 KiB
C
/* Host support routines for MinGW, for GDB, the GNU debugger.
|
|
|
|
Copyright (C) 2006-2022 Free Software Foundation, Inc.
|
|
|
|
This file is part of GDB.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
#include "defs.h"
|
|
#include "gdbsupport/event-loop.h"
|
|
#include "gdbsupport/gdb_select.h"
|
|
#include "inferior.h"
|
|
#include <signal.h>
|
|
|
|
/* Wrapper for select. Nothing special needed on POSIX platforms. */
|
|
|
|
int
|
|
gdb_select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
|
|
struct timeval *timeout)
|
|
{
|
|
return select (n, readfds, writefds, exceptfds, timeout);
|
|
}
|
|
|
|
/* Host-dependent console fputs method. POSIX platforms always return
|
|
zero, to use the default C 'fputs'. */
|
|
int
|
|
gdb_console_fputs (const char *buf, FILE *f)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
/* See inferior.h. */
|
|
|
|
tribool
|
|
sharing_input_terminal (int pid)
|
|
{
|
|
/* Using host-dependent code here is fine, because the
|
|
child_terminal_foo functions are meant to be used by child/native
|
|
targets. */
|
|
#if defined (__linux__) || defined (__sun__)
|
|
char buf[100];
|
|
|
|
xsnprintf (buf, sizeof (buf), "/proc/%d/fd/0", pid);
|
|
return is_gdb_terminal (buf);
|
|
#else
|
|
return TRIBOOL_UNKNOWN;
|
|
#endif
|
|
}
|
|
|
|
/* Current C-c handler. */
|
|
static c_c_handler_ftype *current_handler;
|
|
|
|
/* A wrapper that reinstalls the current signal handler. */
|
|
static void
|
|
handler_wrapper (int num)
|
|
{
|
|
signal (num, handler_wrapper);
|
|
if (current_handler != SIG_IGN)
|
|
current_handler (num);
|
|
}
|
|
|
|
/* See inferior.h. */
|
|
|
|
c_c_handler_ftype *
|
|
install_sigint_handler (c_c_handler_ftype *fn)
|
|
{
|
|
signal (SIGINT, handler_wrapper);
|
|
c_c_handler_ftype *result = current_handler;
|
|
current_handler = fn;
|
|
return result;
|
|
}
|