Skip to content

Commit 133a831

Browse files
committed
runtime example now stops and cleans the nodes when receiving a ctrl-c
Signed-off-by: gabrik <gabriele.baldoni@gmail.com>
1 parent dc416f2 commit 133a831

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

runtime/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ edition = "2018"
66
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
77

88
[dependencies]
9+
async-ctrlc ={version = "1.2.0", features = ["stream"]}
910
async-std = { version = "=1.10.0", features = ["attributes"] }
1011
zenoh-flow = { git = "https://github.com/eclipse-zenoh/zenoh-flow.git", branch = "master" }
1112
zenoh = { git = "https://github.com/eclipse-zenoh/zenoh.git", branch = "master"}

runtime/src/main.rs

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
// TODO: this should become a deamon.
1515

16+
use async_ctrlc::CtrlC;
17+
use async_std::prelude::StreamExt;
1618
use clap::Parser;
1719
use std::convert::TryFrom;
1820
use std::fs::{File, *};
@@ -115,5 +117,52 @@ async fn main() {
115117
instance.start_node(id).await.unwrap()
116118
}
117119

118-
let () = std::future::pending().await;
120+
let ctrlc = CtrlC::new().expect("Unable to create Ctrl-C handler");
121+
let mut stream = ctrlc.enumerate().take(1);
122+
stream.next().await;
123+
log::trace!("Received Ctrl-C start teardown");
124+
125+
// Stopping nodes
126+
let sources = instance.get_sources();
127+
for id in &sources {
128+
instance.stop_node(id).await.unwrap()
129+
}
130+
131+
let mut sinks = instance.get_sinks();
132+
for id in sinks.drain(..) {
133+
instance.stop_node(&id).await.unwrap()
134+
}
135+
136+
let mut operators = instance.get_operators();
137+
for id in operators.drain(..) {
138+
instance.stop_node(&id).await.unwrap()
139+
}
140+
141+
let mut connectors = instance.get_connectors();
142+
for id in connectors.drain(..) {
143+
instance.stop_node(&id).await.unwrap()
144+
}
145+
146+
// cleaning nodes
147+
let sources = instance.get_sources();
148+
for id in &sources {
149+
instance.clean_node(id).await.unwrap()
150+
}
151+
152+
let mut sinks = instance.get_sinks();
153+
for id in sinks.drain(..) {
154+
instance.clean_node(&id).await.unwrap()
155+
}
156+
157+
let mut operators = instance.get_operators();
158+
for id in operators.drain(..) {
159+
instance.clean_node(&id).await.unwrap()
160+
}
161+
162+
let mut connectors = instance.get_connectors();
163+
for id in connectors.drain(..) {
164+
instance.clean_node(&id).await.unwrap()
165+
}
166+
167+
log::trace!("Bye!");
119168
}

0 commit comments

Comments
 (0)