diff options
author | Stefan Hajnoczi <stefanha@redhat.com> | 2014-02-27 11:48:41 +0100 |
---|---|---|
committer | Stefan Hajnoczi <stefanha@redhat.com> | 2014-03-13 14:42:24 +0100 |
commit | 88eb7c29e4320597d2f246adf731f0aac97cfbcc (patch) | |
tree | 2044aec8594d144fe48380f095110abd1bf97199 | |
parent | 48ff269272f18d2b8fa53cb08365df417588f585 (diff) | |
download | hqemu-88eb7c29e4320597d2f246adf731f0aac97cfbcc.zip hqemu-88eb7c29e4320597d2f246adf731f0aac97cfbcc.tar.gz |
iothread: stash thread ID away
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 <stefanha@redhat.com>
-rw-r--r-- | iothread.c | 22 |
1 files changed, 22 insertions, 0 deletions
@@ -26,7 +26,10 @@ struct IOThread { 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) \ @@ -38,6 +41,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)) { @@ -55,6 +63,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); } @@ -64,12 +74,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", 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) |