let mut peer_poller = Arc::new(Mutex::new(PeerPoller::new()?));
let mut peer_poller_clone = peer_poller.clone();
thread::spawn(move || {
loop {
let p = rx.recv().unwrap();
match peer_poller_clone.lock() { <---- A
Ok(mut g) => {
g.add_peer(p);
}
Err(e) => {}
}
}
});
tx.send(peer)
match peer_poller.lock() { <---- B
Ok(mut g) => {
g.run();
}
Err(e) => {}
}
The run() method of PeerPoller is blocking, so the peer_poller.lock() at site B will never be released. This cause the lock() at site A to never succeed. How can I refactor this code to be more idomatic in Rust?
I understand that one option is to refactor code so that add_peer() takes &self and performs modifications via RefCell (interior mutability). However, I’m curious if there is a better solution. Any suggestions?