Skip to content

Commit accb42a

Browse files
committed
Clean up node on shutdown
The internal `/rosout` topic was staying on through a shutdown. To initiate this cleanup now, a call to shutdown is required. That is guaranteed if you use `.is_ok()` or `.spin()` to keep the app running. If using neither, `rosrust::shutdown()` is a necessary call at the end.
1 parent 2a5ebbd commit accb42a

File tree

2 files changed

+20
-15
lines changed

2 files changed

+20
-15
lines changed

‎rosrust/src/api/mod.rs‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,32 +5,33 @@ use std::sync::atomic::{AtomicBool, Ordering};
55

66
mod clock;
77
pub mod error;
8+
pub mod handlers;
89
mod master;
910
mod naming;
1011
pub mod raii;
1112
pub mod resolve;
1213
mod ros;
1314
mod slave;
14-
pub mod handlers;
1515

1616
pub struct ShutdownManager {
17+
handler: Box<dyn Fn() + Send + Sync>,
1718
should_shutdown: AtomicBool,
1819
}
1920

20-
impl Default for ShutdownManager {
21-
fn default() -> Self {
21+
impl ShutdownManager {
22+
pub fn new(handler: impl Fn() + Send + Sync + 'static) -> Self {
2223
Self {
24+
handler: Box::new(handler),
2325
should_shutdown: AtomicBool::new(false),
2426
}
2527
}
26-
}
2728

28-
impl ShutdownManager {
2929
pub fn awaiting_shutdown(&self) -> bool {
3030
self.should_shutdown.load(Ordering::Relaxed)
3131
}
3232

3333
pub fn shutdown(&self) {
34+
(*self.handler)();
3435
self.should_shutdown.store(true, Ordering::Relaxed)
3536
}
3637
}

‎rosrust/src/api/ros.rs‎

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ use log::error;
2020
use ros_message::{Duration, Time};
2121
use serde::{Deserialize, Serialize};
2222
use std::collections::{HashMap, HashSet};
23+
use std::ops::Deref;
2324
use std::sync::Arc;
2425
use std::sync::Mutex;
2526
use std::thread::sleep;
@@ -36,7 +37,7 @@ pub struct Ros {
3637
name: String,
3738
clock: Arc<dyn Clock>,
3839
static_subs: Vec<Subscriber>,
39-
logger: Option<Publisher<Log>>,
40+
logger: Arc<Mutex<Option<Publisher<Log>>>>,
4041
shutdown_manager: Arc<ShutdownManager>,
4142
}
4243

@@ -79,7 +80,7 @@ impl Ros {
7980
ros.clock = ros_clock;
8081
}
8182

82-
ros.logger = Some(ros.publish("/rosout", 100)?);
83+
*ros.logger.lock().unwrap() = Some(ros.publish("/rosout", 100)?);
8384

8485
Ok(ros)
8586
}
@@ -104,7 +105,11 @@ impl Ros {
104105
let name = format!("{}/{}", namespace, name);
105106
let resolver = Resolver::new(&name)?;
106107

107-
let shutdown_manager = Arc::new(ShutdownManager::default());
108+
let logger = Arc::new(Mutex::new(None));
109+
let shutdown_manager = Arc::new(ShutdownManager::new({
110+
let logger = Arc::clone(&logger);
111+
move || drop(logger.lock().unwrap().take())
112+
}));
108113

109114
let slave = Slave::new(
110115
master_uri,
@@ -125,7 +130,7 @@ impl Ros {
125130
name,
126131
clock: Arc::new(RealClock::default()),
127132
static_subs: Vec::new(),
128-
logger: None,
133+
logger,
129134
shutdown_manager,
130135
})
131136
}
@@ -390,10 +395,6 @@ impl Ros {
390395

391396
pub fn log(&self, level: i8, msg: String, file: &str, line: u32) {
392397
self.log_to_terminal(level, &msg, file, line);
393-
let logger = &match self.logger {
394-
Some(ref v) => v,
395-
None => return,
396-
};
397398
let topics = self.slave.publications.get_topic_names();
398399
let message = Log {
399400
header: Header::default(),
@@ -405,8 +406,11 @@ impl Ros {
405406
function: String::default(),
406407
topics,
407408
};
408-
if let Err(err) = logger.send(message) {
409-
error!("Logging error: {}", err);
409+
let maybe_logger = self.logger.lock().unwrap();
410+
if let Some(logger) = maybe_logger.deref() {
411+
if let Err(err) = logger.send(message) {
412+
error!("Logging error: {}", err);
413+
}
410414
}
411415
}
412416

0 commit comments

Comments
 (0)