metrics/sys/linux/
controller.rs1use 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}