Skip to content

Commit ce537da

Browse files
committed
Use select! instead of spawn and abort in pipe_signals
1 parent 7ca5bef commit ce537da

File tree

4 files changed

+17
-14
lines changed

4 files changed

+17
-14
lines changed

src/docker/container.rs

+13-10
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use std::pin::pin;
12
use std::time::Duration;
23

34
use super::{IoStream, IoStreamSource};
@@ -240,29 +241,31 @@ impl Container {
240241

241242
pub async fn pipe_signals(&self) -> JoinHandle<Result<()>> {
242243
let container = self.clone();
243-
let handle = spawn(async move {
244-
let stream = tokio_stream::empty()
245-
.merge(signal_stream(SignalKind::alarm()))
244+
let signal_handler = async move {
245+
let mut stream = pin!(signal_stream(SignalKind::alarm())
246246
.merge(signal_stream(SignalKind::hangup()))
247247
.merge(signal_stream(SignalKind::interrupt()))
248248
.merge(signal_stream(SignalKind::quit()))
249249
.merge(signal_stream(SignalKind::terminate()))
250250
.merge(signal_stream(SignalKind::user_defined1()))
251-
.merge(signal_stream(SignalKind::user_defined2()));
251+
.merge(signal_stream(SignalKind::user_defined2())));
252252

253-
tokio::pin!(stream);
254253
while let Some(signal) = stream.next().await {
255254
container.kill(signal?.as_raw_value()).await?;
256255
}
257256

258-
Err::<(), Error>(anyhow!("Failed to listen for signals"))
259-
});
257+
Err::<_, Error>(anyhow!("Failed to listen for signals"))
258+
};
260259

261260
let container = self.clone();
261+
let wait_for_exit = async move { container.wait().await };
262+
262263
spawn(async move {
263-
let _ = container.wait().await;
264-
handle.abort();
265-
Ok::<(), Error>(())
264+
tokio::select! {
265+
result = signal_handler => result,
266+
result = wait_for_exit => result,
267+
}?;
268+
Ok(())
266269
})
267270
}
268271
}

src/hotplug/pluggable_device.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ impl PluggableDevice {
5252
}
5353

5454
pub fn syspath(&self) -> &Path {
55-
&self.device.syspath()
55+
self.device.syspath()
5656
}
5757

5858
pub fn devnum(&self) -> (u32, u32) {

src/hotplug/udev_streams.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ pub enum UdevEvent {
1515
pub fn enumerate(hub_path: PathBuf) -> impl tokio_stream::Stream<Item = Result<PluggableDevice>> {
1616
try_stream! {
1717
let mut enumerator = Enumerator::new()?;
18-
let mut devices = enumerator
18+
let devices = enumerator
1919
.scan_devices()?
2020
.filter(|device| device.syspath().starts_with(&hub_path))
2121
.filter_map(|device| PluggableDevice::from_device(&device));
2222

23-
while let Some(device) = devices.next() {
23+
for device in devices {
2424
yield device;
2525
}
2626
}

src/main.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ async fn run(param: cli::Run, verbosity: Verbosity<InfoLevel>) -> Result<u8> {
104104

105105
let docker = Docker::connect_with_defaults()?;
106106
let container = docker.run(param.docker_args).await?;
107-
let _ = container.pipe_signals();
107+
drop(container.pipe_signals());
108108

109109
let hub_path = param.root_device.hub()?.syspath().to_owned();
110110
let hotplug_stream = run_hotplug(

0 commit comments

Comments
 (0)