#[macro_export]
macro_rules! transfer {
(|| $block:block) => {{
#[cfg(not(target_family = "wasm"))]
{ move || $block }
#[cfg(target_family = "wasm")]
{
$crate::ffi::TransferClosure::new(vec![], vec![], move |_: &[JsValue]| $block)
}
}};
(|$($param:ident: $ty:ty),*| $block:block) => {{
#[cfg(not(target_family = "wasm"))]
{
move || $block
}
#[cfg(target_family = "wasm")]
{
use wasm_bindgen::JsValue;
use $crate::ffi::Transfer;
#[allow(unused_variables)]
let worker = move |transfer: &[JsValue]| {
let idx = 0;
$(
let $param = <$ty>::deserialize(&transfer[idx]);
let idx = idx + 1;
)*
$block
};
let transferables = [$($param.transferables()),*].concat();
$crate::ffi::TransferClosure::new(vec![$($param.serialize()),*], transferables, worker)
}
}};
}
#[macro_export]
macro_rules! spawn {
($($tt:tt)*) => {{
let worker = $crate::transfer!($($tt)*);
#[cfg(not(target_family = "wasm"))]
{
$crate::thread::THREAD_POOL.lock().execute(worker)
}
#[cfg(target_family = "wasm")]
{
use anyhow::anyhow;
let res = $crate::thread::WORKER_POOL.with(|pool| {
if let Some(pool) = pool.as_ref() {
pool.run(worker).map_err(|err| anyhow!("worker error: {:?}", err))
} else {
Err(anyhow!("Worker was not initialized."))
}
});
if let Err(err) = res {
$crate::console_error!("worker error: {:?}", err);
}
}
}};
}
#[macro_export]
macro_rules! console_error {
($lit:literal) => {
$crate::error($lit)
};
($($tt:tt)*) => {
$crate::error(&format!($($tt)*))
};
}