[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 1/2] iothread: stash thread ID away
From: |
Stefan Hajnoczi |
Subject: |
[Qemu-devel] [PATCH 1/2] iothread: stash thread ID away |
Date: |
Fri, 21 Feb 2014 15:51:19 +0100 |
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 <address@hidden>
---
iothread.c | 34 ++++++++++++++++++++++++++++++++--
1 file changed, 32 insertions(+), 2 deletions(-)
diff --git a/iothread.c b/iothread.c
index 033de7f..1a0d1ec 100644
--- a/iothread.c
+++ b/iothread.c
@@ -26,8 +26,15 @@ struct IOThread {
QemuThread thread;
AioContext *ctx;
bool stopping;
+ int thread_id;
};
+typedef struct {
+ QemuMutex init_done_lock;
+ QemuCond init_done_cond; /* is thread initialization done? */
+ IOThread *iothread;
+} ThreadInitInfo;
+
#define IOTHREAD_GET_CLASS(obj) \
OBJECT_GET_CLASS(IOThreadClass, obj, TYPE_IOTHREAD)
#define IOTHREAD_CLASS(klass) \
@@ -35,7 +42,15 @@ struct IOThread {
static void *iothread_run(void *opaque)
{
- IOThread *iothread = opaque;
+ ThreadInitInfo *init_info = opaque;
+ IOThread *iothread = init_info->iothread;
+
+ iothread->thread_id = qemu_get_thread_id();
+
+ /* Signal that initialization is done */
+ qemu_mutex_lock(&init_info->init_done_lock);
+ qemu_cond_signal(&init_info->init_done_cond);
+ qemu_mutex_unlock(&init_info->init_done_lock);
while (!iothread->stopping) {
aio_context_acquire(iothread->ctx);
@@ -60,15 +75,30 @@ static void iothread_instance_finalize(Object *obj)
static void iothread_complete(UserCreatable *obj, Error **errp)
{
IOThread *iothread = IOTHREAD(obj);
+ ThreadInitInfo init_info = {
+ .iothread = iothread,
+ };
iothread->stopping = false;
iothread->ctx = aio_context_new();
+ qemu_mutex_init(&init_info.init_done_lock);
+ qemu_cond_init(&init_info.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);
+ &init_info, QEMU_THREAD_JOINABLE);
+
+ /* Wait for initialization to complete */
+ qemu_mutex_lock(&init_info.init_done_lock);
+ qemu_cond_wait(&init_info.init_done_cond,
+ &init_info.init_done_lock);
+ qemu_mutex_unlock(&init_info.init_done_lock);
+
+ qemu_cond_destroy(&init_info.init_done_cond);
+ qemu_mutex_destroy(&init_info.init_done_lock);
}
static void iothread_class_init(ObjectClass *klass, void *class_data)
--
1.8.5.3
[Qemu-devel] [PATCH 2/2] qmp: add query-iothreads command, Stefan Hajnoczi, 2014/02/21