提交 f8d1daea 编写于 作者: C Charlie Shepherd 提交者: Kevin Wolf

Test coroutine execution order

This patch adds a test for coroutine execution order in test-coroutine -
this catches a bug in the CPC coroutine implementation.
Signed-off-by: NCharlie Shepherd <charlie@ctshepherd.com>
Reviewed-by: NKevin Wolf <kwolf@redhat.com>
Signed-off-by: NKevin Wolf <kwolf@redhat.com>
上级 b276d249
...@@ -150,6 +150,59 @@ static void test_lifecycle(void) ...@@ -150,6 +150,59 @@ static void test_lifecycle(void)
g_assert(done); /* expect done to be true (second time) */ g_assert(done); /* expect done to be true (second time) */
} }
#define RECORD_SIZE 10 /* Leave some room for expansion */
struct coroutine_position {
int func;
int state;
};
static struct coroutine_position records[RECORD_SIZE];
static unsigned record_pos;
static void record_push(int func, int state)
{
struct coroutine_position *cp = &records[record_pos++];
g_assert_cmpint(record_pos, <, RECORD_SIZE);
cp->func = func;
cp->state = state;
}
static void coroutine_fn co_order_test(void *opaque)
{
record_push(2, 1);
g_assert(qemu_in_coroutine());
qemu_coroutine_yield();
record_push(2, 2);
g_assert(qemu_in_coroutine());
}
static void do_order_test(void)
{
Coroutine *co;
co = qemu_coroutine_create(co_order_test);
record_push(1, 1);
qemu_coroutine_enter(co, NULL);
record_push(1, 2);
g_assert(!qemu_in_coroutine());
qemu_coroutine_enter(co, NULL);
record_push(1, 3);
g_assert(!qemu_in_coroutine());
}
static void test_order(void)
{
int i;
const struct coroutine_position expected_pos[] = {
{1, 1,}, {2, 1}, {1, 2}, {2, 2}, {1, 3}
};
do_order_test();
g_assert_cmpint(record_pos, ==, 5);
for (i = 0; i < record_pos; i++) {
g_assert_cmpint(records[i].func , ==, expected_pos[i].func );
g_assert_cmpint(records[i].state, ==, expected_pos[i].state);
}
}
/* /*
* Lifecycle benchmark * Lifecycle benchmark
*/ */
...@@ -243,6 +296,7 @@ int main(int argc, char **argv) ...@@ -243,6 +296,7 @@ int main(int argc, char **argv)
g_test_add_func("/basic/nesting", test_nesting); g_test_add_func("/basic/nesting", test_nesting);
g_test_add_func("/basic/self", test_self); g_test_add_func("/basic/self", test_self);
g_test_add_func("/basic/in_coroutine", test_in_coroutine); g_test_add_func("/basic/in_coroutine", test_in_coroutine);
g_test_add_func("/basic/order", test_order);
if (g_test_perf()) { if (g_test_perf()) {
g_test_add_func("/perf/lifecycle", perf_lifecycle); g_test_add_func("/perf/lifecycle", perf_lifecycle);
g_test_add_func("/perf/nesting", perf_nesting); g_test_add_func("/perf/nesting", perf_nesting);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册