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