From 22123c7823c2e8f28479dff9f669f432d2e997cf Mon Sep 17 00:00:00 2001 From: Dmitry Simonenko Date: Mon, 15 May 2017 17:38:39 +0300 Subject: [PATCH] machinarium: add context-switch test --- test-suite/machinarium_test.c | 2 ++ test-suite/makefile | 1 + test-suite/test_context_switch.c | 53 ++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 test-suite/test_context_switch.c diff --git a/test-suite/machinarium_test.c b/test-suite/machinarium_test.c index 7afd87d0..a7657c91 100644 --- a/test-suite/machinarium_test.c +++ b/test-suite/machinarium_test.c @@ -10,6 +10,7 @@ extern void test_init(void); extern void test_create(void); +extern void test_context_switch(void); extern void test_sleep(void); extern void test_sleep_yield(void); @@ -33,6 +34,7 @@ main(int argc, char *argv[]) { machinarium_test(test_init); machinarium_test(test_create); + machinarium_test(test_context_switch); machinarium_test(test_sleep); machinarium_test(test_sleep_yield); machinarium_test(test_sleep_cancel0); diff --git a/test-suite/makefile b/test-suite/makefile index 82648a52..a43c0b1e 100644 --- a/test-suite/makefile +++ b/test-suite/makefile @@ -7,6 +7,7 @@ LFLAGS = $(LFLAGS_LIB) OBJECTS = machinarium_test.o \ test_init.o \ test_create.o \ + test_context_switch.o \ test_sleep.o \ test_sleep_yield.o \ test_sleep_cancel0.o \ diff --git a/test-suite/test_context_switch.c b/test-suite/test_context_switch.c new file mode 100644 index 00000000..590d5fbb --- /dev/null +++ b/test-suite/test_context_switch.c @@ -0,0 +1,53 @@ + +/* + * machinarium. + * + * Cooperative multitasking engine. +*/ + +#include +#include + +static int csw = 0; + +static void +csw_worker(void *arg) +{ + machine_t machine = arg; + while (csw < 100000) { + machine_sleep(machine, 0); + csw++; + } +} + +static void +csw_runner(void *arg) +{ + machine_t machine = arg; + + int rc; + rc = machine_create_fiber(machine, csw_worker, machine); + test(rc != -1); + + rc = machine_wait(machine, rc); + test(rc != -1); + test(csw == 100000); + + machine_stop(machine); +} + +void +test_context_switch(void) +{ + machine_t machine = machine_create(); + test(machine != NULL); + + int rc; + rc = machine_create_fiber(machine, csw_runner, machine); + test(rc != -1); + + machine_start(machine); + + rc = machine_free(machine); + test(rc != -1); +}