xref: /aosp_15_r20/external/crosvm/metrics/src/sys/linux/controller.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1 // Copyright 2022 The ChromiumOS Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 use anyhow::Result;
6 use base::ReadNotifier;
7 use base::WaitContext;
8 
9 use crate::controller::MetricsController;
10 use crate::controller::MetricsControllerToken;
11 
12 impl MetricsController {
run_internal(&mut self) -> Result<()>13     pub(crate) fn run_internal(&mut self) -> Result<()> {
14         let wait_ctx: WaitContext<MetricsControllerToken> = WaitContext::new()?;
15         self.closed_tubes = 0;
16 
17         for (agent_index, agent) in self.agents.iter().enumerate() {
18             wait_ctx.add(
19                 agent.get_read_notifier(),
20                 MetricsControllerToken::Agent(agent_index),
21             )?;
22         }
23 
24         'listen: loop {
25             let events = wait_ctx.wait()?;
26             for event in events.iter().filter(|e| e.is_readable) {
27                 let MetricsControllerToken::Agent(client_index) = event.token;
28                 self.on_tube_readable(&self.agents[client_index]);
29             }
30             for event in events.iter().filter(|e| e.is_hungup) {
31                 let MetricsControllerToken::Agent(client_index) = event.token;
32                 wait_ctx.delete(self.agents[client_index].get_read_notifier())?;
33                 if self.on_connection_closed() {
34                     break 'listen;
35                 }
36             }
37         }
38         Ok(())
39     }
40 }
41