extern crate shared_memory;
use shared_memory::*;
use std::path::PathBuf;
struct SharedState {
num_listenners: u32,
message: [u8; 256],
}
unsafe impl SharedMemCast for SharedState {}
fn main() {
let lock_type = LockType::Mutex;
let mut my_shmem: SharedMem = match SharedMem::create(PathBuf::from("shared_mem.link"), lock_type, 4096) {
Ok(v) => v,
Err(e) => {
println!("Error : {}", e);
println!("Failed to create SharedMem...");
return;
}
};
println!("Created link file \"{}
Backed by OS identifier : \"{}\"
Size : 0x{:x}",
my_shmem.get_link_path().unwrap().to_string_lossy(),
my_shmem.get_real_path().unwrap(),
my_shmem.get_size());
{
let mut shared_state: WriteLockGuard<SharedState> = match my_shmem.wlock() {
Ok(v) => v,
Err(_) => panic!("Failed to acquire write lock !"),
};
shared_state.num_listenners = 0;
let src = b"Welcome, we currently have 0 listenners !\x00";
shared_state.message[0..src.len()].copy_from_slice(src);
println!("Holding lock for 5 seconds !");
std::thread::sleep(std::time::Duration::from_secs(5));
}
println!("Waiting for a listenner to connect !");
loop {
let shared_state: ReadLockGuard<SharedState> = match my_shmem.rlock() {
Ok(v) => v,
Err(_) => panic!("Failed to acquire read lock !"),
};
if shared_state.num_listenners > 0 {
println!("We have a listenner !");
break;
}
drop(shared_state);
std::thread::sleep(std::time::Duration::from_millis(200));
}
{
let mut shared_state: WriteLockGuard<SharedState> = match my_shmem.wlock() {
Ok(v) => v,
Err(_) => panic!("Failed to acquire write lock !"),
};
let src = format!("Goodbye {} listenner(s) !\x00", shared_state.num_listenners);
shared_state.message[0..src.len()].copy_from_slice(&src.as_bytes());
}
}