metrics/sys/linux/
controller.rs

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
5use anyhow::Result;
6use base::ReadNotifier;
7use base::WaitContext;
8
9use crate::controller::MetricsController;
10use crate::controller::MetricsControllerToken;
11
12impl MetricsController {
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}