create/
create.rs

1extern crate mem_file;
2use mem_file::*;
3use std::path::PathBuf;
4
5struct SharedState {
6    num_listenners: u32,
7    message: [u8; 256],
8}
9//WARNING : Only do this if you know what you're doing.
10impl MemFileCast for SharedState {}
11
12fn main() {
13
14    //Create a new shared MemFile
15    let mut mem_file: MemFile = match MemFile::create(PathBuf::from("test.txt"), 4096) {
16        Ok(v) => v,
17        Err(e) => {
18            println!("Error : {}", e);
19            println!("Failed to create MemFile...");
20            return;
21        }
22    };
23
24    //Initialize the MemFile with default values
25    {
26        let mut shared_state: MemFileWLock<SharedState> = match mem_file.wlock() {
27            Ok(v) => v,
28            Err(_) => panic!("Failed to acquire write lock !"),
29        };
30
31        shared_state.num_listenners = 0;
32        let src = b"Welcome, we currently have 0 listenners !\x00";
33        shared_state.message[0..src.len()].copy_from_slice(src);
34    }
35    println!("Waiting for a listenner to connect !");
36
37    //Loop until our memory has changed
38    loop {
39
40        //Acquire read lock
41        let shared_state: MemFileRLock<SharedState> = match mem_file.rlock() {
42            Ok(v) => v,
43            Err(_) => panic!("Failed to acquire read lock !"),
44        };
45
46        //Check shared memory
47        if shared_state.num_listenners > 0 {
48            println!("We have a listenner !");
49            break;
50        }
51
52        //Release the lock before sleeping
53        drop(shared_state);
54        std::thread::sleep(std::time::Duration::from_millis(200));
55    }
56
57    //Modify the shared memory just for fun
58    {
59        let mut shared_state: MemFileWLock<SharedState> = match mem_file.wlock() {
60            Ok(v) => v,
61            Err(_) => panic!("Failed to acquire write lock !"),
62        };
63
64        let src = format!("Goodbye {} listenner(s) !\x00", shared_state.num_listenners);
65        shared_state.message[0..src.len()].copy_from_slice(&src.as_bytes());
66    }
67}