qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 2/4] qemu-thread: implement joinable threads for


From: Jan Kiszka
Subject: Re: [Qemu-devel] [PATCH 2/4] qemu-thread: implement joinable threads for POSIX
Date: Tue, 06 Dec 2011 18:37:31 +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-12-06 18:05, Paolo Bonzini wrote:
> From: Jan Kiszka <address@hidden>
> 
> Allow to control if a QEMU thread is created joinable or not. Make it
> not joinable by default to avoid that we keep the associated resources
> around when terminating a thread without joining it (what we couldn't do
> so far for obvious reasons).
> 
> The audio subsystem will need the join feature when converting it to
> QEMU threading/locking abstractions, so provide that service.
> 
> Signed-off-by: Jan Kiszka <address@hidden>
> Signed-off-by: Paolo Bonzini <address@hidden>
> ---
>  qemu-thread-posix.c |   28 ++++++++++++++++++++++++++++--
>  1 files changed, 26 insertions(+), 2 deletions(-)
> 
> diff --git a/qemu-thread-posix.c b/qemu-thread-posix.c
> index 49d3388..603ff3d 100644
> --- a/qemu-thread-posix.c
> +++ b/qemu-thread-posix.c
> @@ -122,16 +122,28 @@ void qemu_thread_create(QemuThread *thread,
>      sigset_t set, oldset;
>      int err;
>  
> -    assert(mode == QEMU_THREAD_DETACHED);
> +    pthread_attr_t attr;

Minor nit: blank line here instead. Fine otherwise.

Jan

> +    err = pthread_attr_init(&attr);
> +    if (err) {
> +        error_exit(err, __func__);
> +    }
> +    if (mode == QEMU_THREAD_DETACHED) {
> +        err = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
> +        if (err) {
> +            error_exit(err, __func__);
> +        }
> +    }
>  
>      /* Leave signal handling to the iothread.  */
>      sigfillset(&set);
>      pthread_sigmask(SIG_SETMASK, &set, &oldset);
> -    err = pthread_create(&thread->thread, NULL, start_routine, arg);
> +    err = pthread_create(&thread->thread, &attr, start_routine, arg);
>      if (err)
>          error_exit(err, __func__);
>  
>      pthread_sigmask(SIG_SETMASK, &oldset, NULL);
> +
> +    pthread_attr_destroy(&attr);
>  }
>  
>  void qemu_thread_get_self(QemuThread *thread)
> @@ -148,3 +162,15 @@ void qemu_thread_exit(void *retval)
>  {
>      pthread_exit(retval);
>  }
> +
> +void *qemu_thread_join(QemuThread *thread)
> +{
> +    int err;
> +    void *ret;
> +
> +    err = pthread_join(thread->thread, &ret);
> +    if (err) {
> +        error_exit(err, __func__);
> +    }
> +    return ret;
> +}

-- 
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]