vanity_ssh_rs/worker/
thread.rs

1use std::sync::Arc;
2use std::sync::atomic::{AtomicBool, Ordering};
3use std::sync::mpsc::Sender;
4use std::thread;
5
6use crate::core::pattern::Pattern;
7use crate::worker::generator::generate_and_check_key;
8use crate::worker::message::WorkerMessage;
9
10pub fn spawn_worker_threads(
11    n_threads: usize,
12    pattern: Arc<Pattern>,
13    tx: Sender<WorkerMessage>,
14    stop_flag: Arc<AtomicBool>,
15) -> Vec<thread::JoinHandle<()>> {
16    (0..n_threads)
17        .map(|_| {
18            let tx = tx.clone();
19            let pattern = Arc::clone(&pattern);
20            let stop_flag = Arc::clone(&stop_flag);
21            thread::spawn(move || run_worker_loop(pattern, tx, stop_flag))
22        })
23        .collect()
24}
25
26pub fn run_worker_loop(
27    pattern: Arc<Pattern>,
28    tx: Sender<WorkerMessage>,
29    stop_flag: Arc<AtomicBool>,
30) {
31    let mut local_attempts = 0;
32
33    loop {
34        if stop_flag.load(Ordering::Relaxed) {
35            break;
36        }
37        let (key_pair, matches) = generate_and_check_key(&pattern);
38        local_attempts += 1;
39
40        if matches {
41            send_success(&tx, key_pair, local_attempts);
42            break;
43        }
44
45        if local_attempts % 10000 == 0 {
46            send_progress_update(&tx, local_attempts);
47            local_attempts = 0;
48        }
49    }
50}
51
52pub fn send_success(
53    tx: &Sender<WorkerMessage>,
54    key_pair: crate::core::keypair::KeyPair,
55    attempts: u64,
56) {
57    tx.send(WorkerMessage {
58        attempts,
59        found_key: Some(key_pair),
60    })
61    .unwrap();
62}
63
64pub fn send_progress_update(tx: &Sender<WorkerMessage>, attempts: u64) {
65    tx.send(WorkerMessage {
66        attempts,
67        found_key: None,
68    })
69    .unwrap();
70}