On 2011-12-06 18:05, Paolo Bonzini wrote: > From: Jan Kiszka <jan.kis...@siemens.com> > > Split from Jan's original qemu-thread-posix.c patch. No semantic change, > just introduce the new API that POSIX and Win32 implementations will > conform to. > > Signed-off-by: Jan Kiszka <jan.kis...@siemens.com> > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> > --- > cpus.c | 6 ++++-- > hw/ccid-card-emulated.c | 5 +++-- > qemu-thread-posix.c | 7 ++++--- > qemu-thread-win32.c | 4 +++- > qemu-thread.h | 8 ++++++-- > ui/vnc-jobs-async.c | 2 +- > 6 files changed, 21 insertions(+), 11 deletions(-) > > diff --git a/cpus.c b/cpus.c > index ca46ec6..cbb4617 100644 > --- a/cpus.c > +++ b/cpus.c > @@ -910,7 +910,8 @@ static void qemu_tcg_init_vcpu(void *_env) > env->halt_cond = g_malloc0(sizeof(QemuCond)); > qemu_cond_init(env->halt_cond); > tcg_halt_cond = env->halt_cond; > - qemu_thread_create(env->thread, qemu_tcg_cpu_thread_fn, env); > + qemu_thread_create(env->thread, qemu_tcg_cpu_thread_fn, env, > + QEMU_THREAD_DETACHED); > while (env->created == 0) { > qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex); > } > @@ -926,7 +927,8 @@ static void qemu_kvm_start_vcpu(CPUState *env) > env->thread = g_malloc0(sizeof(QemuThread)); > env->halt_cond = g_malloc0(sizeof(QemuCond)); > qemu_cond_init(env->halt_cond); > - qemu_thread_create(env->thread, qemu_kvm_cpu_thread_fn, env); > + qemu_thread_create(env->thread, qemu_kvm_cpu_thread_fn, env, > + QEMU_THREAD_DETACHED); > while (env->created == 0) { > qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex); > } > diff --git a/hw/ccid-card-emulated.c b/hw/ccid-card-emulated.c > index 092301b..9fe9db5 100644 > --- a/hw/ccid-card-emulated.c > +++ b/hw/ccid-card-emulated.c > @@ -541,8 +541,9 @@ static int emulated_initfn(CCIDCardState *base) > printf("%s: failed to initialize vcard\n", EMULATED_DEV_NAME); > return -1; > } > - qemu_thread_create(&thread_id, event_thread, card); > - qemu_thread_create(&thread_id, handle_apdu_thread, card); > + qemu_thread_create(&thread_id, event_thread, card, QEMU_THREAD_DETACHED); > + qemu_thread_create(&thread_id, handle_apdu_thread, card, > + QEMU_THREAD_DETACHED); > return 0; > } > > diff --git a/qemu-thread-posix.c b/qemu-thread-posix.c > index ac3c0c9..49d3388 100644 > --- a/qemu-thread-posix.c > +++ b/qemu-thread-posix.c > @@ -117,13 +117,14 @@ void qemu_cond_wait(QemuCond *cond, QemuMutex *mutex) > > void qemu_thread_create(QemuThread *thread, > void *(*start_routine)(void*), > - void *arg) > + void *arg, int mode) > { > + sigset_t set, oldset; > int err; > > - /* Leave signal handling to the iothread. */ > - sigset_t set, oldset; > + assert(mode == QEMU_THREAD_DETACHED); > > + /* Leave signal handling to the iothread. */ > sigfillset(&set); > pthread_sigmask(SIG_SETMASK, &set, &oldset); > err = pthread_create(&thread->thread, NULL, start_routine, arg); > diff --git a/qemu-thread-win32.c b/qemu-thread-win32.c > index db8e744..ff80e84 100644 > --- a/qemu-thread-win32.c > +++ b/qemu-thread-win32.c > @@ -243,10 +243,12 @@ static inline void qemu_thread_init(void) > > void qemu_thread_create(QemuThread *thread, > void *(*start_routine)(void *), > - void *arg) > + void *arg, int mode) > { > HANDLE hThread; > > + assert(mode == QEMU_THREAD_DETACHED); > + > struct QemuThreadData *data; > qemu_thread_init(); > data = g_malloc(sizeof *data); > diff --git a/qemu-thread.h b/qemu-thread.h > index e008b60..a78a8f2 100644 > --- a/qemu-thread.h > +++ b/qemu-thread.h > @@ -13,6 +13,9 @@ typedef struct QemuThread QemuThread; > #include "qemu-thread-posix.h" > #endif > > +#define QEMU_THREAD_JOINABLE 0 > +#define QEMU_THREAD_DETACHED 1 > + > void qemu_mutex_init(QemuMutex *mutex); > void qemu_mutex_destroy(QemuMutex *mutex); > void qemu_mutex_lock(QemuMutex *mutex); > @@ -35,8 +38,9 @@ void qemu_cond_broadcast(QemuCond *cond); > void qemu_cond_wait(QemuCond *cond, QemuMutex *mutex); > > void qemu_thread_create(QemuThread *thread, > - void *(*start_routine)(void*), > - void *arg); > + void *(*start_routine)(void *), > + void *arg, int mode); > +void *qemu_thread_join(QemuThread *thread); > void qemu_thread_get_self(QemuThread *thread); > int qemu_thread_is_self(QemuThread *thread); > void qemu_thread_exit(void *retval); > diff --git a/ui/vnc-jobs-async.c b/ui/vnc-jobs-async.c > index de5ea6b..9b3016c 100644 > --- a/ui/vnc-jobs-async.c > +++ b/ui/vnc-jobs-async.c > @@ -318,7 +318,7 @@ void vnc_start_worker_thread(void) > return ; > > q = vnc_queue_init(); > - qemu_thread_create(&q->thread, vnc_worker_thread, q); > + qemu_thread_create(&q->thread, vnc_worker_thread, q, > QEMU_THREAD_DETACHED); > queue = q; /* Set global queue */ > } >
Acked - but I already signed it anyway. Jan -- Siemens AG, Corporate Technology, CT T DE IT 1 Corporate Competence Center Embedded Linux