Statistics
| Branch: | Revision:

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
}