extern crate syncpool;
use std::collections::HashMap;
use std::mem::MaybeUninit;
use std::pin::Pin;
use std::sync::mpsc;
use std::sync::mpsc::SyncSender;
use std::thread;
use std::time::Duration;
use syncpool::prelude::*;
const COUNT: usize = 128;
static mut POOL: MaybeUninit<SyncPool<ComplexStruct>> = MaybeUninit::uninit();
#[derive(Default, Debug)]
struct ComplexStruct {
id: usize,
name: String,
body: Vec<String>,
flags: Vec<usize>,
children: Vec<usize>,
index: HashMap<usize, String>,
rev_index: HashMap<String, usize>,
}
unsafe fn pool_setup() -> (
Pin<&'static mut SyncPool<ComplexStruct>>,
Pin<&'static mut SyncPool<ComplexStruct>>,
) {
POOL.as_mut_ptr().write(SyncPool::with_size(COUNT / 2));
(
Pin::new(&mut *POOL.as_mut_ptr()),
Pin::new(&mut *POOL.as_mut_ptr()),
)
}
fn main() {
let (pinned_producer, pinned_consumer) = unsafe { pool_setup() };
let (tx, rx) = mpsc::sync_channel(64);
thread::spawn(move || {
let producer = pinned_producer.get_mut();
for i in 0..COUNT {
run(producer, &tx, i);
}
});
let handler = thread::spawn(move || {
let consumer = pinned_consumer.get_mut();
for content in rx {
println!("Receiving struct with id: {}", content.id);
consumer.put(content);
}
});
handler.join().unwrap_or_default();
println!("All done...");
}
fn run(pool: &mut SyncPool<ComplexStruct>, chan: &SyncSender<Box<ComplexStruct>>, id: usize) {
let mut content = pool.get();
content.id = id;
thread::sleep(Duration::from_nanos(32));
chan.send(content).unwrap_or_default();
}