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
use std::sync::{Arc, Mutex, Condvar};
use std::sync::atomic::{AtomicBool, Ordering};
use std::time::Duration;
use super::{ ConmanManager, ConmanItem };

pub struct ConmanWorkerProcessor {
    pub running: AtomicBool,
    pub is_busy: AtomicBool,
    pub manager: Arc<Mutex<ConmanManager>>,
    pub sync_object: Arc<(Mutex<bool>, Condvar)>
}
impl ConmanWorkerProcessor {
    pub fn new (manager: Arc<Mutex<ConmanManager>> ) -> ConmanWorkerProcessor {
        let sync_object_pair = Arc::new((Mutex::new(false), Condvar::new()));
        let sync_object = sync_object_pair.clone();
        ConmanWorkerProcessor {
            running: AtomicBool::new(true),
            is_busy: AtomicBool::new(false),
            sync_object,
            manager
        }
    }
    pub fn execute(&self) {
        while self.running.load(Ordering::Relaxed) {
            let mut processed_item : bool = false;
            let mut _item : Option<Box<dyn ConmanItem + Send>> = None;
            {
                let mut mgr = self.manager.lock().unwrap();
                _item = mgr.get_next_item();
            }
            match _item {
                Some(x) => {
                    self.is_busy.store(true, Ordering::SeqCst);
                    x.execute();
                    processed_item = true;
                    self.is_busy.store(false, Ordering::SeqCst);
                },
                None => {}
            }
            if !processed_item {
                let (lock, cvar) = &*self.sync_object;
                let mut _started = lock.lock().unwrap();
                'running: loop {
                    let _result = cvar.wait_timeout(_started, Duration::from_millis(5)).unwrap();
                    break 'running
                }
            }
        }
    }
}