Lines Matching refs:ev
283 static inline void futex_wake(QemuEvent *ev, int n)
285 futex(ev, FUTEX_WAKE, n, NULL, NULL, 0);
288 static inline void futex_wait(QemuEvent *ev, unsigned val)
290 futex(ev, FUTEX_WAIT, (int) val, NULL, NULL, 0);
293 static inline void futex_wake(QemuEvent *ev, int n)
296 pthread_cond_signal(&ev->cond);
298 pthread_cond_broadcast(&ev->cond);
302 static inline void futex_wait(QemuEvent *ev, unsigned val)
304 pthread_mutex_lock(&ev->lock);
305 if (ev->value == val) {
306 pthread_cond_wait(&ev->cond, &ev->lock);
308 pthread_mutex_unlock(&ev->lock);
330 void qemu_event_init(QemuEvent *ev, bool init)
333 pthread_mutex_init(&ev->lock, NULL);
334 pthread_cond_init(&ev->cond, NULL);
337 ev->value = (init ? EV_SET : EV_FREE);
340 void qemu_event_destroy(QemuEvent *ev)
343 pthread_mutex_destroy(&ev->lock);
344 pthread_cond_destroy(&ev->cond);
348 void qemu_event_set(QemuEvent *ev)
350 if (atomic_mb_read(&ev->value) != EV_SET) {
351 if (atomic_xchg(&ev->value, EV_SET) == EV_BUSY) {
353 futex_wake(ev, INT_MAX);
358 void qemu_event_reset(QemuEvent *ev)
360 if (atomic_mb_read(&ev->value) == EV_SET) {
365 atomic_or(&ev->value, EV_FREE);
369 void qemu_event_wait(QemuEvent *ev)
373 value = atomic_mb_read(&ev->value);
382 if (atomic_cmpxchg(&ev->value, EV_FREE, EV_BUSY) == EV_SET) {
386 futex_wait(ev, EV_BUSY);