qemu-thread: add QemuEvent
commitc7c4d063f50f0de980d99f02e055722227d703bc
authorPaolo Bonzini <pbonzini@redhat.com>
Wed, 25 Sep 2013 06:20:59 +0000 (25 14:20 +0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 17 Oct 2013 15:30:55 +0000 (17 17:30 +0200)
tree8ddfd7aa65bfb93a1c77d1edfa0f4c5576cad52e
parentcb365646a942ed58aae053064b2048a415337ba2
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>
include/qemu/thread-posix.h
include/qemu/thread-win32.h
include/qemu/thread.h
util/qemu-thread-posix.c
util/qemu-thread-win32.c