root / tests / test-aio.c @ feature-archipelago
History | View | Annotate | Download (23.3 kB)
1 | b2ea25d7 | Paolo Bonzini | /*
|
---|---|---|---|
2 | b2ea25d7 | Paolo Bonzini | * AioContext tests
|
3 | b2ea25d7 | Paolo Bonzini | *
|
4 | b2ea25d7 | Paolo Bonzini | * Copyright Red Hat, Inc. 2012
|
5 | b2ea25d7 | Paolo Bonzini | *
|
6 | b2ea25d7 | Paolo Bonzini | * Authors:
|
7 | b2ea25d7 | Paolo Bonzini | * Paolo Bonzini <pbonzini@redhat.com>
|
8 | b2ea25d7 | Paolo Bonzini | *
|
9 | b2ea25d7 | Paolo Bonzini | * This work is licensed under the terms of the GNU LGPL, version 2 or later.
|
10 | b2ea25d7 | Paolo Bonzini | * See the COPYING.LIB file in the top-level directory.
|
11 | b2ea25d7 | Paolo Bonzini | */
|
12 | b2ea25d7 | Paolo Bonzini | |
13 | b2ea25d7 | Paolo Bonzini | #include <glib.h> |
14 | 737e150e | Paolo Bonzini | #include "block/aio.h" |
15 | dae21b98 | Alex Bligh | #include "qemu/timer.h" |
16 | a94a3fac | Alex Bligh | #include "qemu/sockets.h" |
17 | b2ea25d7 | Paolo Bonzini | |
18 | b2ea25d7 | Paolo Bonzini | AioContext *ctx; |
19 | b2ea25d7 | Paolo Bonzini | |
20 | 24d1a6d9 | Stefan Hajnoczi | typedef struct { |
21 | 24d1a6d9 | Stefan Hajnoczi | EventNotifier e; |
22 | 24d1a6d9 | Stefan Hajnoczi | int n;
|
23 | 24d1a6d9 | Stefan Hajnoczi | int active;
|
24 | 24d1a6d9 | Stefan Hajnoczi | bool auto_set;
|
25 | 24d1a6d9 | Stefan Hajnoczi | } EventNotifierTestData; |
26 | 24d1a6d9 | Stefan Hajnoczi | |
27 | 9fe3781f | Stefan Hajnoczi | /* Wait until there are no more BHs or AIO requests */
|
28 | 9fe3781f | Stefan Hajnoczi | static void wait_for_aio(void) |
29 | 9fe3781f | Stefan Hajnoczi | { |
30 | 9fe3781f | Stefan Hajnoczi | while (aio_poll(ctx, true)) { |
31 | 9fe3781f | Stefan Hajnoczi | /* Do nothing */
|
32 | 9fe3781f | Stefan Hajnoczi | } |
33 | 9fe3781f | Stefan Hajnoczi | } |
34 | 9fe3781f | Stefan Hajnoczi | |
35 | 24d1a6d9 | Stefan Hajnoczi | /* Wait until event notifier becomes inactive */
|
36 | 24d1a6d9 | Stefan Hajnoczi | static void wait_until_inactive(EventNotifierTestData *data) |
37 | 24d1a6d9 | Stefan Hajnoczi | { |
38 | 24d1a6d9 | Stefan Hajnoczi | while (data->active > 0) { |
39 | 24d1a6d9 | Stefan Hajnoczi | aio_poll(ctx, true);
|
40 | 24d1a6d9 | Stefan Hajnoczi | } |
41 | 24d1a6d9 | Stefan Hajnoczi | } |
42 | 24d1a6d9 | Stefan Hajnoczi | |
43 | b2ea25d7 | Paolo Bonzini | /* Simple callbacks for testing. */
|
44 | b2ea25d7 | Paolo Bonzini | |
45 | b2ea25d7 | Paolo Bonzini | typedef struct { |
46 | b2ea25d7 | Paolo Bonzini | QEMUBH *bh; |
47 | b2ea25d7 | Paolo Bonzini | int n;
|
48 | b2ea25d7 | Paolo Bonzini | int max;
|
49 | b2ea25d7 | Paolo Bonzini | } BHTestData; |
50 | b2ea25d7 | Paolo Bonzini | |
51 | b53edf97 | Alex Bligh | typedef struct { |
52 | b53edf97 | Alex Bligh | QEMUTimer timer; |
53 | b53edf97 | Alex Bligh | QEMUClockType clock_type; |
54 | b53edf97 | Alex Bligh | int n;
|
55 | b53edf97 | Alex Bligh | int max;
|
56 | b53edf97 | Alex Bligh | int64_t ns; |
57 | b53edf97 | Alex Bligh | AioContext *ctx; |
58 | b53edf97 | Alex Bligh | } TimerTestData; |
59 | b53edf97 | Alex Bligh | |
60 | b2ea25d7 | Paolo Bonzini | static void bh_test_cb(void *opaque) |
61 | b2ea25d7 | Paolo Bonzini | { |
62 | b2ea25d7 | Paolo Bonzini | BHTestData *data = opaque; |
63 | b2ea25d7 | Paolo Bonzini | if (++data->n < data->max) {
|
64 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data->bh); |
65 | b2ea25d7 | Paolo Bonzini | } |
66 | b2ea25d7 | Paolo Bonzini | } |
67 | b2ea25d7 | Paolo Bonzini | |
68 | b53edf97 | Alex Bligh | static void timer_test_cb(void *opaque) |
69 | b53edf97 | Alex Bligh | { |
70 | b53edf97 | Alex Bligh | TimerTestData *data = opaque; |
71 | b53edf97 | Alex Bligh | if (++data->n < data->max) {
|
72 | b53edf97 | Alex Bligh | timer_mod(&data->timer, |
73 | b53edf97 | Alex Bligh | qemu_clock_get_ns(data->clock_type) + data->ns); |
74 | b53edf97 | Alex Bligh | } |
75 | b53edf97 | Alex Bligh | } |
76 | b53edf97 | Alex Bligh | |
77 | b53edf97 | Alex Bligh | static void dummy_io_handler_read(void *opaque) |
78 | b53edf97 | Alex Bligh | { |
79 | b53edf97 | Alex Bligh | } |
80 | b53edf97 | Alex Bligh | |
81 | b2ea25d7 | Paolo Bonzini | static void bh_delete_cb(void *opaque) |
82 | b2ea25d7 | Paolo Bonzini | { |
83 | b2ea25d7 | Paolo Bonzini | BHTestData *data = opaque; |
84 | b2ea25d7 | Paolo Bonzini | if (++data->n < data->max) {
|
85 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data->bh); |
86 | b2ea25d7 | Paolo Bonzini | } else {
|
87 | b2ea25d7 | Paolo Bonzini | qemu_bh_delete(data->bh); |
88 | b2ea25d7 | Paolo Bonzini | data->bh = NULL;
|
89 | b2ea25d7 | Paolo Bonzini | } |
90 | b2ea25d7 | Paolo Bonzini | } |
91 | b2ea25d7 | Paolo Bonzini | |
92 | b2ea25d7 | Paolo Bonzini | static void event_ready_cb(EventNotifier *e) |
93 | b2ea25d7 | Paolo Bonzini | { |
94 | b2ea25d7 | Paolo Bonzini | EventNotifierTestData *data = container_of(e, EventNotifierTestData, e); |
95 | b2ea25d7 | Paolo Bonzini | g_assert(event_notifier_test_and_clear(e)); |
96 | b2ea25d7 | Paolo Bonzini | data->n++; |
97 | b2ea25d7 | Paolo Bonzini | if (data->active > 0) { |
98 | b2ea25d7 | Paolo Bonzini | data->active--; |
99 | b2ea25d7 | Paolo Bonzini | } |
100 | b2ea25d7 | Paolo Bonzini | if (data->auto_set && data->active) {
|
101 | b2ea25d7 | Paolo Bonzini | event_notifier_set(e); |
102 | b2ea25d7 | Paolo Bonzini | } |
103 | b2ea25d7 | Paolo Bonzini | } |
104 | b2ea25d7 | Paolo Bonzini | |
105 | b2ea25d7 | Paolo Bonzini | /* Tests using aio_*. */
|
106 | b2ea25d7 | Paolo Bonzini | |
107 | b2ea25d7 | Paolo Bonzini | static void test_notify(void) |
108 | b2ea25d7 | Paolo Bonzini | { |
109 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
110 | b2ea25d7 | Paolo Bonzini | aio_notify(ctx); |
111 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, true));
|
112 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
113 | b2ea25d7 | Paolo Bonzini | } |
114 | b2ea25d7 | Paolo Bonzini | |
115 | b2ea25d7 | Paolo Bonzini | static void test_bh_schedule(void) |
116 | b2ea25d7 | Paolo Bonzini | { |
117 | b2ea25d7 | Paolo Bonzini | BHTestData data = { .n = 0 };
|
118 | b2ea25d7 | Paolo Bonzini | data.bh = aio_bh_new(ctx, bh_test_cb, &data); |
119 | b2ea25d7 | Paolo Bonzini | |
120 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data.bh); |
121 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
122 | b2ea25d7 | Paolo Bonzini | |
123 | b2ea25d7 | Paolo Bonzini | g_assert(aio_poll(ctx, true));
|
124 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
125 | b2ea25d7 | Paolo Bonzini | |
126 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
127 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
128 | b2ea25d7 | Paolo Bonzini | qemu_bh_delete(data.bh); |
129 | b2ea25d7 | Paolo Bonzini | } |
130 | b2ea25d7 | Paolo Bonzini | |
131 | b2ea25d7 | Paolo Bonzini | static void test_bh_schedule10(void) |
132 | b2ea25d7 | Paolo Bonzini | { |
133 | b2ea25d7 | Paolo Bonzini | BHTestData data = { .n = 0, .max = 10 }; |
134 | b2ea25d7 | Paolo Bonzini | data.bh = aio_bh_new(ctx, bh_test_cb, &data); |
135 | b2ea25d7 | Paolo Bonzini | |
136 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data.bh); |
137 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
138 | b2ea25d7 | Paolo Bonzini | |
139 | b2ea25d7 | Paolo Bonzini | g_assert(aio_poll(ctx, false));
|
140 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
141 | b2ea25d7 | Paolo Bonzini | |
142 | b2ea25d7 | Paolo Bonzini | g_assert(aio_poll(ctx, true));
|
143 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 2);
|
144 | b2ea25d7 | Paolo Bonzini | |
145 | 9fe3781f | Stefan Hajnoczi | wait_for_aio(); |
146 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 10);
|
147 | b2ea25d7 | Paolo Bonzini | |
148 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
149 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 10);
|
150 | b2ea25d7 | Paolo Bonzini | qemu_bh_delete(data.bh); |
151 | b2ea25d7 | Paolo Bonzini | } |
152 | b2ea25d7 | Paolo Bonzini | |
153 | b2ea25d7 | Paolo Bonzini | static void test_bh_cancel(void) |
154 | b2ea25d7 | Paolo Bonzini | { |
155 | b2ea25d7 | Paolo Bonzini | BHTestData data = { .n = 0 };
|
156 | b2ea25d7 | Paolo Bonzini | data.bh = aio_bh_new(ctx, bh_test_cb, &data); |
157 | b2ea25d7 | Paolo Bonzini | |
158 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data.bh); |
159 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
160 | b2ea25d7 | Paolo Bonzini | |
161 | b2ea25d7 | Paolo Bonzini | qemu_bh_cancel(data.bh); |
162 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
163 | b2ea25d7 | Paolo Bonzini | |
164 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
165 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
166 | b2ea25d7 | Paolo Bonzini | qemu_bh_delete(data.bh); |
167 | b2ea25d7 | Paolo Bonzini | } |
168 | b2ea25d7 | Paolo Bonzini | |
169 | b2ea25d7 | Paolo Bonzini | static void test_bh_delete(void) |
170 | b2ea25d7 | Paolo Bonzini | { |
171 | b2ea25d7 | Paolo Bonzini | BHTestData data = { .n = 0 };
|
172 | b2ea25d7 | Paolo Bonzini | data.bh = aio_bh_new(ctx, bh_test_cb, &data); |
173 | b2ea25d7 | Paolo Bonzini | |
174 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data.bh); |
175 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
176 | b2ea25d7 | Paolo Bonzini | |
177 | b2ea25d7 | Paolo Bonzini | qemu_bh_delete(data.bh); |
178 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
179 | b2ea25d7 | Paolo Bonzini | |
180 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
181 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
182 | b2ea25d7 | Paolo Bonzini | } |
183 | b2ea25d7 | Paolo Bonzini | |
184 | b2ea25d7 | Paolo Bonzini | static void test_bh_delete_from_cb(void) |
185 | b2ea25d7 | Paolo Bonzini | { |
186 | b2ea25d7 | Paolo Bonzini | BHTestData data1 = { .n = 0, .max = 1 }; |
187 | b2ea25d7 | Paolo Bonzini | |
188 | b2ea25d7 | Paolo Bonzini | data1.bh = aio_bh_new(ctx, bh_delete_cb, &data1); |
189 | b2ea25d7 | Paolo Bonzini | |
190 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data1.bh); |
191 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data1.n, ==, 0);
|
192 | b2ea25d7 | Paolo Bonzini | |
193 | 9fe3781f | Stefan Hajnoczi | wait_for_aio(); |
194 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data1.n, ==, data1.max); |
195 | b2ea25d7 | Paolo Bonzini | g_assert(data1.bh == NULL);
|
196 | b2ea25d7 | Paolo Bonzini | |
197 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
198 | b2ea25d7 | Paolo Bonzini | } |
199 | b2ea25d7 | Paolo Bonzini | |
200 | b2ea25d7 | Paolo Bonzini | static void test_bh_delete_from_cb_many(void) |
201 | b2ea25d7 | Paolo Bonzini | { |
202 | b2ea25d7 | Paolo Bonzini | BHTestData data1 = { .n = 0, .max = 1 }; |
203 | b2ea25d7 | Paolo Bonzini | BHTestData data2 = { .n = 0, .max = 3 }; |
204 | b2ea25d7 | Paolo Bonzini | BHTestData data3 = { .n = 0, .max = 2 }; |
205 | b2ea25d7 | Paolo Bonzini | BHTestData data4 = { .n = 0, .max = 4 }; |
206 | b2ea25d7 | Paolo Bonzini | |
207 | b2ea25d7 | Paolo Bonzini | data1.bh = aio_bh_new(ctx, bh_delete_cb, &data1); |
208 | b2ea25d7 | Paolo Bonzini | data2.bh = aio_bh_new(ctx, bh_delete_cb, &data2); |
209 | b2ea25d7 | Paolo Bonzini | data3.bh = aio_bh_new(ctx, bh_delete_cb, &data3); |
210 | b2ea25d7 | Paolo Bonzini | data4.bh = aio_bh_new(ctx, bh_delete_cb, &data4); |
211 | b2ea25d7 | Paolo Bonzini | |
212 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data1.bh); |
213 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data2.bh); |
214 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data3.bh); |
215 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data4.bh); |
216 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data1.n, ==, 0);
|
217 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data2.n, ==, 0);
|
218 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data3.n, ==, 0);
|
219 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data4.n, ==, 0);
|
220 | b2ea25d7 | Paolo Bonzini | |
221 | b2ea25d7 | Paolo Bonzini | g_assert(aio_poll(ctx, false));
|
222 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data1.n, ==, 1);
|
223 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data2.n, ==, 1);
|
224 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data3.n, ==, 1);
|
225 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data4.n, ==, 1);
|
226 | b2ea25d7 | Paolo Bonzini | g_assert(data1.bh == NULL);
|
227 | b2ea25d7 | Paolo Bonzini | |
228 | 9fe3781f | Stefan Hajnoczi | wait_for_aio(); |
229 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data1.n, ==, data1.max); |
230 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data2.n, ==, data2.max); |
231 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data3.n, ==, data3.max); |
232 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data4.n, ==, data4.max); |
233 | b2ea25d7 | Paolo Bonzini | g_assert(data1.bh == NULL);
|
234 | b2ea25d7 | Paolo Bonzini | g_assert(data2.bh == NULL);
|
235 | b2ea25d7 | Paolo Bonzini | g_assert(data3.bh == NULL);
|
236 | b2ea25d7 | Paolo Bonzini | g_assert(data4.bh == NULL);
|
237 | b2ea25d7 | Paolo Bonzini | } |
238 | b2ea25d7 | Paolo Bonzini | |
239 | b2ea25d7 | Paolo Bonzini | static void test_bh_flush(void) |
240 | b2ea25d7 | Paolo Bonzini | { |
241 | b2ea25d7 | Paolo Bonzini | BHTestData data = { .n = 0 };
|
242 | b2ea25d7 | Paolo Bonzini | data.bh = aio_bh_new(ctx, bh_test_cb, &data); |
243 | b2ea25d7 | Paolo Bonzini | |
244 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data.bh); |
245 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
246 | b2ea25d7 | Paolo Bonzini | |
247 | 9fe3781f | Stefan Hajnoczi | wait_for_aio(); |
248 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
249 | b2ea25d7 | Paolo Bonzini | |
250 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
251 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
252 | b2ea25d7 | Paolo Bonzini | qemu_bh_delete(data.bh); |
253 | b2ea25d7 | Paolo Bonzini | } |
254 | b2ea25d7 | Paolo Bonzini | |
255 | b2ea25d7 | Paolo Bonzini | static void test_set_event_notifier(void) |
256 | b2ea25d7 | Paolo Bonzini | { |
257 | b2ea25d7 | Paolo Bonzini | EventNotifierTestData data = { .n = 0, .active = 0 }; |
258 | b2ea25d7 | Paolo Bonzini | event_notifier_init(&data.e, false);
|
259 | f2e5dca4 | Stefan Hajnoczi | aio_set_event_notifier(ctx, &data.e, event_ready_cb); |
260 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
261 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
262 | b2ea25d7 | Paolo Bonzini | |
263 | f2e5dca4 | Stefan Hajnoczi | aio_set_event_notifier(ctx, &data.e, NULL);
|
264 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
265 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
266 | b2ea25d7 | Paolo Bonzini | event_notifier_cleanup(&data.e); |
267 | b2ea25d7 | Paolo Bonzini | } |
268 | b2ea25d7 | Paolo Bonzini | |
269 | b2ea25d7 | Paolo Bonzini | static void test_wait_event_notifier(void) |
270 | b2ea25d7 | Paolo Bonzini | { |
271 | b2ea25d7 | Paolo Bonzini | EventNotifierTestData data = { .n = 0, .active = 1 }; |
272 | b2ea25d7 | Paolo Bonzini | event_notifier_init(&data.e, false);
|
273 | f2e5dca4 | Stefan Hajnoczi | aio_set_event_notifier(ctx, &data.e, event_ready_cb); |
274 | 164a101f | Stefan Hajnoczi | g_assert(!aio_poll(ctx, false));
|
275 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
276 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.active, ==, 1);
|
277 | b2ea25d7 | Paolo Bonzini | |
278 | b2ea25d7 | Paolo Bonzini | event_notifier_set(&data.e); |
279 | b2ea25d7 | Paolo Bonzini | g_assert(aio_poll(ctx, false));
|
280 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
281 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.active, ==, 0);
|
282 | b2ea25d7 | Paolo Bonzini | |
283 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
284 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
285 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.active, ==, 0);
|
286 | b2ea25d7 | Paolo Bonzini | |
287 | f2e5dca4 | Stefan Hajnoczi | aio_set_event_notifier(ctx, &data.e, NULL);
|
288 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
289 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
290 | b2ea25d7 | Paolo Bonzini | |
291 | b2ea25d7 | Paolo Bonzini | event_notifier_cleanup(&data.e); |
292 | b2ea25d7 | Paolo Bonzini | } |
293 | b2ea25d7 | Paolo Bonzini | |
294 | b2ea25d7 | Paolo Bonzini | static void test_flush_event_notifier(void) |
295 | b2ea25d7 | Paolo Bonzini | { |
296 | b2ea25d7 | Paolo Bonzini | EventNotifierTestData data = { .n = 0, .active = 10, .auto_set = true }; |
297 | b2ea25d7 | Paolo Bonzini | event_notifier_init(&data.e, false);
|
298 | f2e5dca4 | Stefan Hajnoczi | aio_set_event_notifier(ctx, &data.e, event_ready_cb); |
299 | 164a101f | Stefan Hajnoczi | g_assert(!aio_poll(ctx, false));
|
300 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
301 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.active, ==, 10);
|
302 | b2ea25d7 | Paolo Bonzini | |
303 | b2ea25d7 | Paolo Bonzini | event_notifier_set(&data.e); |
304 | b2ea25d7 | Paolo Bonzini | g_assert(aio_poll(ctx, false));
|
305 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
306 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.active, ==, 9);
|
307 | b2ea25d7 | Paolo Bonzini | g_assert(aio_poll(ctx, false));
|
308 | b2ea25d7 | Paolo Bonzini | |
309 | 24d1a6d9 | Stefan Hajnoczi | wait_until_inactive(&data); |
310 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 10);
|
311 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.active, ==, 0);
|
312 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
313 | b2ea25d7 | Paolo Bonzini | |
314 | f2e5dca4 | Stefan Hajnoczi | aio_set_event_notifier(ctx, &data.e, NULL);
|
315 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
316 | b2ea25d7 | Paolo Bonzini | event_notifier_cleanup(&data.e); |
317 | b2ea25d7 | Paolo Bonzini | } |
318 | b2ea25d7 | Paolo Bonzini | |
319 | b2ea25d7 | Paolo Bonzini | static void test_wait_event_notifier_noflush(void) |
320 | b2ea25d7 | Paolo Bonzini | { |
321 | b2ea25d7 | Paolo Bonzini | EventNotifierTestData data = { .n = 0 };
|
322 | b2ea25d7 | Paolo Bonzini | EventNotifierTestData dummy = { .n = 0, .active = 1 }; |
323 | b2ea25d7 | Paolo Bonzini | |
324 | b2ea25d7 | Paolo Bonzini | event_notifier_init(&data.e, false);
|
325 | f2e5dca4 | Stefan Hajnoczi | aio_set_event_notifier(ctx, &data.e, event_ready_cb); |
326 | b2ea25d7 | Paolo Bonzini | |
327 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
328 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
329 | b2ea25d7 | Paolo Bonzini | |
330 | b2ea25d7 | Paolo Bonzini | /* Until there is an active descriptor, aio_poll may or may not call
|
331 | b2ea25d7 | Paolo Bonzini | * event_ready_cb. Still, it must not block. */
|
332 | b2ea25d7 | Paolo Bonzini | event_notifier_set(&data.e); |
333 | 164a101f | Stefan Hajnoczi | g_assert(aio_poll(ctx, true));
|
334 | b2ea25d7 | Paolo Bonzini | data.n = 0;
|
335 | b2ea25d7 | Paolo Bonzini | |
336 | b2ea25d7 | Paolo Bonzini | /* An active event notifier forces aio_poll to look at EventNotifiers. */
|
337 | b2ea25d7 | Paolo Bonzini | event_notifier_init(&dummy.e, false);
|
338 | f2e5dca4 | Stefan Hajnoczi | aio_set_event_notifier(ctx, &dummy.e, event_ready_cb); |
339 | b2ea25d7 | Paolo Bonzini | |
340 | b2ea25d7 | Paolo Bonzini | event_notifier_set(&data.e); |
341 | b2ea25d7 | Paolo Bonzini | g_assert(aio_poll(ctx, false));
|
342 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
343 | 164a101f | Stefan Hajnoczi | g_assert(!aio_poll(ctx, false));
|
344 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
345 | b2ea25d7 | Paolo Bonzini | |
346 | b2ea25d7 | Paolo Bonzini | event_notifier_set(&data.e); |
347 | b2ea25d7 | Paolo Bonzini | g_assert(aio_poll(ctx, false));
|
348 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 2);
|
349 | 164a101f | Stefan Hajnoczi | g_assert(!aio_poll(ctx, false));
|
350 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 2);
|
351 | b2ea25d7 | Paolo Bonzini | |
352 | b2ea25d7 | Paolo Bonzini | event_notifier_set(&dummy.e); |
353 | 24d1a6d9 | Stefan Hajnoczi | wait_until_inactive(&dummy); |
354 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 2);
|
355 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(dummy.n, ==, 1);
|
356 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(dummy.active, ==, 0);
|
357 | b2ea25d7 | Paolo Bonzini | |
358 | f2e5dca4 | Stefan Hajnoczi | aio_set_event_notifier(ctx, &dummy.e, NULL);
|
359 | b2ea25d7 | Paolo Bonzini | event_notifier_cleanup(&dummy.e); |
360 | b2ea25d7 | Paolo Bonzini | |
361 | f2e5dca4 | Stefan Hajnoczi | aio_set_event_notifier(ctx, &data.e, NULL);
|
362 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
363 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 2);
|
364 | b2ea25d7 | Paolo Bonzini | |
365 | b2ea25d7 | Paolo Bonzini | event_notifier_cleanup(&data.e); |
366 | b2ea25d7 | Paolo Bonzini | } |
367 | b2ea25d7 | Paolo Bonzini | |
368 | b53edf97 | Alex Bligh | static void test_timer_schedule(void) |
369 | b53edf97 | Alex Bligh | { |
370 | b53edf97 | Alex Bligh | TimerTestData data = { .n = 0, .ctx = ctx, .ns = SCALE_MS * 750LL, |
371 | b53edf97 | Alex Bligh | .max = 2,
|
372 | b53edf97 | Alex Bligh | .clock_type = QEMU_CLOCK_VIRTUAL }; |
373 | b53edf97 | Alex Bligh | int pipefd[2]; |
374 | b53edf97 | Alex Bligh | |
375 | b53edf97 | Alex Bligh | /* aio_poll will not block to wait for timers to complete unless it has
|
376 | b53edf97 | Alex Bligh | * an fd to wait on. Fixing this breaks other tests. So create a dummy one.
|
377 | b53edf97 | Alex Bligh | */
|
378 | a94a3fac | Alex Bligh | g_assert(!qemu_pipe(pipefd)); |
379 | a94a3fac | Alex Bligh | qemu_set_nonblock(pipefd[0]);
|
380 | a94a3fac | Alex Bligh | qemu_set_nonblock(pipefd[1]);
|
381 | a94a3fac | Alex Bligh | |
382 | b53edf97 | Alex Bligh | aio_set_fd_handler(ctx, pipefd[0],
|
383 | 91c68f14 | Alex Bligh | dummy_io_handler_read, NULL, NULL); |
384 | b53edf97 | Alex Bligh | aio_poll(ctx, false);
|
385 | b53edf97 | Alex Bligh | |
386 | b53edf97 | Alex Bligh | aio_timer_init(ctx, &data.timer, data.clock_type, |
387 | b53edf97 | Alex Bligh | SCALE_NS, timer_test_cb, &data); |
388 | b53edf97 | Alex Bligh | timer_mod(&data.timer, |
389 | b53edf97 | Alex Bligh | qemu_clock_get_ns(data.clock_type) + |
390 | b53edf97 | Alex Bligh | data.ns); |
391 | b53edf97 | Alex Bligh | |
392 | b53edf97 | Alex Bligh | g_assert_cmpint(data.n, ==, 0);
|
393 | b53edf97 | Alex Bligh | |
394 | b53edf97 | Alex Bligh | /* timer_mod may well cause an event notifer to have gone off,
|
395 | b53edf97 | Alex Bligh | * so clear that
|
396 | b53edf97 | Alex Bligh | */
|
397 | b53edf97 | Alex Bligh | do {} while (aio_poll(ctx, false)); |
398 | b53edf97 | Alex Bligh | |
399 | b53edf97 | Alex Bligh | g_assert(!aio_poll(ctx, false));
|
400 | b53edf97 | Alex Bligh | g_assert_cmpint(data.n, ==, 0);
|
401 | b53edf97 | Alex Bligh | |
402 | fcdda211 | Alex Bligh | g_usleep(1 * G_USEC_PER_SEC);
|
403 | b53edf97 | Alex Bligh | g_assert_cmpint(data.n, ==, 0);
|
404 | b53edf97 | Alex Bligh | |
405 | b53edf97 | Alex Bligh | g_assert(aio_poll(ctx, false));
|
406 | b53edf97 | Alex Bligh | g_assert_cmpint(data.n, ==, 1);
|
407 | b53edf97 | Alex Bligh | |
408 | b53edf97 | Alex Bligh | /* timer_mod called by our callback */
|
409 | b53edf97 | Alex Bligh | do {} while (aio_poll(ctx, false)); |
410 | b53edf97 | Alex Bligh | |
411 | b53edf97 | Alex Bligh | g_assert(!aio_poll(ctx, false));
|
412 | b53edf97 | Alex Bligh | g_assert_cmpint(data.n, ==, 1);
|
413 | b53edf97 | Alex Bligh | |
414 | b53edf97 | Alex Bligh | g_assert(aio_poll(ctx, true));
|
415 | b53edf97 | Alex Bligh | g_assert_cmpint(data.n, ==, 2);
|
416 | b53edf97 | Alex Bligh | |
417 | b53edf97 | Alex Bligh | /* As max is now 2, an event notifier should not have gone off */
|
418 | b53edf97 | Alex Bligh | |
419 | b53edf97 | Alex Bligh | g_assert(!aio_poll(ctx, false));
|
420 | b53edf97 | Alex Bligh | g_assert_cmpint(data.n, ==, 2);
|
421 | b53edf97 | Alex Bligh | |
422 | b53edf97 | Alex Bligh | aio_set_fd_handler(ctx, pipefd[0], NULL, NULL, NULL); |
423 | b53edf97 | Alex Bligh | close(pipefd[0]);
|
424 | b53edf97 | Alex Bligh | close(pipefd[1]);
|
425 | b53edf97 | Alex Bligh | |
426 | b53edf97 | Alex Bligh | timer_del(&data.timer); |
427 | b53edf97 | Alex Bligh | } |
428 | b53edf97 | Alex Bligh | |
429 | b2ea25d7 | Paolo Bonzini | /* Now the same tests, using the context as a GSource. They are
|
430 | b2ea25d7 | Paolo Bonzini | * very similar to the ones above, with g_main_context_iteration
|
431 | b2ea25d7 | Paolo Bonzini | * replacing aio_poll. However:
|
432 | b2ea25d7 | Paolo Bonzini | * - sometimes both the AioContext and the glib main loop wake
|
433 | b2ea25d7 | Paolo Bonzini | * themselves up. Hence, some "g_assert(!aio_poll(ctx, false));"
|
434 | b2ea25d7 | Paolo Bonzini | * are replaced by "while (g_main_context_iteration(NULL, false));".
|
435 | 9fe3781f | Stefan Hajnoczi | * - there is no exact replacement for a blocking wait.
|
436 | b2ea25d7 | Paolo Bonzini | * "while (g_main_context_iteration(NULL, true)" seems to work,
|
437 | b2ea25d7 | Paolo Bonzini | * but it is not documented _why_ it works. For these tests a
|
438 | b2ea25d7 | Paolo Bonzini | * non-blocking loop like "while (g_main_context_iteration(NULL, false)"
|
439 | b2ea25d7 | Paolo Bonzini | * works well, and that's what I am using.
|
440 | b2ea25d7 | Paolo Bonzini | */
|
441 | b2ea25d7 | Paolo Bonzini | |
442 | b2ea25d7 | Paolo Bonzini | static void test_source_notify(void) |
443 | b2ea25d7 | Paolo Bonzini | { |
444 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
445 | b2ea25d7 | Paolo Bonzini | aio_notify(ctx); |
446 | b2ea25d7 | Paolo Bonzini | g_assert(g_main_context_iteration(NULL, true)); |
447 | b2ea25d7 | Paolo Bonzini | g_assert(!g_main_context_iteration(NULL, false)); |
448 | b2ea25d7 | Paolo Bonzini | } |
449 | b2ea25d7 | Paolo Bonzini | |
450 | b2ea25d7 | Paolo Bonzini | static void test_source_flush(void) |
451 | b2ea25d7 | Paolo Bonzini | { |
452 | b2ea25d7 | Paolo Bonzini | g_assert(!g_main_context_iteration(NULL, false)); |
453 | b2ea25d7 | Paolo Bonzini | aio_notify(ctx); |
454 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
455 | b2ea25d7 | Paolo Bonzini | g_assert(!g_main_context_iteration(NULL, false)); |
456 | b2ea25d7 | Paolo Bonzini | } |
457 | b2ea25d7 | Paolo Bonzini | |
458 | b2ea25d7 | Paolo Bonzini | static void test_source_bh_schedule(void) |
459 | b2ea25d7 | Paolo Bonzini | { |
460 | b2ea25d7 | Paolo Bonzini | BHTestData data = { .n = 0 };
|
461 | b2ea25d7 | Paolo Bonzini | data.bh = aio_bh_new(ctx, bh_test_cb, &data); |
462 | b2ea25d7 | Paolo Bonzini | |
463 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data.bh); |
464 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
465 | b2ea25d7 | Paolo Bonzini | |
466 | b2ea25d7 | Paolo Bonzini | g_assert(g_main_context_iteration(NULL, true)); |
467 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
468 | b2ea25d7 | Paolo Bonzini | |
469 | b2ea25d7 | Paolo Bonzini | g_assert(!g_main_context_iteration(NULL, false)); |
470 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
471 | b2ea25d7 | Paolo Bonzini | qemu_bh_delete(data.bh); |
472 | b2ea25d7 | Paolo Bonzini | } |
473 | b2ea25d7 | Paolo Bonzini | |
474 | b2ea25d7 | Paolo Bonzini | static void test_source_bh_schedule10(void) |
475 | b2ea25d7 | Paolo Bonzini | { |
476 | b2ea25d7 | Paolo Bonzini | BHTestData data = { .n = 0, .max = 10 }; |
477 | b2ea25d7 | Paolo Bonzini | data.bh = aio_bh_new(ctx, bh_test_cb, &data); |
478 | b2ea25d7 | Paolo Bonzini | |
479 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data.bh); |
480 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
481 | b2ea25d7 | Paolo Bonzini | |
482 | b2ea25d7 | Paolo Bonzini | g_assert(g_main_context_iteration(NULL, false)); |
483 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
484 | b2ea25d7 | Paolo Bonzini | |
485 | b2ea25d7 | Paolo Bonzini | g_assert(g_main_context_iteration(NULL, true)); |
486 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 2);
|
487 | b2ea25d7 | Paolo Bonzini | |
488 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
489 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 10);
|
490 | b2ea25d7 | Paolo Bonzini | |
491 | b2ea25d7 | Paolo Bonzini | g_assert(!g_main_context_iteration(NULL, false)); |
492 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 10);
|
493 | b2ea25d7 | Paolo Bonzini | qemu_bh_delete(data.bh); |
494 | b2ea25d7 | Paolo Bonzini | } |
495 | b2ea25d7 | Paolo Bonzini | |
496 | b2ea25d7 | Paolo Bonzini | static void test_source_bh_cancel(void) |
497 | b2ea25d7 | Paolo Bonzini | { |
498 | b2ea25d7 | Paolo Bonzini | BHTestData data = { .n = 0 };
|
499 | b2ea25d7 | Paolo Bonzini | data.bh = aio_bh_new(ctx, bh_test_cb, &data); |
500 | b2ea25d7 | Paolo Bonzini | |
501 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data.bh); |
502 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
503 | b2ea25d7 | Paolo Bonzini | |
504 | b2ea25d7 | Paolo Bonzini | qemu_bh_cancel(data.bh); |
505 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
506 | b2ea25d7 | Paolo Bonzini | |
507 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
508 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
509 | b2ea25d7 | Paolo Bonzini | qemu_bh_delete(data.bh); |
510 | b2ea25d7 | Paolo Bonzini | } |
511 | b2ea25d7 | Paolo Bonzini | |
512 | b2ea25d7 | Paolo Bonzini | static void test_source_bh_delete(void) |
513 | b2ea25d7 | Paolo Bonzini | { |
514 | b2ea25d7 | Paolo Bonzini | BHTestData data = { .n = 0 };
|
515 | b2ea25d7 | Paolo Bonzini | data.bh = aio_bh_new(ctx, bh_test_cb, &data); |
516 | b2ea25d7 | Paolo Bonzini | |
517 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data.bh); |
518 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
519 | b2ea25d7 | Paolo Bonzini | |
520 | b2ea25d7 | Paolo Bonzini | qemu_bh_delete(data.bh); |
521 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
522 | b2ea25d7 | Paolo Bonzini | |
523 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
524 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
525 | b2ea25d7 | Paolo Bonzini | } |
526 | b2ea25d7 | Paolo Bonzini | |
527 | b2ea25d7 | Paolo Bonzini | static void test_source_bh_delete_from_cb(void) |
528 | b2ea25d7 | Paolo Bonzini | { |
529 | b2ea25d7 | Paolo Bonzini | BHTestData data1 = { .n = 0, .max = 1 }; |
530 | b2ea25d7 | Paolo Bonzini | |
531 | b2ea25d7 | Paolo Bonzini | data1.bh = aio_bh_new(ctx, bh_delete_cb, &data1); |
532 | b2ea25d7 | Paolo Bonzini | |
533 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data1.bh); |
534 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data1.n, ==, 0);
|
535 | b2ea25d7 | Paolo Bonzini | |
536 | b2ea25d7 | Paolo Bonzini | g_main_context_iteration(NULL, true); |
537 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data1.n, ==, data1.max); |
538 | b2ea25d7 | Paolo Bonzini | g_assert(data1.bh == NULL);
|
539 | b2ea25d7 | Paolo Bonzini | |
540 | b2ea25d7 | Paolo Bonzini | g_assert(!g_main_context_iteration(NULL, false)); |
541 | b2ea25d7 | Paolo Bonzini | } |
542 | b2ea25d7 | Paolo Bonzini | |
543 | b2ea25d7 | Paolo Bonzini | static void test_source_bh_delete_from_cb_many(void) |
544 | b2ea25d7 | Paolo Bonzini | { |
545 | b2ea25d7 | Paolo Bonzini | BHTestData data1 = { .n = 0, .max = 1 }; |
546 | b2ea25d7 | Paolo Bonzini | BHTestData data2 = { .n = 0, .max = 3 }; |
547 | b2ea25d7 | Paolo Bonzini | BHTestData data3 = { .n = 0, .max = 2 }; |
548 | b2ea25d7 | Paolo Bonzini | BHTestData data4 = { .n = 0, .max = 4 }; |
549 | b2ea25d7 | Paolo Bonzini | |
550 | b2ea25d7 | Paolo Bonzini | data1.bh = aio_bh_new(ctx, bh_delete_cb, &data1); |
551 | b2ea25d7 | Paolo Bonzini | data2.bh = aio_bh_new(ctx, bh_delete_cb, &data2); |
552 | b2ea25d7 | Paolo Bonzini | data3.bh = aio_bh_new(ctx, bh_delete_cb, &data3); |
553 | b2ea25d7 | Paolo Bonzini | data4.bh = aio_bh_new(ctx, bh_delete_cb, &data4); |
554 | b2ea25d7 | Paolo Bonzini | |
555 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data1.bh); |
556 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data2.bh); |
557 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data3.bh); |
558 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data4.bh); |
559 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data1.n, ==, 0);
|
560 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data2.n, ==, 0);
|
561 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data3.n, ==, 0);
|
562 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data4.n, ==, 0);
|
563 | b2ea25d7 | Paolo Bonzini | |
564 | b2ea25d7 | Paolo Bonzini | g_assert(g_main_context_iteration(NULL, false)); |
565 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data1.n, ==, 1);
|
566 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data2.n, ==, 1);
|
567 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data3.n, ==, 1);
|
568 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data4.n, ==, 1);
|
569 | b2ea25d7 | Paolo Bonzini | g_assert(data1.bh == NULL);
|
570 | b2ea25d7 | Paolo Bonzini | |
571 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
572 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data1.n, ==, data1.max); |
573 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data2.n, ==, data2.max); |
574 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data3.n, ==, data3.max); |
575 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data4.n, ==, data4.max); |
576 | b2ea25d7 | Paolo Bonzini | g_assert(data1.bh == NULL);
|
577 | b2ea25d7 | Paolo Bonzini | g_assert(data2.bh == NULL);
|
578 | b2ea25d7 | Paolo Bonzini | g_assert(data3.bh == NULL);
|
579 | b2ea25d7 | Paolo Bonzini | g_assert(data4.bh == NULL);
|
580 | b2ea25d7 | Paolo Bonzini | } |
581 | b2ea25d7 | Paolo Bonzini | |
582 | b2ea25d7 | Paolo Bonzini | static void test_source_bh_flush(void) |
583 | b2ea25d7 | Paolo Bonzini | { |
584 | b2ea25d7 | Paolo Bonzini | BHTestData data = { .n = 0 };
|
585 | b2ea25d7 | Paolo Bonzini | data.bh = aio_bh_new(ctx, bh_test_cb, &data); |
586 | b2ea25d7 | Paolo Bonzini | |
587 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data.bh); |
588 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
589 | b2ea25d7 | Paolo Bonzini | |
590 | b2ea25d7 | Paolo Bonzini | g_assert(g_main_context_iteration(NULL, true)); |
591 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
592 | b2ea25d7 | Paolo Bonzini | |
593 | b2ea25d7 | Paolo Bonzini | g_assert(!g_main_context_iteration(NULL, false)); |
594 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
595 | b2ea25d7 | Paolo Bonzini | qemu_bh_delete(data.bh); |
596 | b2ea25d7 | Paolo Bonzini | } |
597 | b2ea25d7 | Paolo Bonzini | |
598 | b2ea25d7 | Paolo Bonzini | static void test_source_set_event_notifier(void) |
599 | b2ea25d7 | Paolo Bonzini | { |
600 | b2ea25d7 | Paolo Bonzini | EventNotifierTestData data = { .n = 0, .active = 0 }; |
601 | b2ea25d7 | Paolo Bonzini | event_notifier_init(&data.e, false);
|
602 | f2e5dca4 | Stefan Hajnoczi | aio_set_event_notifier(ctx, &data.e, event_ready_cb); |
603 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
604 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
605 | b2ea25d7 | Paolo Bonzini | |
606 | f2e5dca4 | Stefan Hajnoczi | aio_set_event_notifier(ctx, &data.e, NULL);
|
607 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
608 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
609 | b2ea25d7 | Paolo Bonzini | event_notifier_cleanup(&data.e); |
610 | b2ea25d7 | Paolo Bonzini | } |
611 | b2ea25d7 | Paolo Bonzini | |
612 | b2ea25d7 | Paolo Bonzini | static void test_source_wait_event_notifier(void) |
613 | b2ea25d7 | Paolo Bonzini | { |
614 | b2ea25d7 | Paolo Bonzini | EventNotifierTestData data = { .n = 0, .active = 1 }; |
615 | b2ea25d7 | Paolo Bonzini | event_notifier_init(&data.e, false);
|
616 | f2e5dca4 | Stefan Hajnoczi | aio_set_event_notifier(ctx, &data.e, event_ready_cb); |
617 | b2ea25d7 | Paolo Bonzini | g_assert(g_main_context_iteration(NULL, false)); |
618 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
619 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.active, ==, 1);
|
620 | b2ea25d7 | Paolo Bonzini | |
621 | b2ea25d7 | Paolo Bonzini | event_notifier_set(&data.e); |
622 | b2ea25d7 | Paolo Bonzini | g_assert(g_main_context_iteration(NULL, false)); |
623 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
624 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.active, ==, 0);
|
625 | b2ea25d7 | Paolo Bonzini | |
626 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
627 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
628 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.active, ==, 0);
|
629 | b2ea25d7 | Paolo Bonzini | |
630 | f2e5dca4 | Stefan Hajnoczi | aio_set_event_notifier(ctx, &data.e, NULL);
|
631 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
632 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
633 | b2ea25d7 | Paolo Bonzini | |
634 | b2ea25d7 | Paolo Bonzini | event_notifier_cleanup(&data.e); |
635 | b2ea25d7 | Paolo Bonzini | } |
636 | b2ea25d7 | Paolo Bonzini | |
637 | b2ea25d7 | Paolo Bonzini | static void test_source_flush_event_notifier(void) |
638 | b2ea25d7 | Paolo Bonzini | { |
639 | b2ea25d7 | Paolo Bonzini | EventNotifierTestData data = { .n = 0, .active = 10, .auto_set = true }; |
640 | b2ea25d7 | Paolo Bonzini | event_notifier_init(&data.e, false);
|
641 | f2e5dca4 | Stefan Hajnoczi | aio_set_event_notifier(ctx, &data.e, event_ready_cb); |
642 | b2ea25d7 | Paolo Bonzini | g_assert(g_main_context_iteration(NULL, false)); |
643 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
644 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.active, ==, 10);
|
645 | b2ea25d7 | Paolo Bonzini | |
646 | b2ea25d7 | Paolo Bonzini | event_notifier_set(&data.e); |
647 | b2ea25d7 | Paolo Bonzini | g_assert(g_main_context_iteration(NULL, false)); |
648 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
649 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.active, ==, 9);
|
650 | b2ea25d7 | Paolo Bonzini | g_assert(g_main_context_iteration(NULL, false)); |
651 | b2ea25d7 | Paolo Bonzini | |
652 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
653 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 10);
|
654 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.active, ==, 0);
|
655 | b2ea25d7 | Paolo Bonzini | g_assert(!g_main_context_iteration(NULL, false)); |
656 | b2ea25d7 | Paolo Bonzini | |
657 | f2e5dca4 | Stefan Hajnoczi | aio_set_event_notifier(ctx, &data.e, NULL);
|
658 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
659 | b2ea25d7 | Paolo Bonzini | event_notifier_cleanup(&data.e); |
660 | b2ea25d7 | Paolo Bonzini | } |
661 | b2ea25d7 | Paolo Bonzini | |
662 | b2ea25d7 | Paolo Bonzini | static void test_source_wait_event_notifier_noflush(void) |
663 | b2ea25d7 | Paolo Bonzini | { |
664 | b2ea25d7 | Paolo Bonzini | EventNotifierTestData data = { .n = 0 };
|
665 | b2ea25d7 | Paolo Bonzini | EventNotifierTestData dummy = { .n = 0, .active = 1 }; |
666 | b2ea25d7 | Paolo Bonzini | |
667 | b2ea25d7 | Paolo Bonzini | event_notifier_init(&data.e, false);
|
668 | f2e5dca4 | Stefan Hajnoczi | aio_set_event_notifier(ctx, &data.e, event_ready_cb); |
669 | b2ea25d7 | Paolo Bonzini | |
670 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
671 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
672 | b2ea25d7 | Paolo Bonzini | |
673 | b2ea25d7 | Paolo Bonzini | /* Until there is an active descriptor, glib may or may not call
|
674 | b2ea25d7 | Paolo Bonzini | * event_ready_cb. Still, it must not block. */
|
675 | b2ea25d7 | Paolo Bonzini | event_notifier_set(&data.e); |
676 | b2ea25d7 | Paolo Bonzini | g_main_context_iteration(NULL, true); |
677 | b2ea25d7 | Paolo Bonzini | data.n = 0;
|
678 | b2ea25d7 | Paolo Bonzini | |
679 | b2ea25d7 | Paolo Bonzini | /* An active event notifier forces aio_poll to look at EventNotifiers. */
|
680 | b2ea25d7 | Paolo Bonzini | event_notifier_init(&dummy.e, false);
|
681 | f2e5dca4 | Stefan Hajnoczi | aio_set_event_notifier(ctx, &dummy.e, event_ready_cb); |
682 | b2ea25d7 | Paolo Bonzini | |
683 | b2ea25d7 | Paolo Bonzini | event_notifier_set(&data.e); |
684 | b2ea25d7 | Paolo Bonzini | g_assert(g_main_context_iteration(NULL, false)); |
685 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
686 | b2ea25d7 | Paolo Bonzini | g_assert(!g_main_context_iteration(NULL, false)); |
687 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
688 | b2ea25d7 | Paolo Bonzini | |
689 | b2ea25d7 | Paolo Bonzini | event_notifier_set(&data.e); |
690 | b2ea25d7 | Paolo Bonzini | g_assert(g_main_context_iteration(NULL, false)); |
691 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 2);
|
692 | b2ea25d7 | Paolo Bonzini | g_assert(!g_main_context_iteration(NULL, false)); |
693 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 2);
|
694 | b2ea25d7 | Paolo Bonzini | |
695 | b2ea25d7 | Paolo Bonzini | event_notifier_set(&dummy.e); |
696 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
697 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 2);
|
698 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(dummy.n, ==, 1);
|
699 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(dummy.active, ==, 0);
|
700 | b2ea25d7 | Paolo Bonzini | |
701 | f2e5dca4 | Stefan Hajnoczi | aio_set_event_notifier(ctx, &dummy.e, NULL);
|
702 | b2ea25d7 | Paolo Bonzini | event_notifier_cleanup(&dummy.e); |
703 | b2ea25d7 | Paolo Bonzini | |
704 | f2e5dca4 | Stefan Hajnoczi | aio_set_event_notifier(ctx, &data.e, NULL);
|
705 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
706 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 2);
|
707 | b2ea25d7 | Paolo Bonzini | |
708 | b2ea25d7 | Paolo Bonzini | event_notifier_cleanup(&data.e); |
709 | b2ea25d7 | Paolo Bonzini | } |
710 | b2ea25d7 | Paolo Bonzini | |
711 | b53edf97 | Alex Bligh | static void test_source_timer_schedule(void) |
712 | b53edf97 | Alex Bligh | { |
713 | b53edf97 | Alex Bligh | TimerTestData data = { .n = 0, .ctx = ctx, .ns = SCALE_MS * 750LL, |
714 | b53edf97 | Alex Bligh | .max = 2,
|
715 | b53edf97 | Alex Bligh | .clock_type = QEMU_CLOCK_VIRTUAL }; |
716 | b53edf97 | Alex Bligh | int pipefd[2]; |
717 | b53edf97 | Alex Bligh | int64_t expiry; |
718 | b53edf97 | Alex Bligh | |
719 | b53edf97 | Alex Bligh | /* aio_poll will not block to wait for timers to complete unless it has
|
720 | b53edf97 | Alex Bligh | * an fd to wait on. Fixing this breaks other tests. So create a dummy one.
|
721 | b53edf97 | Alex Bligh | */
|
722 | a94a3fac | Alex Bligh | g_assert(!qemu_pipe(pipefd)); |
723 | a94a3fac | Alex Bligh | qemu_set_nonblock(pipefd[0]);
|
724 | a94a3fac | Alex Bligh | qemu_set_nonblock(pipefd[1]);
|
725 | a94a3fac | Alex Bligh | |
726 | b53edf97 | Alex Bligh | aio_set_fd_handler(ctx, pipefd[0],
|
727 | 91c68f14 | Alex Bligh | dummy_io_handler_read, NULL, NULL); |
728 | b53edf97 | Alex Bligh | do {} while (g_main_context_iteration(NULL, false)); |
729 | b53edf97 | Alex Bligh | |
730 | b53edf97 | Alex Bligh | aio_timer_init(ctx, &data.timer, data.clock_type, |
731 | b53edf97 | Alex Bligh | SCALE_NS, timer_test_cb, &data); |
732 | b53edf97 | Alex Bligh | expiry = qemu_clock_get_ns(data.clock_type) + |
733 | b53edf97 | Alex Bligh | data.ns; |
734 | b53edf97 | Alex Bligh | timer_mod(&data.timer, expiry); |
735 | b53edf97 | Alex Bligh | |
736 | b53edf97 | Alex Bligh | g_assert_cmpint(data.n, ==, 0);
|
737 | b53edf97 | Alex Bligh | |
738 | fcdda211 | Alex Bligh | g_usleep(1 * G_USEC_PER_SEC);
|
739 | b53edf97 | Alex Bligh | g_assert_cmpint(data.n, ==, 0);
|
740 | b53edf97 | Alex Bligh | |
741 | b53edf97 | Alex Bligh | g_assert(g_main_context_iteration(NULL, false)); |
742 | b53edf97 | Alex Bligh | g_assert_cmpint(data.n, ==, 1);
|
743 | b53edf97 | Alex Bligh | |
744 | b53edf97 | Alex Bligh | /* The comment above was not kidding when it said this wakes up itself */
|
745 | b53edf97 | Alex Bligh | do {
|
746 | b53edf97 | Alex Bligh | g_assert(g_main_context_iteration(NULL, true)); |
747 | b53edf97 | Alex Bligh | } while (qemu_clock_get_ns(data.clock_type) <= expiry);
|
748 | fcdda211 | Alex Bligh | g_usleep(1 * G_USEC_PER_SEC);
|
749 | b53edf97 | Alex Bligh | g_main_context_iteration(NULL, false); |
750 | b53edf97 | Alex Bligh | |
751 | b53edf97 | Alex Bligh | g_assert_cmpint(data.n, ==, 2);
|
752 | b53edf97 | Alex Bligh | |
753 | b53edf97 | Alex Bligh | aio_set_fd_handler(ctx, pipefd[0], NULL, NULL, NULL); |
754 | b53edf97 | Alex Bligh | close(pipefd[0]);
|
755 | b53edf97 | Alex Bligh | close(pipefd[1]);
|
756 | b53edf97 | Alex Bligh | |
757 | b53edf97 | Alex Bligh | timer_del(&data.timer); |
758 | b53edf97 | Alex Bligh | } |
759 | b53edf97 | Alex Bligh | |
760 | b53edf97 | Alex Bligh | |
761 | b2ea25d7 | Paolo Bonzini | /* End of tests. */
|
762 | b2ea25d7 | Paolo Bonzini | |
763 | b2ea25d7 | Paolo Bonzini | int main(int argc, char **argv) |
764 | b2ea25d7 | Paolo Bonzini | { |
765 | b2ea25d7 | Paolo Bonzini | GSource *src; |
766 | b2ea25d7 | Paolo Bonzini | |
767 | dae21b98 | Alex Bligh | init_clocks(); |
768 | dae21b98 | Alex Bligh | |
769 | b2ea25d7 | Paolo Bonzini | ctx = aio_context_new(); |
770 | b2ea25d7 | Paolo Bonzini | src = aio_get_g_source(ctx); |
771 | b2ea25d7 | Paolo Bonzini | g_source_attach(src, NULL);
|
772 | b2ea25d7 | Paolo Bonzini | g_source_unref(src); |
773 | b2ea25d7 | Paolo Bonzini | |
774 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
775 | b2ea25d7 | Paolo Bonzini | |
776 | b2ea25d7 | Paolo Bonzini | g_test_init(&argc, &argv, NULL);
|
777 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio/notify", test_notify);
|
778 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio/bh/schedule", test_bh_schedule);
|
779 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio/bh/schedule10", test_bh_schedule10);
|
780 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio/bh/cancel", test_bh_cancel);
|
781 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio/bh/delete", test_bh_delete);
|
782 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio/bh/callback-delete/one", test_bh_delete_from_cb);
|
783 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio/bh/callback-delete/many", test_bh_delete_from_cb_many);
|
784 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio/bh/flush", test_bh_flush);
|
785 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio/event/add-remove", test_set_event_notifier);
|
786 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio/event/wait", test_wait_event_notifier);
|
787 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio/event/wait/no-flush-cb", test_wait_event_notifier_noflush);
|
788 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio/event/flush", test_flush_event_notifier);
|
789 | b53edf97 | Alex Bligh | g_test_add_func("/aio/timer/schedule", test_timer_schedule);
|
790 | b2ea25d7 | Paolo Bonzini | |
791 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio-gsource/notify", test_source_notify);
|
792 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio-gsource/flush", test_source_flush);
|
793 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio-gsource/bh/schedule", test_source_bh_schedule);
|
794 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio-gsource/bh/schedule10", test_source_bh_schedule10);
|
795 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio-gsource/bh/cancel", test_source_bh_cancel);
|
796 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio-gsource/bh/delete", test_source_bh_delete);
|
797 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio-gsource/bh/callback-delete/one", test_source_bh_delete_from_cb);
|
798 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio-gsource/bh/callback-delete/many", test_source_bh_delete_from_cb_many);
|
799 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio-gsource/bh/flush", test_source_bh_flush);
|
800 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio-gsource/event/add-remove", test_source_set_event_notifier);
|
801 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio-gsource/event/wait", test_source_wait_event_notifier);
|
802 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio-gsource/event/wait/no-flush-cb", test_source_wait_event_notifier_noflush);
|
803 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio-gsource/event/flush", test_source_flush_event_notifier);
|
804 | b53edf97 | Alex Bligh | g_test_add_func("/aio-gsource/timer/schedule", test_source_timer_schedule);
|
805 | b2ea25d7 | Paolo Bonzini | return g_test_run();
|
806 | b2ea25d7 | Paolo Bonzini | } |