Small cleanup of the use of locks.
Test: atest libnetsim_daemon_tests
Change-Id: I7e44ee9ab4b9dfe3aadc4e21c64c644d45bc0902
diff --git a/rust/daemon/src/echip/packet.rs b/rust/daemon/src/echip/packet.rs
index 6a45a76..5ed498e 100644
--- a/rust/daemon/src/echip/packet.rs
+++ b/rust/daemon/src/echip/packet.rs
@@ -15,7 +15,7 @@
use std::collections::HashMap;
use std::sync::{
mpsc::{channel, Sender},
- Arc, Mutex,
+ Arc, Mutex, MutexGuard,
};
use std::thread;
@@ -50,21 +50,27 @@
}
// SENDERS is a singleton that contains a hash map from
-// (kind,facade_id) to responder queue.
+// chip_id to responder queue.
+
+type SenderMap = HashMap<ChipIdentifier, Sender<ResponsePacket>>;
+struct SharedSenders(Arc<Mutex<SenderMap>>);
+
+impl SharedSenders {
+ fn lock(&self) -> MutexGuard<SenderMap> {
+ self.0.lock().expect("Poisoned Shared Senders lock")
+ }
+}
lazy_static! {
- static ref SENDERS: Arc<Mutex<HashMap<ChipIdentifier, Sender<ResponsePacket>>>> =
- Arc::new(Mutex::new(HashMap::new()));
+ static ref SENDERS: SharedSenders = SharedSenders(Arc::new(Mutex::new(HashMap::new())));
}
/// Register a chip controller instance to a transport manager.
pub fn register_transport(chip_id: ChipIdentifier, mut responder: Box<dyn Response + Send>) {
let (tx, rx) = channel::<ResponsePacket>();
- let mut map = SENDERS.lock().expect("register_transport: poisoned lock");
- if map.contains_key(&chip_id) {
+ if SENDERS.lock().insert(chip_id, tx).is_some() {
error!("register_transport: key already present for chip_id: {chip_id}");
}
- map.insert(chip_id, tx);
let _ = thread::Builder::new().name(format!("transport_writer_{chip_id}")).spawn(move || {
info!("register_transport: started thread chip_id: {chip_id}");
loop {
@@ -84,7 +90,7 @@
/// Unregister a chip controller instance.
pub fn unregister_transport(chip_id: ChipIdentifier) {
// Shuts down the responder thread, because sender is dropped.
- SENDERS.lock().expect("unregister_transport: poisoned lock").remove(&chip_id);
+ SENDERS.lock().remove(&chip_id);
}
// Handle response from facades.
@@ -99,7 +105,7 @@
let packet_vec = packet.as_slice().to_vec();
captures_handler::handle_packet_response(chip_id, &packet_vec, packet_type.into());
- let mut binding = SENDERS.lock().expect("Failed to acquire lock on SENDERS");
+ let mut binding = SENDERS.lock();
if let Some(responder) = binding.get(&chip_id) {
if responder.send(ResponsePacket { packet: packet_vec, packet_type }).is_err() {
warn!("handle_response: send failed for chip_id: {chip_id}");
@@ -148,17 +154,17 @@
let val: Box<dyn Response + Send> = Box::new(TestTransport {});
register_transport(0, val);
{
- let binding = SENDERS.lock().unwrap();
+ let binding = SENDERS.lock();
assert!(binding.contains_key(&0));
}
- SENDERS.lock().unwrap().remove(&0);
+ SENDERS.lock().remove(&0);
}
#[test]
fn test_unregister_transport() {
register_transport(1, Box::new(TestTransport {}));
unregister_transport(1);
- assert!(SENDERS.lock().unwrap().get(&1).is_none());
+ assert!(SENDERS.lock().get(&1).is_none());
}
}