Split out fiber stacks from fibers.
This commit splits out a `FiberStack` from `Fiber`, allowing the instance allocator trait to return `FiberStack` rather than raw stack pointers. This keeps the stack creation mostly in `wasmtime_fiber`, but now the on-demand instance allocator can make use of it. The instance allocators no longer have to return a "not supported" error to indicate that the store should allocate its own fiber stack. This includes a bunch of cleanup in the instance allocator to scope stacks to the new "async" feature in the runtime. Closes #2708.
This commit is contained in:
@@ -7,6 +7,23 @@ use winapi::shared::winerror::ERROR_NOT_SUPPORTED;
|
||||
use winapi::um::fibersapi::*;
|
||||
use winapi::um::winbase::*;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct FiberStack(usize);
|
||||
|
||||
impl FiberStack {
|
||||
pub fn new(size: usize) -> io::Result<Self> {
|
||||
Ok(Self(size))
|
||||
}
|
||||
|
||||
pub unsafe fn from_top_ptr(_top: *mut u8) -> io::Result<Self> {
|
||||
Err(io::Error::from_raw_os_error(ERROR_NOT_SUPPORTED as i32))
|
||||
}
|
||||
|
||||
pub fn top(&self) -> Option<*mut u8> {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
pub struct Fiber {
|
||||
fiber: LPVOID,
|
||||
state: Box<StartState>,
|
||||
@@ -41,7 +58,7 @@ where
|
||||
}
|
||||
|
||||
impl Fiber {
|
||||
pub fn new<F, A, B, C>(stack_size: usize, func: F) -> io::Result<Self>
|
||||
pub fn new<F, A, B, C>(stack: &FiberStack, func: F) -> io::Result<Self>
|
||||
where
|
||||
F: FnOnce(A, &super::Suspend<A, B, C>) -> C,
|
||||
{
|
||||
@@ -51,30 +68,25 @@ impl Fiber {
|
||||
parent: Cell::new(ptr::null_mut()),
|
||||
result_location: Cell::new(ptr::null()),
|
||||
});
|
||||
|
||||
let fiber = CreateFiberEx(
|
||||
0,
|
||||
stack_size,
|
||||
stack.0,
|
||||
FIBER_FLAG_FLOAT_SWITCH,
|
||||
Some(fiber_start::<F, A, B, C>),
|
||||
&*state as *const StartState as *mut _,
|
||||
);
|
||||
|
||||
if fiber.is_null() {
|
||||
drop(Box::from_raw(state.initial_closure.get().cast::<F>()));
|
||||
Err(io::Error::last_os_error())
|
||||
} else {
|
||||
Ok(Self { fiber, state })
|
||||
return Err(io::Error::last_os_error());
|
||||
}
|
||||
|
||||
Ok(Self { fiber, state })
|
||||
}
|
||||
}
|
||||
|
||||
pub fn new_with_stack<F, A, B, C>(_top_of_stack: *mut u8, _func: F) -> io::Result<Self>
|
||||
where
|
||||
F: FnOnce(A, &super::Suspend<A, B, C>) -> C,
|
||||
{
|
||||
Err(io::Error::from_raw_os_error(ERROR_NOT_SUPPORTED as i32))
|
||||
}
|
||||
|
||||
pub(crate) fn resume<A, B, C>(&self, result: &Cell<RunResult<A, B, C>>) {
|
||||
pub(crate) fn resume<A, B, C>(&self, _stack: &FiberStack, result: &Cell<RunResult<A, B, C>>) {
|
||||
unsafe {
|
||||
let is_fiber = IsThreadAFiber() != 0;
|
||||
let parent_fiber = if is_fiber {
|
||||
|
||||
Reference in New Issue
Block a user