aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEduardo Habkost <ehabkost@redhat.com>2013-01-28 16:15:16 -0200
committerAnthony Liguori <aliguori@us.ibm.com>2013-02-01 10:43:34 -0600
commit6bf0076643dac4f37cabb9233dc9170f1c2fdd49 (patch)
treef95b26883084a5c60bc2730f40b1761834b47855
parent3e7b8f4e6f507e09e27b7449f3744596f19c0083 (diff)
libqtest: Wait for the right child PID after killing QEMU
When running "make check" with gcov enabled, we get the following message: hw/tmp105.gcda:cannot open data file, assuming not executed The problem happens because: * tmp105-test exits before QEMU exits, because waitpid() at qtest_quit() fails; * waitpid() fails because there's another process already waiting for the QEMU process; * The process that is already waiting for QEMU is the child created by qtest_init() to run system(); * qtest_quit() is incorrectly waiting for the QEMU PID directly instead of the child created by qtest_init(). This fixes the problem by sending SIGTERM to QEMU, but waiting for the child process created by qtest_init() (that exits immediately after QEMU exits). Reported-by: Andreas Färber <afaerber@suse.de> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
-rw-r--r--tests/libqtest.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/tests/libqtest.c b/tests/libqtest.c
index 913fa0535c..762dec4ac0 100644
--- a/tests/libqtest.c
+++ b/tests/libqtest.c
@@ -39,7 +39,8 @@ struct QTestState
int qmp_fd;
bool irq_level[MAX_IRQ];
GString *rx;
- gchar *pid_file;
+ gchar *pid_file; /* QEMU PID file */
+ int child_pid; /* Child process created to execute QEMU */
char *socket_path, *qmp_socket_path;
};
@@ -144,6 +145,7 @@ QTestState *qtest_init(const char *extra_args)
s->rx = g_string_new("");
s->pid_file = pid_file;
+ s->child_pid = pid;
for (i = 0; i < MAX_IRQ; i++) {
s->irq_level[i] = false;
}
@@ -165,8 +167,9 @@ void qtest_quit(QTestState *s)
pid_t pid = qtest_qemu_pid(s);
if (pid != -1) {
+ /* kill QEMU, but wait for the child created by us to run system() */
kill(pid, SIGTERM);
- waitpid(pid, &status, 0);
+ waitpid(s->child_pid, &status, 0);
}
unlink(s->pid_file);