Adds synchronization primitives that can be shared between multiple processes
let mut shared = SharedMemoryObject::new(123)?;
let pid = unsafe { fork() };
assert!(pid >= 0);
if pid == 0 {
assert_eq!(*shared.get(), 123);
*shared.get_mut() = 456;
sleep(Duration::from_millis(40));
assert_eq!(*shared.get(), 789);
} else {
sleep(Duration::from_millis(20));
assert_eq!(*shared.get(), 456);
*shared.get_mut() = 789;
}
let mut mutex = SharedMutex::new()?;
let pid = unsafe { fork() };
assert!(pid >= 0);
if pid == 0 {
println!("child lock()");
mutex.lock()?;
println!("child locked");
sleep(Duration::from_millis(40));
println!("child unlock()");
mutex.unlock()?;
} else {
sleep(Duration::from_millis(20));
println!("parent lock()");
mutex.lock()?;
println!("parent locked");
sleep(Duration::from_millis(20));
println!("parent unlock()");
mutex.unlock()?;
}
let mut mutex = SharedMutex::new()?;
let mut condvar = SharedCondvar::new()?;
let pid = unsafe { fork() };
assert!(pid >= 0);
if pid == 0 {
println!("child lock()");
mutex.lock()?;
println!("child wait()");
condvar.wait(&mut mutex)?;
println!("child notified");
mutex.unlock()?;
println!("child unlocked");
} else {
sleep(Duration::from_millis(40));
println!("parent notify()");
condvar.notify_one()?;
}