use std::{io, thread};
use std::time::Duration;
use std::sync::Arc;
use tokio::runtime::{Builder as RuntimeBuilder, Handle};
use tokio::net::{TcpListener, TcpStream};
use tokio::sync::oneshot;
use crate::worker::Worker;
use crate::dropper::Dropper;
pub struct Builder {
id: String,
builder: RuntimeBuilder,
}
impl Default for Builder {
fn default() -> Self {
Self {
id: "default-worker".to_string(),
builder: RuntimeBuilder::new_multi_thread(),
}
}
}
impl Builder {
pub fn worker_threads(&mut self, val: usize) -> &mut Self {
self.builder.worker_threads(val);
self
}
pub fn max_blocking_threads(&mut self, val: usize) -> &mut Self {
self.builder.max_blocking_threads(val);
self
}
pub fn thread_keep_alive(&mut self, duration: Duration) -> &mut Self {
self.builder.thread_keep_alive(duration);
self
}
pub fn thread_name(&mut self, val: impl Into<String>) -> &mut Self {
self.id = val.into();
self
}
pub fn build(&mut self) -> Result<Worker, io::Error> {
let worker = self
.builder
.enable_all()
.thread_name(self.id.clone())
.build()?;
let handle = worker.handle().clone();
let (send_stop, recv_stop) = oneshot::channel();
let _ = thread::Builder::new()
.name(format!("{}-blocker", self.id))
.spawn(move || worker.block_on(recv_stop));
Ok(Worker {
handle,
_dropper: Arc::new(Dropper {
close: Some(send_stop),
}),
})
}
}