maycoon_core/tasks/
runner.rs1use crate::tasks::{TaskHandle, RUNNER};
2use futures::executor::{ThreadPool, ThreadPoolBuilder};
3use futures::task::SpawnExt;
4use std::future::Future;
5use std::num::NonZeroUsize;
6
7pub struct TaskRunner {
11 pool: ThreadPool,
12}
13
14impl TaskRunner {
15 pub fn new(stack_size: usize, workers: NonZeroUsize) -> Result<Self, futures::io::Error> {
17 Ok(Self {
18 pool: ThreadPoolBuilder::new()
19 .stack_size(stack_size)
20 .pool_size(workers.get())
21 .name_prefix("maycoon-worker-")
22 .create()?,
23 })
24 }
25
26 pub fn run<Fut>(&self, fut: Fut) -> TaskHandle<Fut::Output>
28 where
29 Fut: Future + Send + 'static,
30 Fut::Output: Send,
31 {
32 self.pool
33 .spawn_with_handle(fut)
34 .expect("Failed to spawn task")
35 }
36
37 pub fn init(self) -> Option<()> {
39 RUNNER.set(self).ok()
40 }
41}