Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
google
GitHub Repository: google/crosvm
Path: blob/main/metrics/src/sys/linux/controller.rs
5394 views
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 {
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
42