1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
use std::io;
use std::io::prelude::*;
use std::{thread, time};
use std::thread::sleep;
use std::sync::{Arc, Mutex, Condvar};
mod core;
use self::core::Core;
fn core_worker(mut core: Core, should_stop: &Mutex<bool>, cvar: &Condvar) {
loop {
while false == *should_stop.lock().unwrap() {
println!("step {}", core.step());
sleep(time::Duration::from_millis(1000));
}
while true == *should_stop.lock().unwrap() {
let _ = cvar.wait(should_stop.lock().unwrap()).unwrap();
}
}
}
fn cli_controller(asyncpair: Arc<(Mutex<bool>, Condvar)>) {
let &(ref should_stop, ref cvar) = &*asyncpair;
let stdin = io::stdin();
for line in stdin.lock().lines() {
let line = line.unwrap();
match line.as_ref() {
"stop" => {
println!("stop");
*should_stop.lock().unwrap() = true;
},
"start" => {
println!("start");
*should_stop.lock().unwrap() = false;
cvar.notify_one();
},
_ => ()
}
}
}
fn main() {
let core = Core::new();
let asyncpair = Arc::new((Mutex::new(false), Condvar::new()));
let asyncpair2 = asyncpair.clone();
thread::spawn(move || {
let (ref should_stop, ref condvar) = *asyncpair2;
core_worker(core, should_stop, condvar);
});
cli_controller(asyncpair);
}
|