From d77f141c3c2431122efd08a9352e22dbf8d95788 Mon Sep 17 00:00:00 2001 From: Simon Renblad Date: Wed, 1 Nov 2023 10:28:02 +0800 Subject: [PATCH] runtime.comms.rs: run idle kernel on start-up --- src/runtime/src/comms.rs | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/runtime/src/comms.rs b/src/runtime/src/comms.rs index d02d974..dde191d 100644 --- a/src/runtime/src/comms.rs +++ b/src/runtime/src/comms.rs @@ -722,8 +722,37 @@ pub fn main(timer: GlobalTimer, cfg: Config) { mgmt::start(cfg); task::spawn(async move { - let connection = Rc::new(Semaphore::new(1, 1)); + let connection = Rc::new(Semaphore::new(0, 1)); let terminate = Rc::new(Semaphore::new(0, 1)); + + task::spawn({ + let control = control.clone(); + let idle_kernel = idle_kernel.clone(); + let connection = connection.clone(); + let terminate = terminate.clone(); + let up_destinations = up_destinations.clone(); + let aux_mutex = aux_mutex.clone(); + let routing_table = drtio_routing_table.clone(); + async move { + let routing_table = routing_table.borrow(); + select_biased! { + _ = (async { + if let Some(buffer) = &*idle_kernel { + info!("Loading idle kernel"); + let _ = load_kernel(&buffer, &control, None) + .await.map_err(|_| warn!("error loading idle kernel")); + info!("Running idle kernel"); + let _ = handle_run_kernel(None, &control, &up_destinations, &aux_mutex, &routing_table, timer) + .await.map_err(|_| warn!("error running idle kernel")); + info!("Idle kernel terminated"); + } + }).fuse() => (), + _ = terminate.async_wait().fuse() => () + } + connection.signal(); + } + }); + loop { let mut stream = TcpStream::accept(1381, 0x10_000, 0x10_000).await.unwrap();