From 40dfb7174e329be12dea5a57301db0538ca9933b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alicia=20Boya=20Garc=C3=ADa?= Date: Fri, 25 May 2018 12:03:46 +0200 Subject: [PATCH] gst-validate-launcher: let gdb handle SIGINT itself Otherwise both gdb and gst-validate-launcher will react to ^C at the same time, gdb will be killed by SIGHUP (because gst-validate-launcher quitted in consequence of the ^C) and the terminal state will be left garbled because readline inside gdb had disabled echo. https://bugzilla.gnome.org/show_bug.cgi?id=796396 --- validate/launcher/baseclasses.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/validate/launcher/baseclasses.py b/validate/launcher/baseclasses.py index bac3336374..41f66ada70 100644 --- a/validate/launcher/baseclasses.py +++ b/validate/launcher/baseclasses.py @@ -360,11 +360,22 @@ class Test(Loggable): pass def thread_wrapper(self): + def enable_sigint(): + # Restore the SIGINT handler for the child process (gdb) to ensure + # it can handle it. + signal.signal(signal.SIGINT, signal.SIG_DFL) + + if self.options.gdb and os.name != "nt": + preexec_fn = enable_sigint + else: + preexec_fn = None + self.process = subprocess.Popen(self.command, stderr=self.out, stdout=self.out, env=self.proc_env, - cwd=self.workdir) + cwd=self.workdir, + preexec_fn=preexec_fn) self.process.wait() if self.result is not Result.TIMEOUT: if self.process.returncode == 0: @@ -492,6 +503,11 @@ class Test(Loggable): if self.options.gdb: self.command = self.use_gdb(self.command) + + self.previous_sigint_handler = signal.getsignal(signal.SIGINT) + # Make the gst-validate executable ignore SIGINT while gdb is running. + signal.signal(signal.SIGINT, signal.SIG_IGN) + if self.options.valgrind: self.command = self.use_valgrind(self.command, self.proc_env) @@ -533,6 +549,9 @@ class Test(Loggable): self.thread.join() self.time_taken = time.time() - self._starting_time + if self.options.gdb: + signal.signal(signal.SIGINT, self.previous_sigint_handler) + if self.result != Result.PASSED: message = str(self) end = "\n"