AppFlowy/frontend/rust-lib/lib-dispatch/src/runtime.rs

118 lines
2.5 KiB
Rust
Raw Normal View History

use std::fmt::{Display, Formatter};
use std::future::Future;
use std::io;
2022-06-27 15:15:43 +00:00
use tokio::runtime;
use tokio::runtime::Runtime;
use tokio::task::JoinHandle;
pub struct AFPluginRuntime {
inner: Runtime,
#[cfg(feature = "wasm_build")]
local: tokio::task::LocalSet,
}
impl Display for AFPluginRuntime {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
if cfg!(feature = "single_thread") {
write!(f, "Runtime(single_thread)")
} else {
write!(f, "Runtime(multi_thread)")
}
}
}
impl AFPluginRuntime {
pub fn new() -> io::Result<Self> {
let inner = default_tokio_runtime()?;
Ok(Self {
inner,
#[cfg(feature = "wasm_build")]
local: tokio::task::LocalSet::new(),
})
}
#[cfg(feature = "wasm_build")]
#[track_caller]
pub fn spawn<F>(&self, future: F) -> JoinHandle<F::Output>
where
F: Future + 'static,
{
self.local.spawn_local(future)
}
#[cfg(not(feature = "wasm_build"))]
#[track_caller]
pub fn spawn<F>(&self, future: F) -> JoinHandle<F::Output>
where
F: Future + Send + 'static,
<F as Future>::Output: Send + 'static,
{
self.inner.spawn(future)
}
2022-06-27 15:15:43 +00:00
#[cfg(feature = "wasm_build")]
pub async fn run_until<F>(&self, future: F) -> F::Output
where
F: Future,
{
self.local.run_until(future).await
}
#[cfg(not(feature = "wasm_build"))]
pub async fn run_until<F>(&self, future: F) -> F::Output
where
F: Future,
{
future.await
}
#[cfg(feature = "wasm_build")]
#[track_caller]
pub fn block_on<F>(&self, f: F) -> F::Output
where
F: Future,
{
self.local.block_on(&self.inner, f)
}
#[cfg(not(feature = "wasm_build"))]
#[track_caller]
pub fn block_on<F>(&self, f: F) -> F::Output
where
F: Future,
{
self.inner.block_on(f)
}
}
#[cfg(feature = "wasm_build")]
pub fn default_tokio_runtime() -> io::Result<Runtime> {
runtime::Builder::new_current_thread()
.thread_name("dispatch-rt-st")
.build()
}
2022-06-27 15:15:43 +00:00
#[cfg(not(feature = "wasm_build"))]
pub fn default_tokio_runtime() -> io::Result<Runtime> {
runtime::Builder::new_multi_thread()
.thread_name("dispatch-rt-mt")
.enable_io()
.enable_time()
.on_thread_start(move || {
tracing::trace!(
"{:?} thread started: thread_id= {}",
std::thread::current(),
thread_id::get()
);
})
.on_thread_stop(move || {
tracing::trace!(
"{:?} thread stopping: thread_id= {}",
std::thread::current(),
thread_id::get(),
);
})
.build()
2022-06-27 15:15:43 +00:00
}