qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH for-1.4] libqtest: Wait for the right child PID


From: Andreas Färber
Subject: Re: [Qemu-devel] [PATCH for-1.4] libqtest: Wait for the right child PID after killing QEMU
Date: Wed, 30 Jan 2013 01:42:17 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130105 Thunderbird/17.0.2

Am 28.01.2013 19:15, schrieb Eduardo Habkost:
> 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 <address@hidden>
> Signed-off-by: Eduardo Habkost <address@hidden>

Thanks. Still need to test this...

Anthony, might this by any chance fix your sparc 100% CPU issue?

Andreas

> ---
>  tests/libqtest.c | 7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/tests/libqtest.c b/tests/libqtest.c
> index 913fa05..762dec4 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);
> 


-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg



reply via email to

[Prev in Thread] Current Thread [Next in Thread]