use std::sync::OnceLock;
use tokio::runtime::Runtime;
static RUNTIME: OnceLock<Runtime> = OnceLock::new();
pub fn runtime() -> &'static Runtime {
RUNTIME.get_or_init(|| {
tokio::runtime::Builder::new_multi_thread()
.worker_threads(4)
.thread_name("darwincode-async")
.enable_all()
.build()
.expect("Failed to create Tokio runtime")
})
}
pub fn block_on<F: std::future::Future>(future: F) -> F::Output {
runtime().block_on(future)
}
#[allow(dead_code)]
pub fn spawn<F>(future: F) -> tokio::task::JoinHandle<F::Output>
where
F: std::future::Future + Send + 'static,
F::Output: Send + 'static,
{
runtime().spawn(future)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_runtime_initialization() {
let rt = runtime();
assert!(rt.metrics().num_workers() > 0);
}
#[test]
fn test_block_on() {
let result = block_on(async { 42 });
assert_eq!(result, 42);
}
#[test]
fn test_spawn() {
let handle = spawn(async { "spawned" });
let result = block_on(handle).unwrap();
assert_eq!(result, "spawned");
}
}