aboutsummaryrefslogtreecommitdiff
path: root/gdb/ser-unix.c
diff options
context:
space:
mode:
authorAlan Hayward <alan.hayward@arm.com>2019-05-28 10:07:54 +0100
committerAlan Hayward <alan.hayward@arm.com>2019-05-28 10:07:54 +0100
commit766f883622ef008230250aa5aecef9fb9b29f233 (patch)
treee1302190a7dc0b839e38d03dfbc192af18701dd6 /gdb/ser-unix.c
parent0f4a61b42002f568473f821f00dd240413beadd0 (diff)
downloadgdb-766f883622ef008230250aa5aecef9fb9b29f233.zip
gdb-766f883622ef008230250aa5aecef9fb9b29f233.tar.gz
gdb-766f883622ef008230250aa5aecef9fb9b29f233.tar.bz2
Suppress SIGTTOU when handling errors
Calls to error () can cause SIGTTOU to send gdb to the background. For example, on an Arm build: (gdb) b main Breakpoint 1 at 0x10774: file /build/gdb/testsuite/../../../src/binutils-gdb/gdb/testsuite/gdb.base/watchpoint.c, line 174. (gdb) r Starting program: /build/gdb/testsuite/outputs/gdb.base/watchpoint/watchpoint [1]+ Stopped ../gdb ./outputs/gdb.base/watchpoint/watchpoint localhost$ fg ../gdb ./outputs/gdb.base/watchpoint/watchpoint Cannot parse expression `.L1199 4@r4'. warning: Probes-based dynamic linker interface failed. Reverting to original interface. The SIGTTOU is raised whilst inside a syscall during the call to tcdrain. Fix is to use scoped_ignore_sigttou to ensure SIGTTOU is blocked. In addition fix include comments - job_control is not included via terminal.h gdb/ChangeLog: * event-top.c: Remove include comment. * inflow.c (class scoped_ignore_sigttou): Move from here... * inflow.h (class scoped_ignore_sigttou): ...to here. * ser-unix.c (hardwire_drain_output): Block SIGTTOU during drain. * top.c: Remove include comment.
Diffstat (limited to 'gdb/ser-unix.c')
-rw-r--r--gdb/ser-unix.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/gdb/ser-unix.c b/gdb/ser-unix.c
index 5a9965b..3492619 100644
--- a/gdb/ser-unix.c
+++ b/gdb/ser-unix.c
@@ -32,6 +32,7 @@
#include "gdbcmd.h"
#include "common/filestuff.h"
#include <termios.h>
+#include "inflow.h"
struct hardwire_ttystate
{
@@ -164,6 +165,9 @@ hardwire_print_tty_state (struct serial *scb,
static int
hardwire_drain_output (struct serial *scb)
{
+ /* Ignore SIGTTOU which may occur during the drain. */
+ scoped_ignore_sigttou ignore_sigttou;
+
return tcdrain (scb->fd);
}