@@ -31,10 +31,7 @@ use runner_shared::metadata::PerfMetadata;
3131use runner_shared:: unwind_data:: UnwindData ;
3232use std:: path:: Path ;
3333use std:: path:: PathBuf ;
34- use std:: sync:: Arc ;
35- use std:: time:: Duration ;
3634use std:: { cell:: OnceCell , collections:: HashMap , process:: ExitStatus } ;
37- use tokio:: sync:: Mutex ;
3835
3936mod jit_dump;
4037mod memory_mappings;
@@ -205,14 +202,15 @@ impl PerfRunner {
205202 let cmd = wrap_with_sudo ( wrapped_builder) ?. build ( ) ;
206203 debug ! ( "cmd: {cmd:?}" ) ;
207204
208- let on_process_started = async |_| -> anyhow :: Result < ( ) > {
205+ let on_process_started = | mut child : std :: process :: Child | async move {
209206 // If we output pipedata, we do not parse the perf map during teardown yet, so we need to parse memory
210207 // maps as we receive the `CurrentBenchmark` fifo commands.
211- let data = Self :: handle_fifo ( runner_fifo, perf_fifo, self . output_pipedata ) . await ?;
208+ let data =
209+ Self :: handle_fifo ( runner_fifo, perf_fifo, self . output_pipedata , & mut child) . await ?;
212210 self . benchmark_data . set ( data) . unwrap_or_else ( |_| {
213211 error ! ( "Failed to set benchmark data in PerfRunner" ) ;
214212 } ) ;
215- Ok ( ( ) )
213+ Ok ( child . wait ( ) ? )
216214 } ;
217215 run_command_with_log_pipe_and_callback ( cmd, on_process_started) . await
218216 }
@@ -248,37 +246,30 @@ impl PerfRunner {
248246
249247 async fn handle_fifo (
250248 mut runner_fifo : RunnerFifo ,
251- perf_fifo : PerfFifo ,
249+ mut perf_fifo : PerfFifo ,
252250 parse_memory_maps : bool ,
251+ child : & mut std:: process:: Child ,
253252 ) -> anyhow:: Result < BenchmarkData > {
254253 let mut symbols_by_pid = HashMap :: < pid_t , ProcessSymbols > :: new ( ) ;
255254 let mut unwind_data_by_pid = HashMap :: < pid_t , Vec < UnwindData > > :: new ( ) ;
256255
257- let perf_fifo = Arc :: new ( Mutex :: new ( perf_fifo) ) ;
258- let mut perf_ping_timeout = 5 ;
256+ // Check if the process has exited using try_wait (non-blocking)
259257 let health_check = async || {
260- let perf_ping = tokio:: time:: timeout ( Duration :: from_secs ( perf_ping_timeout) , async {
261- perf_fifo. lock ( ) . await . ping ( ) . await
262- } )
263- . await ;
264- if let Ok ( Err ( _) ) | Err ( _) = perf_ping {
265- debug ! ( "Failed to ping perf FIFO, ending perf fifo loop" ) ;
266- return Ok ( false ) ;
258+ match child. try_wait ( ) {
259+ Ok ( None ) => Ok ( true ) , // Still running
260+ Ok ( Some ( _) ) => Ok ( false ) , // Exited
261+ Err ( e) => Err ( anyhow:: Error :: from ( e) ) ,
267262 }
268- // Perf has started successfully, we can decrease the timeout for future pings
269- perf_ping_timeout = 1 ;
270-
271- Ok ( true )
272263 } ;
273264
274265 let on_cmd = async |cmd : & FifoCommand | {
275266 #[ allow( deprecated) ]
276267 match cmd {
277268 FifoCommand :: StartBenchmark => {
278- perf_fifo. lock ( ) . await . start_events ( ) . await ?;
269+ perf_fifo. start_events ( ) . await ?;
279270 }
280271 FifoCommand :: StopBenchmark => {
281- perf_fifo. lock ( ) . await . stop_events ( ) . await ?;
272+ perf_fifo. stop_events ( ) . await ?;
282273 }
283274 FifoCommand :: CurrentBenchmark { pid, .. } => {
284275 #[ cfg( target_os = "linux" ) ]
@@ -294,7 +285,7 @@ impl PerfRunner {
294285 }
295286 }
296287 FifoCommand :: PingPerf => {
297- if perf_fifo. lock ( ) . await . ping ( ) . await . is_err ( ) {
288+ if perf_fifo. ping ( ) . await . is_err ( ) {
298289 return Ok ( Some ( FifoCommand :: Err ) ) ;
299290 }
300291 return Ok ( Some ( FifoCommand :: Ack ) ) ;
0 commit comments