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