use crossbeam_channel;
use std::thread;
use std::marker::Send;
use std::fmt::Debug;
use crate::logentry::LogEntry;
use crate::flare::{LogEntrySender, LogEntryReceiver, SerializedSender};
use crate::time;
pub struct FlareWorkerPool<T>
where T: LogEntry + Send + Clone + Debug {
pub workers: Vec<FlareWorker<T>>,
pub sender: LogEntrySender<T>,
}
impl<T: 'static> FlareWorkerPool<T>
where T: LogEntry + Send + Clone + Debug {
pub fn new(iosender: SerializedSender, worker_amount: usize) -> Self {
let (s, r): (LogEntrySender<T>, LogEntryReceiver<T>) = crossbeam_channel::unbounded();
let workers: Vec<_> = (0..worker_amount).map(|_| {
FlareWorker::new(iosender.clone(), r.clone())
}).collect();
Self {
workers,
sender: s,
}
}
}
pub struct FlareWorker<T>
where T: LogEntry + Send + Clone + Debug {
pub thread_handle: thread::JoinHandle<()>,
pub receiver: LogEntryReceiver<T>,
}
impl<T: 'static> FlareWorker<T>
where T: LogEntry + Send + Clone + Debug {
pub fn new(iosender: SerializedSender, receiver: LogEntryReceiver<T>) -> Self {
let interface = FlareWorkerInterface::new(receiver.clone(), iosender);
let handle = thread::spawn(move || {
loop {
let entry = interface.receiver.recv().unwrap();
let strentry = format!("{} | {}", time::local_str(), entry.stringify());
interface.iosender.send(strentry).unwrap();
}
});
Self {
thread_handle: handle,
receiver,
}
}
}
#[derive(Clone)]
pub struct FlareWorkerInterface<T>
where T: LogEntry + Send + Clone + Debug {
pub receiver: crossbeam_channel::Receiver<T>,
pub iosender: crossbeam_channel::Sender<String>,
}
impl<T> FlareWorkerInterface<T>
where T: LogEntry + Send + Clone + Debug {
fn new(receiver: crossbeam_channel::Receiver<T>, iosender: crossbeam_channel::Sender<String>) -> Self {
Self {
receiver,
iosender,
}
}
}