* See the COPYING.LIB file in the top-level directory. * */ #include "qemu-coroutine.h" #include "qemu-timer.h" typedef struct CoSleepCB { QEMUTimer *ts; Coroutine *co; } CoSleepCB; static void co_sleep_cb(void *opaque) { CoSleepCB *sleep_cb = opaque; qemu_coroutine_enter(sleep_cb->co, NULL); } void coroutine_fn co_sleep_ns(QEMUClock *clock, int64_t ns) { CoSleepCB sleep_cb = { .co = qemu_coroutine_self(), }; sleep_cb.ts = qemu_new_timer(clock, SCALE_NS, co_sleep_cb, &sleep_cb); qemu_mod_timer(sleep_cb.ts, qemu_get_clock_ns(clock) + ns); qemu_coroutine_yield(); qemu_del_timer(sleep_cb.ts); qemu_free_timer(sleep_cb.ts); }
void qemu_announce_self(void) { static QEMUTimer *timer; timer = qemu_new_timer(rt_clock, qemu_announce_self_once, &timer); qemu_announce_self_once(&timer); }
CharDriverState *chr_baum_init(QemuOpts *opts) { BaumDriverState *baum; CharDriverState *chr; brlapi_handle_t *handle; #ifdef CONFIG_SDL SDL_SysWMinfo info; #endif int tty; baum = qemu_mallocz(sizeof(BaumDriverState)); baum->chr = chr = qemu_mallocz(sizeof(CharDriverState)); chr->opaque = baum; chr->chr_write = baum_write; chr->chr_send_event = baum_send_event; chr->chr_accept_input = baum_accept_input; handle = qemu_mallocz(brlapi_getHandleSize()); baum->brlapi = handle; baum->brlapi_fd = brlapi__openConnection(handle, NULL, NULL); if (baum->brlapi_fd == -1) { brlapi_perror("baum_init: brlapi_openConnection"); goto fail_handle; } baum->cellCount_timer = qemu_new_timer(vm_clock, baum_cellCount_timer_cb, baum); if (brlapi__getDisplaySize(handle, &baum->x, &baum->y) == -1) { brlapi_perror("baum_init: brlapi_getDisplaySize"); goto fail; } #ifdef CONFIG_SDL memset(&info, 0, sizeof(info)); SDL_VERSION(&info.version); if (SDL_GetWMInfo(&info)) tty = info.info.x11.wmwindow; else #endif tty = BRLAPI_TTY_DEFAULT; if (brlapi__enterTtyMode(handle, tty, NULL) == -1) { brlapi_perror("baum_init: brlapi_enterTtyMode"); goto fail; } qemu_set_fd_handler(baum->brlapi_fd, baum_chr_read, NULL, baum); qemu_chr_reset(chr); return chr; fail: qemu_free_timer(baum->cellCount_timer); brlapi__closeConnection(handle); fail_handle: free(handle); free(chr); free(baum); return NULL; }