Skip to content

Commit 7e5f643

Browse files
committed
Implement FusedFuture for framed futures
1 parent 3dcc5ad commit 7e5f643

File tree

3 files changed

+34
-1
lines changed

3 files changed

+34
-1
lines changed

backtrace/src/framed.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use core::future::Future;
22
use core::pin::Pin;
33
use core::task::{Context, Poll};
4+
use futures::future::FusedFuture;
45
use std::marker::PhantomPinned;
56

67
use crate::frame::Frame;
@@ -49,3 +50,9 @@ where
4950
frame.in_scope(|| future.poll(cx))
5051
}
5152
}
53+
54+
impl<F: FusedFuture> FusedFuture for Framed<F> {
55+
fn is_terminated(&self) -> bool {
56+
self.future.is_terminated()
57+
}
58+
}

backtrace/src/location.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ impl Location {
7777
/// }).await
7878
/// }
7979
/// ```
80-
pub fn frame<F>(self, f: F) -> impl Future<Output = F::Output>
80+
pub fn frame<F>(self, f: F) -> crate::Framed<F>
8181
where
8282
F: Future,
8383
{

backtrace/tests/fused.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
use futures::{future::FusedFuture, FutureExt};
2+
3+
/// A test that frame can propagate FusedFuture.
4+
mod util;
5+
6+
#[test]
7+
fn consolidate() {
8+
util::model(|| util::run(fused_future()));
9+
}
10+
11+
#[async_backtrace::framed]
12+
fn fused_future() -> impl FusedFuture<Output = ()> {
13+
async_backtrace::location!().frame(ready().fuse())
14+
}
15+
16+
#[async_backtrace::framed]
17+
async fn ready() {
18+
let dump = async_backtrace::taskdump_tree(true);
19+
20+
pretty_assertions::assert_str_eq!(
21+
util::strip(dump),
22+
"\
23+
╼ fused::fused_future at backtrace/tests/fused.rs:LINE:COL
24+
└╼ fused::ready::{{closure}} at backtrace/tests/fused.rs:LINE:COL"
25+
);
26+
}

0 commit comments

Comments
 (0)