recoverable_thread_pool/worker/
impl.rs

1use super::r#struct::Worker;
2use crate::thread_pool::r#type::ThreadPoolJob;
3use recoverable_spawn::*;
4use std::{
5    sync::{Arc, Mutex, mpsc::Receiver},
6    thread::spawn,
7};
8
9/// Worker implementation for handling thread pool jobs.
10impl Worker {
11    /// Creates a new worker thread.
12    ///
13    /// # Arguments
14    ///
15    /// - `usize` - The worker identifier.
16    /// - `Arc<Mutex<Receiver<ThreadPoolJob>>>` - The shared job receiver.
17    ///
18    /// # Returns
19    ///
20    /// - `Option<Worker>` - The new worker instance.
21    pub fn new(id: usize, receiver: Arc<Mutex<Receiver<ThreadPoolJob>>>) -> Option<Worker> {
22        spawn(|| {
23            let _ = sync::recoverable_spawn(move || {
24                loop {
25                    if let Ok(receiver_lock) = receiver.lock() {
26                        if let Ok(job) = receiver_lock.recv() {
27                            let _ = sync::recoverable_spawn(job);
28                        }
29                    }
30                }
31            });
32        });
33        return Some(Worker { id });
34    }
35}