1/* 2 * QEMU coroutine sleep 3 * 4 * Copyright IBM, Corp. 2011 5 * 6 * Authors: 7 * Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> 8 * 9 * This work is licensed under the terms of the GNU LGPL, version 2 or later. 10 * See the COPYING.LIB file in the top-level directory. 11 * 12 */ 13 14#include "block/coroutine.h" 15#include "qemu/timer.h" 16 17typedef struct CoSleepCB { 18 QEMUTimer *ts; 19 Coroutine *co; 20} CoSleepCB; 21 22static void co_sleep_cb(void *opaque) 23{ 24 CoSleepCB *sleep_cb = opaque; 25 26 qemu_coroutine_enter(sleep_cb->co, NULL); 27} 28 29void coroutine_fn co_sleep_ns(QEMUClock *clock, int64_t ns) 30{ 31 CoSleepCB sleep_cb = { 32 .co = qemu_coroutine_self(), 33 }; 34 sleep_cb.ts = qemu_new_timer(clock, SCALE_NS, co_sleep_cb, &sleep_cb); 35 qemu_mod_timer(sleep_cb.ts, qemu_get_clock_ns(clock) + ns); 36 qemu_coroutine_yield(); 37 qemu_del_timer(sleep_cb.ts); 38 qemu_free_timer(sleep_cb.ts); 39} 40