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
This commit is contained in:
Alicia Boya García 2018-05-25 12:03:46 +02:00 committed by Thibault Saunier
parent bfa143caa9
commit 40dfb7174e

View file

@ -360,11 +360,22 @@ class Test(Loggable):
pass pass
def thread_wrapper(self): 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, self.process = subprocess.Popen(self.command,
stderr=self.out, stderr=self.out,
stdout=self.out, stdout=self.out,
env=self.proc_env, env=self.proc_env,
cwd=self.workdir) cwd=self.workdir,
preexec_fn=preexec_fn)
self.process.wait() self.process.wait()
if self.result is not Result.TIMEOUT: if self.result is not Result.TIMEOUT:
if self.process.returncode == 0: if self.process.returncode == 0:
@ -492,6 +503,11 @@ class Test(Loggable):
if self.options.gdb: if self.options.gdb:
self.command = self.use_gdb(self.command) 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: if self.options.valgrind:
self.command = self.use_valgrind(self.command, self.proc_env) self.command = self.use_valgrind(self.command, self.proc_env)
@ -533,6 +549,9 @@ class Test(Loggable):
self.thread.join() self.thread.join()
self.time_taken = time.time() - self._starting_time 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: if self.result != Result.PASSED:
message = str(self) message = str(self)
end = "\n" end = "\n"