1 #ifndef RB_WASM_SUPPORT_FIBER_H
2 #define RB_WASM_SUPPORT_FIBER_H
6 #ifndef WASM_FIBER_STACK_BUFFER_SIZE
7 # define WASM_FIBER_STACK_BUFFER_SIZE 6144
10 struct __rb_wasm_asyncify_fiber_ctx
{
13 char buffer
[WASM_FIBER_STACK_BUFFER_SIZE
];
16 // Fiber execution context needed to perform context switch
18 // Fiber entry point called when the fiber started for the first time.
19 // NULL if the entry point is main
20 void (*entry_point
)(void *, void *);
21 // Opaque argument pointers passed to the entry point function
24 // Internal asyncify buffer space
25 struct __rb_wasm_asyncify_fiber_ctx asyncify_buf
;
29 } rb_wasm_fiber_context
;
31 // Initialize a given fiber context to be ready to pass to `rb_wasm_swapcontext`
32 void rb_wasm_init_context(rb_wasm_fiber_context
*fcp
, void (*func
)(void *, void *), void *arg0
, void *arg1
);
34 // Swap the execution control with `target_fiber` and save the current context in `old_fiber`
35 // NOTE: `old_fiber` must be the current executing fiber context
36 void rb_wasm_swapcontext(rb_wasm_fiber_context
*old_fiber
, rb_wasm_fiber_context
*target_fiber
);
38 // Returns the Asyncify buffer of next fiber if unwound for fiber context switch.
39 // Used by the top level Asyncify handling in wasm/runtime.c
40 void *rb_wasm_handle_fiber_unwind(void (**new_fiber_entry
)(void *, void *),
41 void **arg0
, void **arg1
, bool *is_new_fiber_started
);