@@ -403,7 +403,26 @@ fn default_artifact_limits() -> ArtifactLimits {
403403 }
404404}
405405
406+ fn compile_exec_runner ( exec : & RssExec ) -> AgentRunner {
407+ if exec. unlimited_fuel {
408+ compile_rss_with_fuel ( exec. module , None )
409+ } else {
410+ compile_rss ( exec. module )
411+ }
412+ }
413+
406414fn run_rss_exec ( fixture : & Fixture , config : & ProcessToolConfig , exec : RssExec ) -> RssRun {
415+ let runner = compile_exec_runner ( & exec) ;
416+ run_rss_exec_with_runner ( fixture, config, exec, runner, None )
417+ }
418+
419+ fn run_rss_exec_with_runner (
420+ fixture : & Fixture ,
421+ config : & ProcessToolConfig ,
422+ exec : RssExec ,
423+ runner : AgentRunner ,
424+ process_spawn_hook : Option < Arc < dyn Fn ( ) + Send + Sync > > ,
425+ ) -> RssRun {
407426 let lifecycle = match exec. shared_lifecycle . clone ( ) {
408427 Some ( lifecycle) => lifecycle,
409428 None => Arc :: new ( build_lifecycle (
@@ -422,6 +441,9 @@ fn run_rss_exec(fixture: &Fixture, config: &ProcessToolConfig, exec: RssExec) ->
422441 . expect ( "process capability" ) ,
423442 ) ,
424443 } ;
444+ if let Some ( hook) = process_spawn_hook {
445+ processes. set_before_os_spawn_hook ( hook) ;
446+ }
425447 let artifacts = if exec. enable_artifacts {
426448 Some ( Arc :: new (
427449 ArtifactCapability :: new ( lifecycle. as_ref ( ) . clone ( ) , owner ( ) , exec. artifact_limits )
@@ -453,11 +475,6 @@ fn run_rss_exec(fixture: &Fixture, config: &ProcessToolConfig, exec: RssExec) ->
453475 } ,
454476 "config" : rss_config_json( config) ,
455477 } ) ;
456- let runner = if exec. unlimited_fuel {
457- compile_rss_with_fuel ( exec. module , None )
458- } else {
459- compile_rss ( exec. module )
460- } ;
461478 let output = runner
462479 . with_host ( host)
463480 . run_with_context ( json_to_vm_value ( & context) )
@@ -1077,15 +1094,29 @@ fn foreground_timeout_kills_child_and_grandchild() {
10771094 ] ,
10781095 "timeout_ms" : 120
10791096 } ) ;
1080- let started = Instant :: now ( ) ;
1081- let rss = run_rss_exec (
1097+ let spawn_started_at = Arc :: new ( Mutex :: new ( None ) ) ;
1098+ let exec = default_exec ( "terminal.rss" , "terminal" , arguments) ;
1099+ let runner = compile_exec_runner ( & exec) ;
1100+ let rss = run_rss_exec_with_runner (
10821101 & fixture,
10831102 & config,
1084- default_exec ( "terminal.rss" , "terminal" , arguments) ,
1103+ exec,
1104+ runner,
1105+ Some ( {
1106+ let spawn_started_at = Arc :: clone ( & spawn_started_at) ;
1107+ Arc :: new ( move || {
1108+ * spawn_started_at. lock ( ) . expect ( "spawn timer" ) = Some ( Instant :: now ( ) ) ;
1109+ } )
1110+ } ) ,
10851111 ) ;
10861112 assert_eq ! ( rss. result[ "ok" ] , json!( false ) ) ;
10871113 assert_eq ! ( rss. result[ "error" ] [ "code" ] , json!( "deadline_elapsed" ) ) ;
10881114 assert_canonical_envelope ( & rss. result ) ;
1115+ let started = spawn_started_at
1116+ . lock ( )
1117+ . expect ( "spawn timer" )
1118+ . take ( )
1119+ . expect ( "spawn timer marker" ) ;
10891120 assert ! ( started. elapsed( ) < Duration :: from_secs( 2 ) ) ;
10901121 let pid: u32 = fs:: read_to_string ( & marker)
10911122 . expect ( "pid marker" )
0 commit comments