lease_management/
flush_trigger.rs
1use async_trait::async_trait;
6use futures::stream::StreamExt;
7use log::warn;
8use {fidl_fuchsia_power_system as fsag, fuchsia_trace as ftrace};
9
10pub struct FlushTrigger {
13 sag: fsag::ActivityGovernorProxy,
14}
15
16impl FlushTrigger {
17 pub fn new(sag: fsag::ActivityGovernorProxy) -> Self {
18 Self { sag }
19 }
20
21 pub async fn run<'a>(&self, flusher: &dyn FlushListener) -> Result<(), fidl::Error> {
25 let (client, server) =
26 fidl::endpoints::create_endpoints::<fsag::ActivityGovernorListenerMarker>();
27
28 self.sag
29 .register_listener(fsag::ActivityGovernorRegisterListenerRequest {
30 listener: Some(client),
31 ..Default::default()
32 })
33 .await?;
34
35 let mut request_stream = server.into_stream();
36
37 while let Some(req) = request_stream.next().await {
38 match req {
39 Ok(fsag::ActivityGovernorListenerRequest::OnSuspendStarted { responder }) => {
40 ftrace::duration!(crate::TRACE_CATEGORY, c"flush-triggered");
41 flusher.flush().await;
42 let _ = responder.send();
43 }
44 Ok(fsag::ActivityGovernorListenerRequest::OnResume { responder }) => {
45 let _ = responder.send();
46 }
47 Ok(fsag::ActivityGovernorListenerRequest::_UnknownMethod { .. }) => {
48 warn!("unrecognized listener method, ignoring");
49 }
50 Err(_) => continue,
51 }
52 }
53 Ok(())
54 }
55}
56
57#[async_trait]
58pub trait FlushListener {
59 async fn flush(&self);
60}