From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38419) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WIyWO-0007OK-OJ for qemu-devel@nongnu.org; Thu, 27 Feb 2014 05:49:02 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WIyWG-00078E-SR for qemu-devel@nongnu.org; Thu, 27 Feb 2014 05:48:56 -0500 Received: from mx1.redhat.com ([209.132.183.28]:15863) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WIyWG-00078A-Iy for qemu-devel@nongnu.org; Thu, 27 Feb 2014 05:48:48 -0500 From: Stefan Hajnoczi Date: Thu, 27 Feb 2014 11:48:41 +0100 Message-Id: <1393498122-11222-2-git-send-email-stefanha@redhat.com> In-Reply-To: <1393498122-11222-1-git-send-email-stefanha@redhat.com> References: <1393498122-11222-1-git-send-email-stefanha@redhat.com> Subject: [Qemu-devel] [PATCH v3 1/2] iothread: stash thread ID away List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , "Shergill, Gurinder" , Luiz Capitulino , Paolo Bonzini , "Vinod, Chegu" Keep the thread ID around so we can report it via QMP. There's only one problem: qemu_get_thread_id() (gettid() wrapper on Linux) must be called from the thread itself. There is no way to get the thread ID outside the thread. This patch uses a condvar to wait for iothread_run() to populate the thread_id inside the thread. Signed-off-by: Stefan Hajnoczi --- iothread.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/iothread.c b/iothread.c index 033de7f..0a3c048 100644 --- a/iothread.c +++ b/iothread.c @@ -25,7 +25,10 @@ struct IOThread { Object parent; QemuThread thread; AioContext *ctx; + QemuMutex init_done_lock; + QemuCond init_done_cond; /* is thread initialization done? */ bool stopping; + int thread_id; }; #define IOTHREAD_GET_CLASS(obj) \ @@ -37,6 +40,11 @@ static void *iothread_run(void *opaque) { IOThread *iothread = opaque; + qemu_mutex_lock(&iothread->init_done_lock); + iothread->thread_id = qemu_get_thread_id(); + qemu_cond_signal(&iothread->init_done_cond); + qemu_mutex_unlock(&iothread->init_done_lock); + while (!iothread->stopping) { aio_context_acquire(iothread->ctx); while (!iothread->stopping && aio_poll(iothread->ctx, true)) { @@ -54,6 +62,8 @@ static void iothread_instance_finalize(Object *obj) iothread->stopping = true; aio_notify(iothread->ctx); qemu_thread_join(&iothread->thread); + qemu_cond_destroy(&iothread->init_done_cond); + qemu_mutex_destroy(&iothread->init_done_lock); aio_context_unref(iothread->ctx); } @@ -63,12 +73,24 @@ static void iothread_complete(UserCreatable *obj, Error **errp) iothread->stopping = false; iothread->ctx = aio_context_new(); + iothread->thread_id = -1; + + qemu_mutex_init(&iothread->init_done_lock); + qemu_cond_init(&iothread->init_done_cond); /* This assumes we are called from a thread with useful CPU affinity for us * to inherit. */ qemu_thread_create(&iothread->thread, iothread_run, iothread, QEMU_THREAD_JOINABLE); + + /* Wait for initialization to complete */ + qemu_mutex_lock(&iothread->init_done_lock); + while (iothread->thread_id == -1) { + qemu_cond_wait(&iothread->init_done_cond, + &iothread->init_done_lock); + } + qemu_mutex_unlock(&iothread->init_done_lock); } static void iothread_class_init(ObjectClass *klass, void *class_data) -- 1.8.5.3