mirror of https://github.com/xemu-project/xemu.git
tests: adjust test-aio to new aio_poll() semantics
aio_poll(ctx, true) will soon block if any fd handlers have been set. Previously it would only block when .io_flush() returned true. This means that callers must check their wait condition *before* aio_poll() to avoid deadlock. Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
bf0da4df83
commit
24d1a6d9d5
|
@ -15,6 +15,13 @@
|
||||||
|
|
||||||
AioContext *ctx;
|
AioContext *ctx;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EventNotifier e;
|
||||||
|
int n;
|
||||||
|
int active;
|
||||||
|
bool auto_set;
|
||||||
|
} EventNotifierTestData;
|
||||||
|
|
||||||
/* Wait until there are no more BHs or AIO requests */
|
/* Wait until there are no more BHs or AIO requests */
|
||||||
static void wait_for_aio(void)
|
static void wait_for_aio(void)
|
||||||
{
|
{
|
||||||
|
@ -23,6 +30,14 @@ static void wait_for_aio(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Wait until event notifier becomes inactive */
|
||||||
|
static void wait_until_inactive(EventNotifierTestData *data)
|
||||||
|
{
|
||||||
|
while (data->active > 0) {
|
||||||
|
aio_poll(ctx, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Simple callbacks for testing. */
|
/* Simple callbacks for testing. */
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -50,13 +65,6 @@ static void bh_delete_cb(void *opaque)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
EventNotifier e;
|
|
||||||
int n;
|
|
||||||
int active;
|
|
||||||
bool auto_set;
|
|
||||||
} EventNotifierTestData;
|
|
||||||
|
|
||||||
static int event_active_cb(EventNotifier *e)
|
static int event_active_cb(EventNotifier *e)
|
||||||
{
|
{
|
||||||
EventNotifierTestData *data = container_of(e, EventNotifierTestData, e);
|
EventNotifierTestData *data = container_of(e, EventNotifierTestData, e);
|
||||||
|
@ -281,7 +289,7 @@ static void test_flush_event_notifier(void)
|
||||||
g_assert_cmpint(data.active, ==, 9);
|
g_assert_cmpint(data.active, ==, 9);
|
||||||
g_assert(aio_poll(ctx, false));
|
g_assert(aio_poll(ctx, false));
|
||||||
|
|
||||||
wait_for_aio();
|
wait_until_inactive(&data);
|
||||||
g_assert_cmpint(data.n, ==, 10);
|
g_assert_cmpint(data.n, ==, 10);
|
||||||
g_assert_cmpint(data.active, ==, 0);
|
g_assert_cmpint(data.active, ==, 0);
|
||||||
g_assert(!aio_poll(ctx, false));
|
g_assert(!aio_poll(ctx, false));
|
||||||
|
@ -325,7 +333,7 @@ static void test_wait_event_notifier_noflush(void)
|
||||||
g_assert_cmpint(data.n, ==, 2);
|
g_assert_cmpint(data.n, ==, 2);
|
||||||
|
|
||||||
event_notifier_set(&dummy.e);
|
event_notifier_set(&dummy.e);
|
||||||
wait_for_aio();
|
wait_until_inactive(&dummy);
|
||||||
g_assert_cmpint(data.n, ==, 2);
|
g_assert_cmpint(data.n, ==, 2);
|
||||||
g_assert_cmpint(dummy.n, ==, 1);
|
g_assert_cmpint(dummy.n, ==, 1);
|
||||||
g_assert_cmpint(dummy.active, ==, 0);
|
g_assert_cmpint(dummy.active, ==, 0);
|
||||||
|
|
Loading…
Reference in New Issue