aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy/src/executor/timer.rs12
-rw-r--r--embassy/src/time/mod.rs2
2 files changed, 12 insertions, 2 deletions
diff --git a/embassy/src/executor/timer.rs b/embassy/src/executor/timer.rs
index 774613ebf..8297564a0 100644
--- a/embassy/src/executor/timer.rs
+++ b/embassy/src/executor/timer.rs
@@ -2,7 +2,7 @@ use core::future::Future;
2use core::marker::PhantomData; 2use core::marker::PhantomData;
3use core::pin::Pin; 3use core::pin::Pin;
4use core::task::{Context, Poll}; 4use core::task::{Context, Poll};
5use futures::Stream; 5use futures::{future::select, future::Either, pin_mut, Stream};
6 6
7use super::raw; 7use super::raw;
8use crate::time::{Duration, Instant}; 8use crate::time::{Duration, Instant};
@@ -31,6 +31,16 @@ impl crate::traits::delay::Delay for Delay {
31 } 31 }
32} 32}
33 33
34pub struct TimeoutError;
35pub async fn with_timeout<F: Future>(timeout: Duration, fut: F) -> Result<F::Output, TimeoutError> {
36 let timeout_fut = Timer::after(timeout);
37 pin_mut!(fut);
38 match select(fut, timeout_fut).await {
39 Either::Left((r, _)) => Ok(r),
40 Either::Right(_) => Err(TimeoutError),
41 }
42}
43
34/// A future that completes at a specified [Instant](struct.Instant.html). 44/// A future that completes at a specified [Instant](struct.Instant.html).
35pub struct Timer { 45pub struct Timer {
36 expires_at: Instant, 46 expires_at: Instant,
diff --git a/embassy/src/time/mod.rs b/embassy/src/time/mod.rs
index 4e9b5f592..d7284b7a2 100644
--- a/embassy/src/time/mod.rs
+++ b/embassy/src/time/mod.rs
@@ -5,7 +5,7 @@ mod duration;
5mod instant; 5mod instant;
6mod traits; 6mod traits;
7 7
8pub use crate::executor::timer::{Delay, Ticker, Timer}; 8pub use crate::executor::timer::{with_timeout, Delay, Ticker, TimeoutError, Timer};
9pub use duration::Duration; 9pub use duration::Duration;
10pub use instant::Instant; 10pub use instant::Instant;
11pub use traits::*; 11pub use traits::*;