summary refs log tree commit diff stats
path: root/include/qemu/thread.h
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2013-09-25 14:20:59 +0800
committerPaolo Bonzini <pbonzini@redhat.com>2013-10-17 17:30:55 +0200
commitc7c4d063f50f0de980d99f02e055722227d703bc (patch)
tree8ddfd7aa65bfb93a1c77d1edfa0f4c5576cad52e /include/qemu/thread.h
parentcb365646a942ed58aae053064b2048a415337ba2 (diff)
downloadfocaccia-qemu-c7c4d063f50f0de980d99f02e055722227d703bc.tar.gz
focaccia-qemu-c7c4d063f50f0de980d99f02e055722227d703bc.zip
qemu-thread: add QemuEvent
This emulates Win32 manual-reset events using futexes or conditional
variables.  Typical ways to use them are with multi-producer,
single-consumer data structures, to test for a complex condition whose
elements come from different threads:

    for (;;) {
        qemu_event_reset(ev);
        ... test complex condition ...
        if (condition is true) {
            break;
        }
        qemu_event_wait(ev);
    }

Or more efficiently (but with some duplication):

    ... evaluate condition ...
    while (!condition) {
        qemu_event_reset(ev);
        ... evaluate condition ...
        if (!condition) {
            qemu_event_wait(ev);
            ... evaluate condition ...
        }
    }

QemuEvent provides a very fast userspace path in the common case when
no other thread is waiting, or the event is not changing state.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'include/qemu/thread.h')
-rw-r--r--include/qemu/thread.h7
1 files changed, 7 insertions, 0 deletions
diff --git a/include/qemu/thread.h b/include/qemu/thread.h
index c02404b9fb..3e32c6531c 100644
--- a/include/qemu/thread.h
+++ b/include/qemu/thread.h
@@ -7,6 +7,7 @@
 typedef struct QemuMutex QemuMutex;
 typedef struct QemuCond QemuCond;
 typedef struct QemuSemaphore QemuSemaphore;
+typedef struct QemuEvent QemuEvent;
 typedef struct QemuThread QemuThread;
 
 #ifdef _WIN32
@@ -45,6 +46,12 @@ void qemu_sem_wait(QemuSemaphore *sem);
 int qemu_sem_timedwait(QemuSemaphore *sem, int ms);
 void qemu_sem_destroy(QemuSemaphore *sem);
 
+void qemu_event_init(QemuEvent *ev, bool init);
+void qemu_event_set(QemuEvent *ev);
+void qemu_event_reset(QemuEvent *ev);
+void qemu_event_wait(QemuEvent *ev);
+void qemu_event_destroy(QemuEvent *ev);
+
 void qemu_thread_create(QemuThread *thread,
                         void *(*start_routine)(void *),
                         void *arg, int mode);