From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51371) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WUjUH-0006tW-AV for qemu-devel@nongnu.org; Mon, 31 Mar 2014 17:11:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WUjU5-0006EN-9H for qemu-devel@nongnu.org; Mon, 31 Mar 2014 17:11:21 -0400 Received: from cantor2.suse.de ([195.135.220.15]:49305 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WUjU5-0006Du-2c for qemu-devel@nongnu.org; Mon, 31 Mar 2014 17:11:09 -0400 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Mon, 31 Mar 2014 23:10:48 +0200 Message-Id: <1396300262-10430-3-git-send-email-afaerber@suse.de> In-Reply-To: <1396300262-10430-1-git-send-email-afaerber@suse.de> References: <1396300262-10430-1-git-send-email-afaerber@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PULL for-2.0 02/16] qtest: Keep list of qtest instances for SIGABRT handler List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Andreas=20F=C3=A4rber?= , Stefan Hajnoczi From: Stefan Hajnoczi Keep track of active qtest instances so we can kill them when the test aborts. This ensures no QEMU processes are left running after test failure. Signed-off-by: Stefan Hajnoczi Reviewed-by: Marcel Apfelbaum Signed-off-by: Andreas F=C3=A4rber --- tests/libqtest.c | 47 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/tests/libqtest.c b/tests/libqtest.c index 2b90e4a..d9e3a33 100644 --- a/tests/libqtest.c +++ b/tests/libqtest.c @@ -48,6 +48,9 @@ struct QTestState struct sigaction sigact_old; /* restored on exit */ }; =20 +static GList *qtest_instances; +static struct sigaction sigact_old; + #define g_assert_no_errno(ret) do { \ g_assert_cmpint(ret, !=3D, -1); \ } while (0) @@ -104,7 +107,28 @@ static void kill_qemu(QTestState *s) =20 static void sigabrt_handler(int signo) { - kill_qemu(global_qtest); + GList *elem; + for (elem =3D qtest_instances; elem; elem =3D elem->next) { + kill_qemu(elem->data); + } +} + +static void setup_sigabrt_handler(void) +{ + struct sigaction sigact; + + /* Catch SIGABRT to clean up on g_assert() failure */ + sigact =3D (struct sigaction){ + .sa_handler =3D sigabrt_handler, + .sa_flags =3D SA_RESETHAND, + }; + sigemptyset(&sigact.sa_mask); + sigaction(SIGABRT, &sigact, &sigact_old); +} + +static void cleanup_sigabrt_handler(void) +{ + sigaction(SIGABRT, &sigact_old, NULL); } =20 QTestState *qtest_init(const char *extra_args) @@ -115,7 +139,6 @@ QTestState *qtest_init(const char *extra_args) gchar *qmp_socket_path; gchar *command; const char *qemu_binary; - struct sigaction sigact; =20 qemu_binary =3D getenv("QTEST_QEMU_BINARY"); g_assert(qemu_binary !=3D NULL); @@ -128,13 +151,12 @@ QTestState *qtest_init(const char *extra_args) sock =3D init_socket(socket_path); qmpsock =3D init_socket(qmp_socket_path); =20 - /* Catch SIGABRT to clean up on g_assert() failure */ - sigact =3D (struct sigaction){ - .sa_handler =3D sigabrt_handler, - .sa_flags =3D SA_RESETHAND, - }; - sigemptyset(&sigact.sa_mask); - sigaction(SIGABRT, &sigact, &s->sigact_old); + /* Only install SIGABRT handler once */ + if (!qtest_instances) { + setup_sigabrt_handler(); + } + + qtest_instances =3D g_list_prepend(qtest_instances, s); =20 s->qemu_pid =3D fork(); if (s->qemu_pid =3D=3D 0) { @@ -180,7 +202,12 @@ QTestState *qtest_init(const char *extra_args) =20 void qtest_quit(QTestState *s) { - sigaction(SIGABRT, &s->sigact_old, NULL); + /* Uninstall SIGABRT handler on last instance */ + if (qtest_instances && !qtest_instances->next) { + cleanup_sigabrt_handler(); + } + + qtest_instances =3D g_list_remove(qtest_instances, s); =20 kill_qemu(s); close(s->fd); --=20 1.8.4.5