pixelrush/src/main.rs
Patrick Michl 19f3a6daf5
All checks were successful
continuous-integration/drone/push Build is passing
send exit messages to threads
2021-03-15 22:02:46 +01:00

66 lines
1.7 KiB
Rust

mod pixelflut;
use std::{
io::{self, BufReader, Read},
thread::JoinHandle,
};
use crossbeam::channel::*;
use pixelflut::*;
enum Message {
Pixel(u32, u32, image::Rgba<u8>),
Exit,
}
fn main() -> Result<(), std::io::Error> {
let mut stdin_reader = BufReader::new(io::stdin());
let mut image_buffer: Vec<u8> = Vec::new();
let _ = stdin_reader.read_to_end(&mut image_buffer)?;
let mut image = image::load_from_memory(&image_buffer).expect("Unable to read image format");
let manager = PixelflutConnectionManager::new("localhost:1234")?;
let pool = r2d2::Pool::builder()
.max_size(16)
.build(manager)
.expect("Could not initialize connection pool");
let image = image.as_rgba8().expect("Not a valid Image");
let (sender, receiver) = unbounded::<Message>();
let mut handles: Vec<JoinHandle<()>> = Vec::new();
for _ in 0..16 {
let r2 = receiver.clone();
let p2 = pool.clone();
let handle = std::thread::spawn(move || {
let mut connection = match p2.get() {
Ok(c) => c,
Err(_) => return,
};
loop {
match r2.recv().unwrap() {
Message::Pixel(x, y, c) => {
let _ = connection.set(x, y, c);
}
Message::Exit => return,
}
}
});
handles.push(handle);
}
for (x, y, p) in image.enumerate_pixels() {
let _ = sender.send(Message::Pixel(x, y, p.clone()));
}
(0..16).for_each(|_| {
let _ = sender.send(Message::Exit);
});
for thread in handles {
let _ = thread.join();
}
Ok(())
}