bitcoin_script_analyzer/
threadpool.rs1#[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}