feat(main): stopping stereokit stops the event loop

This commit is contained in:
Nova
2022-08-17 12:15:45 -04:00
parent 6b13d47197
commit 5a5a7d50c9

View File

@@ -8,7 +8,7 @@ use once_cell::sync::Lazy;
use parking_lot::Mutex; use parking_lot::Mutex;
use std::sync::Arc; use std::sync::Arc;
use stereokit::{lifecycle::DisplayMode, Settings}; use stereokit::{lifecycle::DisplayMode, Settings};
use tokio::runtime::Handle; use tokio::{runtime::Handle, sync::oneshot};
static TOKIO_HANDLE: Lazy<Mutex<Option<Handle>>> = Lazy::new(Default::default); static TOKIO_HANDLE: Lazy<Mutex<Option<Handle>>> = Lazy::new(Default::default);
@@ -38,18 +38,21 @@ fn main() -> Result<()> {
.init() .init()
.expect("StereoKit failed to initialize"); .expect("StereoKit failed to initialize");
let (event_stop_tx, event_stop_rx) = oneshot::channel::<()>();
let event_thread = std::thread::Builder::new() let event_thread = std::thread::Builder::new()
.name("event_loop".to_owned()) .name("event_loop".to_owned())
.spawn(event_loop)?; .spawn(move || event_loop(event_stop_rx))?;
stereokit.run( stereokit.run(
|_draw_ctx| { |_draw_ctx| {
nodes::root::Root::logic_step(stereokit.time_elapsed()); nodes::root::Root::logic_step(stereokit.time_elapsed());
}, },
|| { || {
println!("Shut down StereoKit"); println!("Cleanly shut down StereoKit");
}, },
); );
let _ = event_stop_tx.send(());
event_thread event_thread
.join() .join()
.expect("Failed to cleanly shut down event loop")?; .expect("Failed to cleanly shut down event loop")?;
@@ -58,7 +61,7 @@ fn main() -> Result<()> {
} }
#[tokio::main] #[tokio::main]
async fn event_loop() -> anyhow::Result<()> { async fn event_loop(stop_rx: oneshot::Receiver<()>) -> anyhow::Result<()> {
TOKIO_HANDLE.lock().replace(Handle::current()); TOKIO_HANDLE.lock().replace(Handle::current());
let (event_loop, event_loop_join_handle) = let (event_loop, event_loop_join_handle) =
@@ -69,10 +72,12 @@ async fn event_loop() -> anyhow::Result<()> {
let result = tokio::select! { let result = tokio::select! {
biased; biased;
_ = tokio::signal::ctrl_c() => Ok(()), _ = tokio::signal::ctrl_c() => Ok(()),
// e = task => e?, _ = stop_rx => Ok(()),
e = event_loop_join_handle => e?, e = event_loop_join_handle => e?,
}; };
println!("Cleanly shut down event loop");
unsafe { unsafe {
stereokit::sys::sk_quit(); stereokit::sys::sk_quit();
} }