mirror of
https://github.com/xemu-project/xemu.git
synced 2025-02-20 04:11:28 +00:00
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: Charlie Shepherd <charlie@ctshepherd.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
b276d24994
commit
f8d1daea6f
@ -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)
|
|||||||
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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user