Skip to content

Commit f9f0a96

Browse files
committed
fix: Actually shutdown serial threads on device disconnect
Instead of just growing unbounded with log messages. Fixes #648
1 parent a5b4024 commit f9f0a96

1 file changed

Lines changed: 20 additions & 2 deletions

File tree

buttplug/src/server/device/hardware/communication/serialport/serialport_hardware.rs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ fn serial_write_thread(mut port: Box<dyn SerialPort>, receiver: mpsc::Receiver<V
118118
// This is a blocking recv so we don't have to worry about the port.
119119
while let Some(v) = recv.blocking_recv() {
120120
if let Err(err) = port.write_all(&v) {
121-
error!("Cannot write data to serial port, exiting thread: {}", err);
121+
warn!("Cannot write data to serial port, exiting thread: {}", err);
122122
return;
123123
}
124124
}
@@ -158,6 +158,7 @@ fn serial_read_thread(
158158
warn!("Error reading from serial port: {:?}", e);
159159
if e.kind() == serialport::ErrorKind::NoDevice {
160160
info!("Serial device gone, breaking out of read loop.");
161+
break;
161162
}
162163
}
163164
}
@@ -206,6 +207,8 @@ impl SerialPortHardware {
206207
*/
207208
// TODO for now, assume 8/N/1. Not really sure when/if this would ever change.
208209
let port_name = port_info.port_name.clone();
210+
let port_name_clone = port_name.clone();
211+
209212
thread::Builder::new()
210213
.name("Serial Port Connection Thread".to_string())
211214
.spawn(move || {
@@ -232,15 +235,30 @@ impl SerialPortHardware {
232235
let (writer_sender, writer_receiver) = mpsc::channel(256);
233236
let (reader_sender, reader_receiver) = mpsc::channel(256);
234237

238+
let connected = Arc::new(AtomicBool::new(true));
235239
let token = CancellationToken::new();
236240
let read_token = token.child_token();
237241
let read_port = (*port)
238242
.try_clone()
239243
.expect("Should always be able to clone port");
244+
let connected_clone = connected.clone();
245+
let event_stream_clone = device_event_sender.clone();
240246
let read_thread = thread::Builder::new()
241247
.name("Serial Reader Thread".to_string())
242248
.spawn(move || {
243249
serial_read_thread(read_port, reader_sender, read_token);
250+
connected_clone.store(false, Ordering::Relaxed);
251+
if event_stream_clone.receiver_count() != 0 {
252+
if let Err(err) = event_stream_clone
253+
.send(HardwareEvent::Disconnected(
254+
format!("{:?}", &port_name_clone)
255+
)) {
256+
error!(
257+
"Cannot send notification, device object disappeared: {:?}",
258+
err
259+
);
260+
}
261+
}
244262
})
245263
.expect("Should always be able to create thread");
246264

@@ -263,7 +281,7 @@ impl SerialPortHardware {
263281
port_receiver: Arc::new(Mutex::new(reader_receiver)),
264282
port_sender: writer_sender,
265283
_port: Arc::new(Mutex::new(port)),
266-
connected: Arc::new(AtomicBool::new(true)),
284+
connected,
267285
device_event_sender,
268286
thread_cancellation_token: token,
269287
})

0 commit comments

Comments
 (0)