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
55
56
57
58
59
60
61
62
63

use std::sync::{Arc, Mutex};
mod item;
pub use item::ConmanItem;
mod manager;
pub use manager::ConmanManager;
mod processor;
pub use processor::ConmanWorkerProcessor;
mod worker;
pub use worker::ConmanWorker;

pub struct Conman {
    manager: Arc<Mutex<ConmanManager>>,
    workers: Vec<ConmanWorker>
}
impl Conman {
    pub fn add_item (&self, item: Box<dyn ConmanItem + Send>) {
        {
            let mut mgr = self.manager.lock().unwrap();
            mgr.add_item(item);
        }
        self.signal_workers(); 
    }
    pub fn add_item_priority (&self, item: Box<dyn ConmanItem + Send>) {
        {
            let mut mgr = self.manager.lock().unwrap();
            mgr.add_item_priority(item);
        }
        self.signal_workers(); 
    }
    fn signal_workers(&self) {
        for worker in &self.workers {
            if worker.signal() {
                break;
            }
        }
    }
    pub fn new(num_threads: usize) -> Conman {
        let mut workers = Vec::with_capacity(num_threads);
        let manager = Arc::new(Mutex::new(ConmanManager::new()));
        for _i in 0..num_threads {
            workers.push(ConmanWorker::new(manager.clone()));
        }
        Conman { workers, manager }
    }
    #[allow(dead_code)]
    pub fn stop(&mut self) -> usize {
        for worker in &self.workers {
            worker.stop();
        }
        let num_workers = self.workers.len();
        for _i in 0..num_workers {
            let _res = self.workers.pop();
        }
        let mgr = self.manager.lock().unwrap();
        return mgr.items.len();
    }
    #[allow(dead_code)]
    pub fn get_num_items(&self) -> usize {
        let mgr = self.manager.lock().unwrap();
        return mgr.items.len();
    }
}