qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] Re: [PATCH] Use sigwait instead of sigwaitinfo.


From: Jan Kiszka
Subject: [Qemu-devel] Re: [PATCH] Use sigwait instead of sigwaitinfo.
Date: Fri, 18 Feb 2011 16:34:08 +0100
User-agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); de; rv:1.8.1.12) Gecko/20080226 SUSE/2.0.0.12-1.1 Thunderbird/2.0.0.12 Mnenhy/0.7.5.666

On 2011-02-18 14:17, Tristan Gingold wrote:
> Fix compilation failure on Darwin.
> 
> Signed-off-by: Tristan Gingold <address@hidden>
> ---
>  compatfd.c |   36 ++++++++++++++++++------------------
>  1 files changed, 18 insertions(+), 18 deletions(-)
> 
> diff --git a/compatfd.c b/compatfd.c
> index a7cebc4..bd377c4 100644
> --- a/compatfd.c
> +++ b/compatfd.c
> @@ -26,45 +26,45 @@ struct sigfd_compat_info
>  static void *sigwait_compat(void *opaque)
>  {
>      struct sigfd_compat_info *info = opaque;
> -    int err;
>      sigset_t all;
>  
>      sigfillset(&all);
>      sigprocmask(SIG_BLOCK, &all, NULL);
>  
> -    do {
> -        siginfo_t siginfo;
> +    while (1) {
> +        int sig;
> +        int err;
>  
> -        err = sigwaitinfo(&info->mask, &siginfo);
> -        if (err == -1 && errno == EINTR) {
> -            err = 0;
> -            continue;
> -        }
> -
> -        if (err > 0) {
> -            char buffer[128];
> +        err = sigwait(&info->mask, &sig);
> +        if (err != 0) {
> +            if (errno == EINTR) {
> +                continue;
> +            } else {
> +                return NULL;
> +            }
> +        } else {
> +            struct qemu_signalfd_siginfo buffer;
>              size_t offset = 0;
>  
> -            memcpy(buffer, &err, sizeof(err));
> +            memset(&buffer, 0, sizeof(buffer));
> +            buffer.ssi_signo = sig;
> +
>              while (offset < sizeof(buffer)) {
>                  ssize_t len;
>  
> -                len = write(info->fd, buffer + offset,
> +                len = write(info->fd, (char *)&buffer + offset,
>                              sizeof(buffer) - offset);
>                  if (len == -1 && errno == EINTR)
>                      continue;
>  
>                  if (len <= 0) {
> -                    err = -1;
> -                    break;
> +                    return NULL;

This and the above handling of sigwait return codes changes the error
handling strategy. So far we silently skipped errors, now we silently
terminate the compatfd thread. I think none of both approaches is good.

Failing sigwait is likely a reason to bail out, but loudly, writing some
error message to the console and triggering a shutdown of qemu.

An overflow of the compatfd pipe to the main thread may be due to some
very unfortunate overload scenario. Not sure if that qualifies for a
thread termination (definitely not for a silent one).

Error handling should probably be adjusted independently of this darwin
build fix.

Jan

-- 
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux



reply via email to

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