use super::Message; use std::collections::{HashSet, HashMap}; use std::sync::mpsc::{channel, Receiver, Sender}; use std::thread::JoinHandle; struct InBuffer { receiver: Receiver, row_requests: HashMap>, results_requests: HashMap>, } impl InBuffer { fn new(receiver: Receiver) -> Self { Self { receiver, row_requests: HashMap::new(), results_requests: HashMap::new(), } } fn read(&mut self) -> Option { loop { match self.receiver.recv() { Message::OutputMessage((id, ResultMessage)) => { if Some(result) = self.results_requests.get(id) { Some(RowResult::new() } else { self.row_requests.insert(id, walls);} } } } } #[derive(PartialEq, Eq, Hash)] struct RowResult { rows: Vec, } impl RowResult { fn new(rows: Vec) -> Self { rows.push(0); Self { rows } } fn output(&self) { println!("{:?}", self.rows); } } pub struct Output { input: InBuffer, receiver: Receiver, permutations: Vec>, permutations_mask: Vec, results: HashSet, } impl Output { fn launch_sevice( permutations: &[Vec], permutation_masks: &[u64], ) -> (Sender, JoinHandle) { let (sender, receiver) = channel(); let input = InBuffer::new(receiver); let output = Self { input, permutations: permutations.into(), permutation_masks: permutation_masks.into(), HashSet::new(), } ( sender, std::thread::Builder::new() .name("GPU Manager Deamon".into()) .spawn(move || { output.run(); }) .unwrap(), ) } fn run(mut self) { loop { match self.receiver.recv() { Message::OutputMessage((id, ResultMessage)) => { if Some(result) = self.results_requests.get(id) { Some(RowResult::new() } else { self.row_requests.insert(id, walls);} } } } }