From 7e5f64312cea4d3247f57eb9dd126b8328c7502a Mon Sep 17 00:00:00 2001 From: Quetal Bradley Date: Thu, 21 Nov 2024 11:12:36 -0800 Subject: [PATCH] Implement FusedFuture for framed futures --- backtrace/src/framed.rs | 7 +++++++ backtrace/src/location.rs | 2 +- backtrace/tests/fused.rs | 26 ++++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 backtrace/tests/fused.rs diff --git a/backtrace/src/framed.rs b/backtrace/src/framed.rs index 0fc6329..645d426 100644 --- a/backtrace/src/framed.rs +++ b/backtrace/src/framed.rs @@ -1,6 +1,7 @@ use core::future::Future; use core::pin::Pin; use core::task::{Context, Poll}; +use futures::future::FusedFuture; use std::marker::PhantomPinned; use crate::frame::Frame; @@ -49,3 +50,9 @@ where frame.in_scope(|| future.poll(cx)) } } + +impl FusedFuture for Framed { + fn is_terminated(&self) -> bool { + self.future.is_terminated() + } +} diff --git a/backtrace/src/location.rs b/backtrace/src/location.rs index 84a1053..02ace73 100644 --- a/backtrace/src/location.rs +++ b/backtrace/src/location.rs @@ -77,7 +77,7 @@ impl Location { /// }).await /// } /// ``` - pub fn frame(self, f: F) -> impl Future + pub fn frame(self, f: F) -> crate::Framed where F: Future, { diff --git a/backtrace/tests/fused.rs b/backtrace/tests/fused.rs new file mode 100644 index 0000000..a39676e --- /dev/null +++ b/backtrace/tests/fused.rs @@ -0,0 +1,26 @@ +use futures::{future::FusedFuture, FutureExt}; + +/// A test that frame can propagate FusedFuture. +mod util; + +#[test] +fn consolidate() { + util::model(|| util::run(fused_future())); +} + +#[async_backtrace::framed] +fn fused_future() -> impl FusedFuture { + async_backtrace::location!().frame(ready().fuse()) +} + +#[async_backtrace::framed] +async fn ready() { + let dump = async_backtrace::taskdump_tree(true); + + pretty_assertions::assert_str_eq!( + util::strip(dump), + "\ +╼ fused::fused_future at backtrace/tests/fused.rs:LINE:COL + └╼ fused::ready::{{closure}} at backtrace/tests/fused.rs:LINE:COL" + ); +}