lease_management/
flush_trigger.rs

1// Copyright 2025 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use async_trait::async_trait;
6use futures::stream::StreamExt;
7use log::warn;
8use {fidl_fuchsia_power_system as fsag, fuchsia_trace as ftrace};
9
10/// Uses |fuchsia.power.system/ActivityGovernorListener|s to determine when to
11/// trigger a flush.
12pub struct FlushTrigger {
13    sag: fsag::ActivityGovernorProxy,
14}
15
16impl FlushTrigger {
17    pub fn new(sag: fsag::ActivityGovernorProxy) -> Self {
18        Self { sag }
19    }
20
21    /// Calls |flusher| when it receives
22    /// |fuchsia.power.system/ActivityGovernorListener.OnSuspendStarted| and
23    /// replies to the request *AFTER* |flusher.flush| returns.
24    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}