vanity_ssh_rs/worker/
thread.rs1use 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}