diff options
author | Yuta Saito <kateinoigakukun@gmail.com> | 2021-12-08 22:19:52 +0900 |
---|---|---|
committer | Yuta Saito <kateinoigakukun@gmail.com> | 2022-01-19 11:19:06 +0900 |
commit | f72f01abd89640b083b4067e4be399448f0fb6ce (patch) | |
tree | e41bd40aed432a8c6957a6ea03e799e33c4c5c74 /wasm/tests/fiber_test.c | |
parent | 3794ef6f01095a265c299917c244fbb346b56323 (diff) | |
download | ruby-f72f01abd89640b083b4067e4be399448f0fb6ce.tar.gz |
[wasm] add unit test suite for fiber, register scan, sjlj in platform dir
Diffstat (limited to 'wasm/tests/fiber_test.c')
-rw-r--r-- | wasm/tests/fiber_test.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/wasm/tests/fiber_test.c b/wasm/tests/fiber_test.c new file mode 100644 index 0000000000..e6b36631ce --- /dev/null +++ b/wasm/tests/fiber_test.c @@ -0,0 +1,66 @@ +#include "wasm/fiber.h" +#include "wasm/asyncify.h" +#include <stdio.h> +#include <stdlib.h> +#include <assert.h> + +static rb_wasm_fiber_context fctx_main, fctx_func1, fctx_func2; + +static int counter = 0; + +static void func1(void *arg0, void *arg1) { + assert(counter == 2); + fprintf(stderr, "func1: started\n"); + fprintf(stderr, "func1: swapcontext(&fctx_func1, &fctx_func2)\n"); + counter++; + rb_wasm_swapcontext(&fctx_func1, &fctx_func2); + + fprintf(stderr, "func1: returning\n"); +} + +static void func2(void *arg0, void *arg1) { + assert(counter == 1); + fprintf(stderr, "func2: started\n"); + fprintf(stderr, "func2: swapcontext(&fctx_func2, &fctx_func1)\n"); + counter++; + rb_wasm_swapcontext(&fctx_func2, &fctx_func1); + + assert(counter == 3); + fprintf(stderr, "func2: swapcontext(&fctx_func2, &fctx_func2)\n"); + counter++; + rb_wasm_swapcontext(&fctx_func2, &fctx_func2); + + assert(counter == 4); + fprintf(stderr, "func2: swapcontext(&fctx_func2, &fctx_main)\n"); + counter++; + rb_wasm_swapcontext(&fctx_func2, &fctx_main); + + fprintf(stderr, "func2: returning\n"); + assert(false && "unreachable"); +} + +// top level function should not be inlined to stop unwinding immediately after this function returns +__attribute__((noinline)) +int start(int argc, char **argv) { + rb_wasm_init_context(&fctx_main, NULL, NULL, NULL); + fctx_main.is_started = true; + + rb_wasm_init_context(&fctx_func1, func1, NULL, NULL); + + rb_wasm_init_context(&fctx_func2, func2, NULL, NULL); + + counter++; + fprintf(stderr, "start: swapcontext(&uctx_main, &fctx_func2)\n"); + rb_wasm_swapcontext(&fctx_main, &fctx_func2); + assert(counter == 5); + + fprintf(stderr, "start: exiting\n"); + return 42; +} + +int main(int argc, char **argv) { + extern int rb_wasm_rt_start(int (main)(int argc, char **argv), int argc, char **argv); + int result = rb_wasm_rt_start(start, argc, argv); + assert(result == 42); + return 0; +} |