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