Statistics
| Branch: | Revision:

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
}