diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2013-09-25 14:20:59 +0800 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2013-10-17 17:30:55 +0200 |
commit | c7c4d063f50f0de980d99f02e055722227d703bc (patch) | |
tree | 8ddfd7aa65bfb93a1c77d1edfa0f4c5576cad52e /include/qemu/thread.h | |
parent | cb365646a942ed58aae053064b2048a415337ba2 (diff) | |
download | qemu-c7c4d063f50f0de980d99f02e055722227d703bc.zip qemu-c7c4d063f50f0de980d99f02e055722227d703bc.tar.gz qemu-c7c4d063f50f0de980d99f02e055722227d703bc.tar.bz2 |
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.h | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/include/qemu/thread.h b/include/qemu/thread.h index c02404b..3e32c65 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); |