bitcoin_script_analyzer/
threadpool.rs

1#[cfg(feature = "threads")]
2use std::{
3    sync::{
4        mpsc::{channel, Sender},
5        Arc, Mutex,
6    },
7    thread::Scope,
8};
9
10#[cfg(feature = "threads")]
11#[derive(Clone)]
12pub struct ThreadPool<'a> {
13    sender: Sender<Box<dyn FnOnce() + Send + 'a>>,
14}
15
16#[cfg(feature = "threads")]
17impl<'a> ThreadPool<'a> {
18    pub fn new(scope: &'a Scope<'a, '_>, worker_threads: usize) -> Self {
19        let (sender, receiver) = channel::<Box<dyn FnOnce() + Send + 'a>>();
20        let receiver = Arc::new(Mutex::new(receiver));
21        for _ in 0..worker_threads {
22            let receiver = receiver.clone();
23
24            scope.spawn(move || {
25                while let Ok(f) = {
26                    let guard = receiver.lock().unwrap();
27                    let f = guard.recv();
28                    drop(guard);
29                    f
30                } {
31                    f();
32                }
33            });
34        }
35
36        Self { sender }
37    }
38
39    pub fn submit_job<F: FnOnce() + Send + 'a>(&self, job: F) {
40        self.sender.send(Box::new(job)).unwrap();
41    }
42}