root / tests / test-aio.c @ e4b42e6e
History | View | Annotate | Download (19.7 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 | b2ea25d7 | Paolo Bonzini | |
16 | b2ea25d7 | Paolo Bonzini | AioContext *ctx; |
17 | b2ea25d7 | Paolo Bonzini | |
18 | 9fe3781f | Stefan Hajnoczi | /* Wait until there are no more BHs or AIO requests */
|
19 | 9fe3781f | Stefan Hajnoczi | static void wait_for_aio(void) |
20 | 9fe3781f | Stefan Hajnoczi | { |
21 | 9fe3781f | Stefan Hajnoczi | while (aio_poll(ctx, true)) { |
22 | 9fe3781f | Stefan Hajnoczi | /* Do nothing */
|
23 | 9fe3781f | Stefan Hajnoczi | } |
24 | 9fe3781f | Stefan Hajnoczi | } |
25 | 9fe3781f | Stefan Hajnoczi | |
26 | b2ea25d7 | Paolo Bonzini | /* Simple callbacks for testing. */
|
27 | b2ea25d7 | Paolo Bonzini | |
28 | b2ea25d7 | Paolo Bonzini | typedef struct { |
29 | b2ea25d7 | Paolo Bonzini | QEMUBH *bh; |
30 | b2ea25d7 | Paolo Bonzini | int n;
|
31 | b2ea25d7 | Paolo Bonzini | int max;
|
32 | b2ea25d7 | Paolo Bonzini | } BHTestData; |
33 | b2ea25d7 | Paolo Bonzini | |
34 | b2ea25d7 | Paolo Bonzini | static void bh_test_cb(void *opaque) |
35 | b2ea25d7 | Paolo Bonzini | { |
36 | b2ea25d7 | Paolo Bonzini | BHTestData *data = opaque; |
37 | b2ea25d7 | Paolo Bonzini | if (++data->n < data->max) {
|
38 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data->bh); |
39 | b2ea25d7 | Paolo Bonzini | } |
40 | b2ea25d7 | Paolo Bonzini | } |
41 | b2ea25d7 | Paolo Bonzini | |
42 | b2ea25d7 | Paolo Bonzini | static void bh_delete_cb(void *opaque) |
43 | b2ea25d7 | Paolo Bonzini | { |
44 | b2ea25d7 | Paolo Bonzini | BHTestData *data = opaque; |
45 | b2ea25d7 | Paolo Bonzini | if (++data->n < data->max) {
|
46 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data->bh); |
47 | b2ea25d7 | Paolo Bonzini | } else {
|
48 | b2ea25d7 | Paolo Bonzini | qemu_bh_delete(data->bh); |
49 | b2ea25d7 | Paolo Bonzini | data->bh = NULL;
|
50 | b2ea25d7 | Paolo Bonzini | } |
51 | b2ea25d7 | Paolo Bonzini | } |
52 | b2ea25d7 | Paolo Bonzini | |
53 | b2ea25d7 | Paolo Bonzini | typedef struct { |
54 | b2ea25d7 | Paolo Bonzini | EventNotifier e; |
55 | b2ea25d7 | Paolo Bonzini | int n;
|
56 | b2ea25d7 | Paolo Bonzini | int active;
|
57 | b2ea25d7 | Paolo Bonzini | bool auto_set;
|
58 | b2ea25d7 | Paolo Bonzini | } EventNotifierTestData; |
59 | b2ea25d7 | Paolo Bonzini | |
60 | b2ea25d7 | Paolo Bonzini | static int event_active_cb(EventNotifier *e) |
61 | b2ea25d7 | Paolo Bonzini | { |
62 | b2ea25d7 | Paolo Bonzini | EventNotifierTestData *data = container_of(e, EventNotifierTestData, e); |
63 | b2ea25d7 | Paolo Bonzini | return data->active > 0; |
64 | b2ea25d7 | Paolo Bonzini | } |
65 | b2ea25d7 | Paolo Bonzini | |
66 | b2ea25d7 | Paolo Bonzini | static void event_ready_cb(EventNotifier *e) |
67 | b2ea25d7 | Paolo Bonzini | { |
68 | b2ea25d7 | Paolo Bonzini | EventNotifierTestData *data = container_of(e, EventNotifierTestData, e); |
69 | b2ea25d7 | Paolo Bonzini | g_assert(event_notifier_test_and_clear(e)); |
70 | b2ea25d7 | Paolo Bonzini | data->n++; |
71 | b2ea25d7 | Paolo Bonzini | if (data->active > 0) { |
72 | b2ea25d7 | Paolo Bonzini | data->active--; |
73 | b2ea25d7 | Paolo Bonzini | } |
74 | b2ea25d7 | Paolo Bonzini | if (data->auto_set && data->active) {
|
75 | b2ea25d7 | Paolo Bonzini | event_notifier_set(e); |
76 | b2ea25d7 | Paolo Bonzini | } |
77 | b2ea25d7 | Paolo Bonzini | } |
78 | b2ea25d7 | Paolo Bonzini | |
79 | b2ea25d7 | Paolo Bonzini | /* Tests using aio_*. */
|
80 | b2ea25d7 | Paolo Bonzini | |
81 | b2ea25d7 | Paolo Bonzini | static void test_notify(void) |
82 | b2ea25d7 | Paolo Bonzini | { |
83 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
84 | b2ea25d7 | Paolo Bonzini | aio_notify(ctx); |
85 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, true));
|
86 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
87 | b2ea25d7 | Paolo Bonzini | } |
88 | b2ea25d7 | Paolo Bonzini | |
89 | b2ea25d7 | Paolo Bonzini | static void test_bh_schedule(void) |
90 | b2ea25d7 | Paolo Bonzini | { |
91 | b2ea25d7 | Paolo Bonzini | BHTestData data = { .n = 0 };
|
92 | b2ea25d7 | Paolo Bonzini | data.bh = aio_bh_new(ctx, bh_test_cb, &data); |
93 | b2ea25d7 | Paolo Bonzini | |
94 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data.bh); |
95 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
96 | b2ea25d7 | Paolo Bonzini | |
97 | b2ea25d7 | Paolo Bonzini | g_assert(aio_poll(ctx, true));
|
98 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
99 | b2ea25d7 | Paolo Bonzini | |
100 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
101 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
102 | b2ea25d7 | Paolo Bonzini | qemu_bh_delete(data.bh); |
103 | b2ea25d7 | Paolo Bonzini | } |
104 | b2ea25d7 | Paolo Bonzini | |
105 | b2ea25d7 | Paolo Bonzini | static void test_bh_schedule10(void) |
106 | b2ea25d7 | Paolo Bonzini | { |
107 | b2ea25d7 | Paolo Bonzini | BHTestData data = { .n = 0, .max = 10 }; |
108 | b2ea25d7 | Paolo Bonzini | data.bh = aio_bh_new(ctx, bh_test_cb, &data); |
109 | b2ea25d7 | Paolo Bonzini | |
110 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data.bh); |
111 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
112 | b2ea25d7 | Paolo Bonzini | |
113 | b2ea25d7 | Paolo Bonzini | g_assert(aio_poll(ctx, false));
|
114 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
115 | b2ea25d7 | Paolo Bonzini | |
116 | b2ea25d7 | Paolo Bonzini | g_assert(aio_poll(ctx, true));
|
117 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 2);
|
118 | b2ea25d7 | Paolo Bonzini | |
119 | 9fe3781f | Stefan Hajnoczi | wait_for_aio(); |
120 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 10);
|
121 | b2ea25d7 | Paolo Bonzini | |
122 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
123 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 10);
|
124 | b2ea25d7 | Paolo Bonzini | qemu_bh_delete(data.bh); |
125 | b2ea25d7 | Paolo Bonzini | } |
126 | b2ea25d7 | Paolo Bonzini | |
127 | b2ea25d7 | Paolo Bonzini | static void test_bh_cancel(void) |
128 | b2ea25d7 | Paolo Bonzini | { |
129 | b2ea25d7 | Paolo Bonzini | BHTestData data = { .n = 0 };
|
130 | b2ea25d7 | Paolo Bonzini | data.bh = aio_bh_new(ctx, bh_test_cb, &data); |
131 | b2ea25d7 | Paolo Bonzini | |
132 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data.bh); |
133 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
134 | b2ea25d7 | Paolo Bonzini | |
135 | b2ea25d7 | Paolo Bonzini | qemu_bh_cancel(data.bh); |
136 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
137 | b2ea25d7 | Paolo Bonzini | |
138 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
139 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
140 | b2ea25d7 | Paolo Bonzini | qemu_bh_delete(data.bh); |
141 | b2ea25d7 | Paolo Bonzini | } |
142 | b2ea25d7 | Paolo Bonzini | |
143 | b2ea25d7 | Paolo Bonzini | static void test_bh_delete(void) |
144 | b2ea25d7 | Paolo Bonzini | { |
145 | b2ea25d7 | Paolo Bonzini | BHTestData data = { .n = 0 };
|
146 | b2ea25d7 | Paolo Bonzini | data.bh = aio_bh_new(ctx, bh_test_cb, &data); |
147 | b2ea25d7 | Paolo Bonzini | |
148 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data.bh); |
149 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
150 | b2ea25d7 | Paolo Bonzini | |
151 | b2ea25d7 | Paolo Bonzini | qemu_bh_delete(data.bh); |
152 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
153 | b2ea25d7 | Paolo Bonzini | |
154 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
155 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
156 | b2ea25d7 | Paolo Bonzini | } |
157 | b2ea25d7 | Paolo Bonzini | |
158 | b2ea25d7 | Paolo Bonzini | static void test_bh_delete_from_cb(void) |
159 | b2ea25d7 | Paolo Bonzini | { |
160 | b2ea25d7 | Paolo Bonzini | BHTestData data1 = { .n = 0, .max = 1 }; |
161 | b2ea25d7 | Paolo Bonzini | |
162 | b2ea25d7 | Paolo Bonzini | data1.bh = aio_bh_new(ctx, bh_delete_cb, &data1); |
163 | b2ea25d7 | Paolo Bonzini | |
164 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data1.bh); |
165 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data1.n, ==, 0);
|
166 | b2ea25d7 | Paolo Bonzini | |
167 | 9fe3781f | Stefan Hajnoczi | wait_for_aio(); |
168 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data1.n, ==, data1.max); |
169 | b2ea25d7 | Paolo Bonzini | g_assert(data1.bh == NULL);
|
170 | b2ea25d7 | Paolo Bonzini | |
171 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
172 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, true));
|
173 | b2ea25d7 | Paolo Bonzini | } |
174 | b2ea25d7 | Paolo Bonzini | |
175 | b2ea25d7 | Paolo Bonzini | static void test_bh_delete_from_cb_many(void) |
176 | b2ea25d7 | Paolo Bonzini | { |
177 | b2ea25d7 | Paolo Bonzini | BHTestData data1 = { .n = 0, .max = 1 }; |
178 | b2ea25d7 | Paolo Bonzini | BHTestData data2 = { .n = 0, .max = 3 }; |
179 | b2ea25d7 | Paolo Bonzini | BHTestData data3 = { .n = 0, .max = 2 }; |
180 | b2ea25d7 | Paolo Bonzini | BHTestData data4 = { .n = 0, .max = 4 }; |
181 | b2ea25d7 | Paolo Bonzini | |
182 | b2ea25d7 | Paolo Bonzini | data1.bh = aio_bh_new(ctx, bh_delete_cb, &data1); |
183 | b2ea25d7 | Paolo Bonzini | data2.bh = aio_bh_new(ctx, bh_delete_cb, &data2); |
184 | b2ea25d7 | Paolo Bonzini | data3.bh = aio_bh_new(ctx, bh_delete_cb, &data3); |
185 | b2ea25d7 | Paolo Bonzini | data4.bh = aio_bh_new(ctx, bh_delete_cb, &data4); |
186 | b2ea25d7 | Paolo Bonzini | |
187 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data1.bh); |
188 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data2.bh); |
189 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data3.bh); |
190 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data4.bh); |
191 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data1.n, ==, 0);
|
192 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data2.n, ==, 0);
|
193 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data3.n, ==, 0);
|
194 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data4.n, ==, 0);
|
195 | b2ea25d7 | Paolo Bonzini | |
196 | b2ea25d7 | Paolo Bonzini | g_assert(aio_poll(ctx, false));
|
197 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data1.n, ==, 1);
|
198 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data2.n, ==, 1);
|
199 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data3.n, ==, 1);
|
200 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data4.n, ==, 1);
|
201 | b2ea25d7 | Paolo Bonzini | g_assert(data1.bh == NULL);
|
202 | b2ea25d7 | Paolo Bonzini | |
203 | 9fe3781f | Stefan Hajnoczi | wait_for_aio(); |
204 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data1.n, ==, data1.max); |
205 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data2.n, ==, data2.max); |
206 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data3.n, ==, data3.max); |
207 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data4.n, ==, data4.max); |
208 | b2ea25d7 | Paolo Bonzini | g_assert(data1.bh == NULL);
|
209 | b2ea25d7 | Paolo Bonzini | g_assert(data2.bh == NULL);
|
210 | b2ea25d7 | Paolo Bonzini | g_assert(data3.bh == NULL);
|
211 | b2ea25d7 | Paolo Bonzini | g_assert(data4.bh == NULL);
|
212 | b2ea25d7 | Paolo Bonzini | } |
213 | b2ea25d7 | Paolo Bonzini | |
214 | b2ea25d7 | Paolo Bonzini | static void test_bh_flush(void) |
215 | b2ea25d7 | Paolo Bonzini | { |
216 | b2ea25d7 | Paolo Bonzini | BHTestData data = { .n = 0 };
|
217 | b2ea25d7 | Paolo Bonzini | data.bh = aio_bh_new(ctx, bh_test_cb, &data); |
218 | b2ea25d7 | Paolo Bonzini | |
219 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data.bh); |
220 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
221 | b2ea25d7 | Paolo Bonzini | |
222 | 9fe3781f | Stefan Hajnoczi | wait_for_aio(); |
223 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
224 | b2ea25d7 | Paolo Bonzini | |
225 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
226 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
227 | b2ea25d7 | Paolo Bonzini | qemu_bh_delete(data.bh); |
228 | b2ea25d7 | Paolo Bonzini | } |
229 | b2ea25d7 | Paolo Bonzini | |
230 | b2ea25d7 | Paolo Bonzini | static void test_set_event_notifier(void) |
231 | b2ea25d7 | Paolo Bonzini | { |
232 | b2ea25d7 | Paolo Bonzini | EventNotifierTestData data = { .n = 0, .active = 0 }; |
233 | b2ea25d7 | Paolo Bonzini | event_notifier_init(&data.e, false);
|
234 | b2ea25d7 | Paolo Bonzini | aio_set_event_notifier(ctx, &data.e, event_ready_cb, event_active_cb); |
235 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
236 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
237 | b2ea25d7 | Paolo Bonzini | |
238 | b2ea25d7 | Paolo Bonzini | aio_set_event_notifier(ctx, &data.e, NULL, NULL); |
239 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
240 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
241 | b2ea25d7 | Paolo Bonzini | event_notifier_cleanup(&data.e); |
242 | b2ea25d7 | Paolo Bonzini | } |
243 | b2ea25d7 | Paolo Bonzini | |
244 | b2ea25d7 | Paolo Bonzini | static void test_wait_event_notifier(void) |
245 | b2ea25d7 | Paolo Bonzini | { |
246 | b2ea25d7 | Paolo Bonzini | EventNotifierTestData data = { .n = 0, .active = 1 }; |
247 | b2ea25d7 | Paolo Bonzini | event_notifier_init(&data.e, false);
|
248 | b2ea25d7 | Paolo Bonzini | aio_set_event_notifier(ctx, &data.e, event_ready_cb, event_active_cb); |
249 | b2ea25d7 | Paolo Bonzini | g_assert(aio_poll(ctx, false));
|
250 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
251 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.active, ==, 1);
|
252 | b2ea25d7 | Paolo Bonzini | |
253 | b2ea25d7 | Paolo Bonzini | event_notifier_set(&data.e); |
254 | b2ea25d7 | Paolo Bonzini | g_assert(aio_poll(ctx, false));
|
255 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
256 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.active, ==, 0);
|
257 | b2ea25d7 | Paolo Bonzini | |
258 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
259 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
260 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.active, ==, 0);
|
261 | b2ea25d7 | Paolo Bonzini | |
262 | b2ea25d7 | Paolo Bonzini | aio_set_event_notifier(ctx, &data.e, NULL, NULL); |
263 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
264 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
265 | b2ea25d7 | Paolo Bonzini | |
266 | b2ea25d7 | Paolo Bonzini | event_notifier_cleanup(&data.e); |
267 | b2ea25d7 | Paolo Bonzini | } |
268 | b2ea25d7 | Paolo Bonzini | |
269 | b2ea25d7 | Paolo Bonzini | static void test_flush_event_notifier(void) |
270 | b2ea25d7 | Paolo Bonzini | { |
271 | b2ea25d7 | Paolo Bonzini | EventNotifierTestData data = { .n = 0, .active = 10, .auto_set = true }; |
272 | b2ea25d7 | Paolo Bonzini | event_notifier_init(&data.e, false);
|
273 | b2ea25d7 | Paolo Bonzini | aio_set_event_notifier(ctx, &data.e, event_ready_cb, event_active_cb); |
274 | b2ea25d7 | Paolo Bonzini | 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, ==, 10);
|
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, ==, 9);
|
282 | b2ea25d7 | Paolo Bonzini | g_assert(aio_poll(ctx, false));
|
283 | b2ea25d7 | Paolo Bonzini | |
284 | 9fe3781f | Stefan Hajnoczi | wait_for_aio(); |
285 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 10);
|
286 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.active, ==, 0);
|
287 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
288 | b2ea25d7 | Paolo Bonzini | |
289 | b2ea25d7 | Paolo Bonzini | aio_set_event_notifier(ctx, &data.e, NULL, NULL); |
290 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
291 | b2ea25d7 | Paolo Bonzini | event_notifier_cleanup(&data.e); |
292 | b2ea25d7 | Paolo Bonzini | } |
293 | b2ea25d7 | Paolo Bonzini | |
294 | b2ea25d7 | Paolo Bonzini | static void test_wait_event_notifier_noflush(void) |
295 | b2ea25d7 | Paolo Bonzini | { |
296 | b2ea25d7 | Paolo Bonzini | EventNotifierTestData data = { .n = 0 };
|
297 | b2ea25d7 | Paolo Bonzini | EventNotifierTestData dummy = { .n = 0, .active = 1 }; |
298 | b2ea25d7 | Paolo Bonzini | |
299 | b2ea25d7 | Paolo Bonzini | event_notifier_init(&data.e, false);
|
300 | b2ea25d7 | Paolo Bonzini | aio_set_event_notifier(ctx, &data.e, event_ready_cb, NULL);
|
301 | b2ea25d7 | Paolo Bonzini | |
302 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
303 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
304 | b2ea25d7 | Paolo Bonzini | |
305 | b2ea25d7 | Paolo Bonzini | /* Until there is an active descriptor, aio_poll may or may not call
|
306 | b2ea25d7 | Paolo Bonzini | * event_ready_cb. Still, it must not block. */
|
307 | b2ea25d7 | Paolo Bonzini | event_notifier_set(&data.e); |
308 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, true));
|
309 | b2ea25d7 | Paolo Bonzini | data.n = 0;
|
310 | b2ea25d7 | Paolo Bonzini | |
311 | b2ea25d7 | Paolo Bonzini | /* An active event notifier forces aio_poll to look at EventNotifiers. */
|
312 | b2ea25d7 | Paolo Bonzini | event_notifier_init(&dummy.e, false);
|
313 | b2ea25d7 | Paolo Bonzini | aio_set_event_notifier(ctx, &dummy.e, event_ready_cb, event_active_cb); |
314 | b2ea25d7 | Paolo Bonzini | |
315 | b2ea25d7 | Paolo Bonzini | event_notifier_set(&data.e); |
316 | b2ea25d7 | Paolo Bonzini | g_assert(aio_poll(ctx, false));
|
317 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
318 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
319 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
320 | b2ea25d7 | Paolo Bonzini | |
321 | b2ea25d7 | Paolo Bonzini | event_notifier_set(&data.e); |
322 | b2ea25d7 | Paolo Bonzini | g_assert(aio_poll(ctx, false));
|
323 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 2);
|
324 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
325 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 2);
|
326 | b2ea25d7 | Paolo Bonzini | |
327 | b2ea25d7 | Paolo Bonzini | event_notifier_set(&dummy.e); |
328 | 9fe3781f | Stefan Hajnoczi | wait_for_aio(); |
329 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 2);
|
330 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(dummy.n, ==, 1);
|
331 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(dummy.active, ==, 0);
|
332 | b2ea25d7 | Paolo Bonzini | |
333 | b2ea25d7 | Paolo Bonzini | aio_set_event_notifier(ctx, &dummy.e, NULL, NULL); |
334 | b2ea25d7 | Paolo Bonzini | event_notifier_cleanup(&dummy.e); |
335 | b2ea25d7 | Paolo Bonzini | |
336 | b2ea25d7 | Paolo Bonzini | aio_set_event_notifier(ctx, &data.e, NULL, NULL); |
337 | b2ea25d7 | Paolo Bonzini | g_assert(!aio_poll(ctx, false));
|
338 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 2);
|
339 | b2ea25d7 | Paolo Bonzini | |
340 | b2ea25d7 | Paolo Bonzini | event_notifier_cleanup(&data.e); |
341 | b2ea25d7 | Paolo Bonzini | } |
342 | b2ea25d7 | Paolo Bonzini | |
343 | b2ea25d7 | Paolo Bonzini | /* Now the same tests, using the context as a GSource. They are
|
344 | b2ea25d7 | Paolo Bonzini | * very similar to the ones above, with g_main_context_iteration
|
345 | b2ea25d7 | Paolo Bonzini | * replacing aio_poll. However:
|
346 | b2ea25d7 | Paolo Bonzini | * - sometimes both the AioContext and the glib main loop wake
|
347 | b2ea25d7 | Paolo Bonzini | * themselves up. Hence, some "g_assert(!aio_poll(ctx, false));"
|
348 | b2ea25d7 | Paolo Bonzini | * are replaced by "while (g_main_context_iteration(NULL, false));".
|
349 | 9fe3781f | Stefan Hajnoczi | * - there is no exact replacement for a blocking wait.
|
350 | b2ea25d7 | Paolo Bonzini | * "while (g_main_context_iteration(NULL, true)" seems to work,
|
351 | b2ea25d7 | Paolo Bonzini | * but it is not documented _why_ it works. For these tests a
|
352 | b2ea25d7 | Paolo Bonzini | * non-blocking loop like "while (g_main_context_iteration(NULL, false)"
|
353 | b2ea25d7 | Paolo Bonzini | * works well, and that's what I am using.
|
354 | b2ea25d7 | Paolo Bonzini | */
|
355 | b2ea25d7 | Paolo Bonzini | |
356 | b2ea25d7 | Paolo Bonzini | static void test_source_notify(void) |
357 | b2ea25d7 | Paolo Bonzini | { |
358 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
359 | b2ea25d7 | Paolo Bonzini | aio_notify(ctx); |
360 | b2ea25d7 | Paolo Bonzini | g_assert(g_main_context_iteration(NULL, true)); |
361 | b2ea25d7 | Paolo Bonzini | g_assert(!g_main_context_iteration(NULL, false)); |
362 | b2ea25d7 | Paolo Bonzini | } |
363 | b2ea25d7 | Paolo Bonzini | |
364 | b2ea25d7 | Paolo Bonzini | static void test_source_flush(void) |
365 | b2ea25d7 | Paolo Bonzini | { |
366 | b2ea25d7 | Paolo Bonzini | g_assert(!g_main_context_iteration(NULL, false)); |
367 | b2ea25d7 | Paolo Bonzini | aio_notify(ctx); |
368 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
369 | b2ea25d7 | Paolo Bonzini | g_assert(!g_main_context_iteration(NULL, false)); |
370 | b2ea25d7 | Paolo Bonzini | } |
371 | b2ea25d7 | Paolo Bonzini | |
372 | b2ea25d7 | Paolo Bonzini | static void test_source_bh_schedule(void) |
373 | b2ea25d7 | Paolo Bonzini | { |
374 | b2ea25d7 | Paolo Bonzini | BHTestData data = { .n = 0 };
|
375 | b2ea25d7 | Paolo Bonzini | data.bh = aio_bh_new(ctx, bh_test_cb, &data); |
376 | b2ea25d7 | Paolo Bonzini | |
377 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data.bh); |
378 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
379 | b2ea25d7 | Paolo Bonzini | |
380 | b2ea25d7 | Paolo Bonzini | g_assert(g_main_context_iteration(NULL, true)); |
381 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
382 | b2ea25d7 | Paolo Bonzini | |
383 | b2ea25d7 | Paolo Bonzini | g_assert(!g_main_context_iteration(NULL, false)); |
384 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
385 | b2ea25d7 | Paolo Bonzini | qemu_bh_delete(data.bh); |
386 | b2ea25d7 | Paolo Bonzini | } |
387 | b2ea25d7 | Paolo Bonzini | |
388 | b2ea25d7 | Paolo Bonzini | static void test_source_bh_schedule10(void) |
389 | b2ea25d7 | Paolo Bonzini | { |
390 | b2ea25d7 | Paolo Bonzini | BHTestData data = { .n = 0, .max = 10 }; |
391 | b2ea25d7 | Paolo Bonzini | data.bh = aio_bh_new(ctx, bh_test_cb, &data); |
392 | b2ea25d7 | Paolo Bonzini | |
393 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data.bh); |
394 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
395 | b2ea25d7 | Paolo Bonzini | |
396 | b2ea25d7 | Paolo Bonzini | g_assert(g_main_context_iteration(NULL, false)); |
397 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
398 | b2ea25d7 | Paolo Bonzini | |
399 | b2ea25d7 | Paolo Bonzini | g_assert(g_main_context_iteration(NULL, true)); |
400 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 2);
|
401 | b2ea25d7 | Paolo Bonzini | |
402 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
403 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 10);
|
404 | b2ea25d7 | Paolo Bonzini | |
405 | b2ea25d7 | Paolo Bonzini | g_assert(!g_main_context_iteration(NULL, false)); |
406 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 10);
|
407 | b2ea25d7 | Paolo Bonzini | qemu_bh_delete(data.bh); |
408 | b2ea25d7 | Paolo Bonzini | } |
409 | b2ea25d7 | Paolo Bonzini | |
410 | b2ea25d7 | Paolo Bonzini | static void test_source_bh_cancel(void) |
411 | b2ea25d7 | Paolo Bonzini | { |
412 | b2ea25d7 | Paolo Bonzini | BHTestData data = { .n = 0 };
|
413 | b2ea25d7 | Paolo Bonzini | data.bh = aio_bh_new(ctx, bh_test_cb, &data); |
414 | b2ea25d7 | Paolo Bonzini | |
415 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data.bh); |
416 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
417 | b2ea25d7 | Paolo Bonzini | |
418 | b2ea25d7 | Paolo Bonzini | qemu_bh_cancel(data.bh); |
419 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
420 | b2ea25d7 | Paolo Bonzini | |
421 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
422 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
423 | b2ea25d7 | Paolo Bonzini | qemu_bh_delete(data.bh); |
424 | b2ea25d7 | Paolo Bonzini | } |
425 | b2ea25d7 | Paolo Bonzini | |
426 | b2ea25d7 | Paolo Bonzini | static void test_source_bh_delete(void) |
427 | b2ea25d7 | Paolo Bonzini | { |
428 | b2ea25d7 | Paolo Bonzini | BHTestData data = { .n = 0 };
|
429 | b2ea25d7 | Paolo Bonzini | data.bh = aio_bh_new(ctx, bh_test_cb, &data); |
430 | b2ea25d7 | Paolo Bonzini | |
431 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data.bh); |
432 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
433 | b2ea25d7 | Paolo Bonzini | |
434 | b2ea25d7 | Paolo Bonzini | qemu_bh_delete(data.bh); |
435 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
436 | b2ea25d7 | Paolo Bonzini | |
437 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
438 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
439 | b2ea25d7 | Paolo Bonzini | } |
440 | b2ea25d7 | Paolo Bonzini | |
441 | b2ea25d7 | Paolo Bonzini | static void test_source_bh_delete_from_cb(void) |
442 | b2ea25d7 | Paolo Bonzini | { |
443 | b2ea25d7 | Paolo Bonzini | BHTestData data1 = { .n = 0, .max = 1 }; |
444 | b2ea25d7 | Paolo Bonzini | |
445 | b2ea25d7 | Paolo Bonzini | data1.bh = aio_bh_new(ctx, bh_delete_cb, &data1); |
446 | b2ea25d7 | Paolo Bonzini | |
447 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data1.bh); |
448 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data1.n, ==, 0);
|
449 | b2ea25d7 | Paolo Bonzini | |
450 | b2ea25d7 | Paolo Bonzini | g_main_context_iteration(NULL, true); |
451 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data1.n, ==, data1.max); |
452 | b2ea25d7 | Paolo Bonzini | g_assert(data1.bh == NULL);
|
453 | b2ea25d7 | Paolo Bonzini | |
454 | b2ea25d7 | Paolo Bonzini | g_assert(!g_main_context_iteration(NULL, false)); |
455 | b2ea25d7 | Paolo Bonzini | } |
456 | b2ea25d7 | Paolo Bonzini | |
457 | b2ea25d7 | Paolo Bonzini | static void test_source_bh_delete_from_cb_many(void) |
458 | b2ea25d7 | Paolo Bonzini | { |
459 | b2ea25d7 | Paolo Bonzini | BHTestData data1 = { .n = 0, .max = 1 }; |
460 | b2ea25d7 | Paolo Bonzini | BHTestData data2 = { .n = 0, .max = 3 }; |
461 | b2ea25d7 | Paolo Bonzini | BHTestData data3 = { .n = 0, .max = 2 }; |
462 | b2ea25d7 | Paolo Bonzini | BHTestData data4 = { .n = 0, .max = 4 }; |
463 | b2ea25d7 | Paolo Bonzini | |
464 | b2ea25d7 | Paolo Bonzini | data1.bh = aio_bh_new(ctx, bh_delete_cb, &data1); |
465 | b2ea25d7 | Paolo Bonzini | data2.bh = aio_bh_new(ctx, bh_delete_cb, &data2); |
466 | b2ea25d7 | Paolo Bonzini | data3.bh = aio_bh_new(ctx, bh_delete_cb, &data3); |
467 | b2ea25d7 | Paolo Bonzini | data4.bh = aio_bh_new(ctx, bh_delete_cb, &data4); |
468 | b2ea25d7 | Paolo Bonzini | |
469 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data1.bh); |
470 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data2.bh); |
471 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data3.bh); |
472 | b2ea25d7 | Paolo Bonzini | qemu_bh_schedule(data4.bh); |
473 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data1.n, ==, 0);
|
474 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data2.n, ==, 0);
|
475 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data3.n, ==, 0);
|
476 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data4.n, ==, 0);
|
477 | b2ea25d7 | Paolo Bonzini | |
478 | b2ea25d7 | Paolo Bonzini | g_assert(g_main_context_iteration(NULL, false)); |
479 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data1.n, ==, 1);
|
480 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data2.n, ==, 1);
|
481 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data3.n, ==, 1);
|
482 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data4.n, ==, 1);
|
483 | b2ea25d7 | Paolo Bonzini | g_assert(data1.bh == NULL);
|
484 | b2ea25d7 | Paolo Bonzini | |
485 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
486 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data1.n, ==, data1.max); |
487 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data2.n, ==, data2.max); |
488 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data3.n, ==, data3.max); |
489 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data4.n, ==, data4.max); |
490 | b2ea25d7 | Paolo Bonzini | g_assert(data1.bh == NULL);
|
491 | b2ea25d7 | Paolo Bonzini | g_assert(data2.bh == NULL);
|
492 | b2ea25d7 | Paolo Bonzini | g_assert(data3.bh == NULL);
|
493 | b2ea25d7 | Paolo Bonzini | g_assert(data4.bh == NULL);
|
494 | b2ea25d7 | Paolo Bonzini | } |
495 | b2ea25d7 | Paolo Bonzini | |
496 | b2ea25d7 | Paolo Bonzini | static void test_source_bh_flush(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 | g_assert(g_main_context_iteration(NULL, true)); |
505 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
506 | b2ea25d7 | Paolo Bonzini | |
507 | b2ea25d7 | Paolo Bonzini | g_assert(!g_main_context_iteration(NULL, false)); |
508 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
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_set_event_notifier(void) |
513 | b2ea25d7 | Paolo Bonzini | { |
514 | b2ea25d7 | Paolo Bonzini | EventNotifierTestData data = { .n = 0, .active = 0 }; |
515 | b2ea25d7 | Paolo Bonzini | event_notifier_init(&data.e, false);
|
516 | b2ea25d7 | Paolo Bonzini | aio_set_event_notifier(ctx, &data.e, event_ready_cb, event_active_cb); |
517 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
518 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
519 | b2ea25d7 | Paolo Bonzini | |
520 | b2ea25d7 | Paolo Bonzini | aio_set_event_notifier(ctx, &data.e, NULL, NULL); |
521 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
522 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
523 | b2ea25d7 | Paolo Bonzini | event_notifier_cleanup(&data.e); |
524 | b2ea25d7 | Paolo Bonzini | } |
525 | b2ea25d7 | Paolo Bonzini | |
526 | b2ea25d7 | Paolo Bonzini | static void test_source_wait_event_notifier(void) |
527 | b2ea25d7 | Paolo Bonzini | { |
528 | b2ea25d7 | Paolo Bonzini | EventNotifierTestData data = { .n = 0, .active = 1 }; |
529 | b2ea25d7 | Paolo Bonzini | event_notifier_init(&data.e, false);
|
530 | b2ea25d7 | Paolo Bonzini | aio_set_event_notifier(ctx, &data.e, event_ready_cb, event_active_cb); |
531 | b2ea25d7 | Paolo Bonzini | g_assert(g_main_context_iteration(NULL, false)); |
532 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
533 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.active, ==, 1);
|
534 | b2ea25d7 | Paolo Bonzini | |
535 | b2ea25d7 | Paolo Bonzini | event_notifier_set(&data.e); |
536 | b2ea25d7 | Paolo Bonzini | g_assert(g_main_context_iteration(NULL, false)); |
537 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
538 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.active, ==, 0);
|
539 | b2ea25d7 | Paolo Bonzini | |
540 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
541 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
542 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.active, ==, 0);
|
543 | b2ea25d7 | Paolo Bonzini | |
544 | b2ea25d7 | Paolo Bonzini | aio_set_event_notifier(ctx, &data.e, NULL, NULL); |
545 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
546 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
547 | b2ea25d7 | Paolo Bonzini | |
548 | b2ea25d7 | Paolo Bonzini | event_notifier_cleanup(&data.e); |
549 | b2ea25d7 | Paolo Bonzini | } |
550 | b2ea25d7 | Paolo Bonzini | |
551 | b2ea25d7 | Paolo Bonzini | static void test_source_flush_event_notifier(void) |
552 | b2ea25d7 | Paolo Bonzini | { |
553 | b2ea25d7 | Paolo Bonzini | EventNotifierTestData data = { .n = 0, .active = 10, .auto_set = true }; |
554 | b2ea25d7 | Paolo Bonzini | event_notifier_init(&data.e, false);
|
555 | b2ea25d7 | Paolo Bonzini | aio_set_event_notifier(ctx, &data.e, event_ready_cb, event_active_cb); |
556 | b2ea25d7 | Paolo Bonzini | g_assert(g_main_context_iteration(NULL, false)); |
557 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
558 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.active, ==, 10);
|
559 | b2ea25d7 | Paolo Bonzini | |
560 | b2ea25d7 | Paolo Bonzini | event_notifier_set(&data.e); |
561 | b2ea25d7 | Paolo Bonzini | g_assert(g_main_context_iteration(NULL, false)); |
562 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
563 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.active, ==, 9);
|
564 | b2ea25d7 | Paolo Bonzini | g_assert(g_main_context_iteration(NULL, false)); |
565 | b2ea25d7 | Paolo Bonzini | |
566 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
567 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 10);
|
568 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.active, ==, 0);
|
569 | b2ea25d7 | Paolo Bonzini | g_assert(!g_main_context_iteration(NULL, false)); |
570 | b2ea25d7 | Paolo Bonzini | |
571 | b2ea25d7 | Paolo Bonzini | aio_set_event_notifier(ctx, &data.e, NULL, NULL); |
572 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
573 | b2ea25d7 | Paolo Bonzini | event_notifier_cleanup(&data.e); |
574 | b2ea25d7 | Paolo Bonzini | } |
575 | b2ea25d7 | Paolo Bonzini | |
576 | b2ea25d7 | Paolo Bonzini | static void test_source_wait_event_notifier_noflush(void) |
577 | b2ea25d7 | Paolo Bonzini | { |
578 | b2ea25d7 | Paolo Bonzini | EventNotifierTestData data = { .n = 0 };
|
579 | b2ea25d7 | Paolo Bonzini | EventNotifierTestData dummy = { .n = 0, .active = 1 }; |
580 | b2ea25d7 | Paolo Bonzini | |
581 | b2ea25d7 | Paolo Bonzini | event_notifier_init(&data.e, false);
|
582 | b2ea25d7 | Paolo Bonzini | aio_set_event_notifier(ctx, &data.e, event_ready_cb, NULL);
|
583 | b2ea25d7 | Paolo Bonzini | |
584 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
585 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 0);
|
586 | b2ea25d7 | Paolo Bonzini | |
587 | b2ea25d7 | Paolo Bonzini | /* Until there is an active descriptor, glib may or may not call
|
588 | b2ea25d7 | Paolo Bonzini | * event_ready_cb. Still, it must not block. */
|
589 | b2ea25d7 | Paolo Bonzini | event_notifier_set(&data.e); |
590 | b2ea25d7 | Paolo Bonzini | g_main_context_iteration(NULL, true); |
591 | b2ea25d7 | Paolo Bonzini | data.n = 0;
|
592 | b2ea25d7 | Paolo Bonzini | |
593 | b2ea25d7 | Paolo Bonzini | /* An active event notifier forces aio_poll to look at EventNotifiers. */
|
594 | b2ea25d7 | Paolo Bonzini | event_notifier_init(&dummy.e, false);
|
595 | b2ea25d7 | Paolo Bonzini | aio_set_event_notifier(ctx, &dummy.e, event_ready_cb, event_active_cb); |
596 | b2ea25d7 | Paolo Bonzini | |
597 | b2ea25d7 | Paolo Bonzini | event_notifier_set(&data.e); |
598 | b2ea25d7 | Paolo Bonzini | g_assert(g_main_context_iteration(NULL, false)); |
599 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
600 | b2ea25d7 | Paolo Bonzini | g_assert(!g_main_context_iteration(NULL, false)); |
601 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 1);
|
602 | b2ea25d7 | Paolo Bonzini | |
603 | b2ea25d7 | Paolo Bonzini | event_notifier_set(&data.e); |
604 | b2ea25d7 | Paolo Bonzini | g_assert(g_main_context_iteration(NULL, false)); |
605 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 2);
|
606 | b2ea25d7 | Paolo Bonzini | g_assert(!g_main_context_iteration(NULL, false)); |
607 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 2);
|
608 | b2ea25d7 | Paolo Bonzini | |
609 | b2ea25d7 | Paolo Bonzini | event_notifier_set(&dummy.e); |
610 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
611 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 2);
|
612 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(dummy.n, ==, 1);
|
613 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(dummy.active, ==, 0);
|
614 | b2ea25d7 | Paolo Bonzini | |
615 | b2ea25d7 | Paolo Bonzini | aio_set_event_notifier(ctx, &dummy.e, NULL, NULL); |
616 | b2ea25d7 | Paolo Bonzini | event_notifier_cleanup(&dummy.e); |
617 | b2ea25d7 | Paolo Bonzini | |
618 | b2ea25d7 | Paolo Bonzini | aio_set_event_notifier(ctx, &data.e, NULL, NULL); |
619 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
620 | b2ea25d7 | Paolo Bonzini | g_assert_cmpint(data.n, ==, 2);
|
621 | b2ea25d7 | Paolo Bonzini | |
622 | b2ea25d7 | Paolo Bonzini | event_notifier_cleanup(&data.e); |
623 | b2ea25d7 | Paolo Bonzini | } |
624 | b2ea25d7 | Paolo Bonzini | |
625 | b2ea25d7 | Paolo Bonzini | /* End of tests. */
|
626 | b2ea25d7 | Paolo Bonzini | |
627 | b2ea25d7 | Paolo Bonzini | int main(int argc, char **argv) |
628 | b2ea25d7 | Paolo Bonzini | { |
629 | b2ea25d7 | Paolo Bonzini | GSource *src; |
630 | b2ea25d7 | Paolo Bonzini | |
631 | b2ea25d7 | Paolo Bonzini | ctx = aio_context_new(); |
632 | b2ea25d7 | Paolo Bonzini | src = aio_get_g_source(ctx); |
633 | b2ea25d7 | Paolo Bonzini | g_source_attach(src, NULL);
|
634 | b2ea25d7 | Paolo Bonzini | g_source_unref(src); |
635 | b2ea25d7 | Paolo Bonzini | |
636 | b2ea25d7 | Paolo Bonzini | while (g_main_context_iteration(NULL, false)); |
637 | b2ea25d7 | Paolo Bonzini | |
638 | b2ea25d7 | Paolo Bonzini | g_test_init(&argc, &argv, NULL);
|
639 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio/notify", test_notify);
|
640 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio/bh/schedule", test_bh_schedule);
|
641 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio/bh/schedule10", test_bh_schedule10);
|
642 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio/bh/cancel", test_bh_cancel);
|
643 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio/bh/delete", test_bh_delete);
|
644 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio/bh/callback-delete/one", test_bh_delete_from_cb);
|
645 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio/bh/callback-delete/many", test_bh_delete_from_cb_many);
|
646 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio/bh/flush", test_bh_flush);
|
647 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio/event/add-remove", test_set_event_notifier);
|
648 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio/event/wait", test_wait_event_notifier);
|
649 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio/event/wait/no-flush-cb", test_wait_event_notifier_noflush);
|
650 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio/event/flush", test_flush_event_notifier);
|
651 | b2ea25d7 | Paolo Bonzini | |
652 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio-gsource/notify", test_source_notify);
|
653 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio-gsource/flush", test_source_flush);
|
654 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio-gsource/bh/schedule", test_source_bh_schedule);
|
655 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio-gsource/bh/schedule10", test_source_bh_schedule10);
|
656 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio-gsource/bh/cancel", test_source_bh_cancel);
|
657 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio-gsource/bh/delete", test_source_bh_delete);
|
658 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio-gsource/bh/callback-delete/one", test_source_bh_delete_from_cb);
|
659 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio-gsource/bh/callback-delete/many", test_source_bh_delete_from_cb_many);
|
660 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio-gsource/bh/flush", test_source_bh_flush);
|
661 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio-gsource/event/add-remove", test_source_set_event_notifier);
|
662 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio-gsource/event/wait", test_source_wait_event_notifier);
|
663 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio-gsource/event/wait/no-flush-cb", test_source_wait_event_notifier_noflush);
|
664 | b2ea25d7 | Paolo Bonzini | g_test_add_func("/aio-gsource/event/flush", test_source_flush_event_notifier);
|
665 | b2ea25d7 | Paolo Bonzini | return g_test_run();
|
666 | b2ea25d7 | Paolo Bonzini | } |