From 57085eea6a396f07904f6e1b68134cb1d4534eb0 Mon Sep 17 00:00:00 2001 From: Alan Jeffrey Date: Fri, 2 Nov 2018 10:57:26 -0500 Subject: [PATCH 1/3] Shut down servo when the ML app quits --- ports/libmlservo/src/lib.rs | 23 ++++++++++++++++--- .../magicleap/Servo2D/code/src/Servo2D.cpp | 4 ++-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/ports/libmlservo/src/lib.rs b/ports/libmlservo/src/lib.rs index 6b5bb2e6d00..8f4118d959c 100644 --- a/ports/libmlservo/src/lib.rs +++ b/ports/libmlservo/src/lib.rs @@ -43,6 +43,9 @@ use std::os::raw::c_char; use std::os::raw::c_void; use std::path::PathBuf; use std::rc::Rc; +use std::thread; +use std::time::Duration; +use std::time::Instant; #[repr(u32)] pub enum MLLogLevel { @@ -221,11 +224,25 @@ pub unsafe extern "C" fn navigate_servo(servo: *mut ServoInstance, text: *const } } +// Some magic numbers for shutdown +const SHUTDOWN_DURATION: Duration = Duration::from_secs(10); +const SHUTDOWN_POLL_INTERVAL: Duration = Duration::from_millis(100); + #[no_mangle] pub unsafe extern "C" fn discard_servo(servo: *mut ServoInstance) { - // Servo drop goes here! - if !servo.is_null() { - Box::from_raw(servo); + if let Some(servo) = servo.as_mut() { + let mut servo = Box::from_raw(servo); + let finish = Instant::now() + SHUTDOWN_DURATION; + 'outer: while Instant::now() < finish { + servo.servo.handle_events(vec![WindowEvent::Quit]); + for (_, msg) in servo.servo.get_events() { + if let EmbedderMsg::Shutdown = msg { + break 'outer; + } + } + thread::sleep(SHUTDOWN_POLL_INTERVAL); + } + servo.servo.deinit(); } } diff --git a/support/magicleap/Servo2D/code/src/Servo2D.cpp b/support/magicleap/Servo2D/code/src/Servo2D.cpp index d24316490b6..2c1ba02a038 100644 --- a/support/magicleap/Servo2D/code/src/Servo2D.cpp +++ b/support/magicleap/Servo2D/code/src/Servo2D.cpp @@ -58,8 +58,6 @@ Servo2D::Servo2D() { // Destroy a Servo 2D instance Servo2D::~Servo2D() { ML_LOG(Debug, "Servo2D Destructor."); - discard_servo(servo_); - servo_ = nullptr; } // The prism dimensions @@ -167,6 +165,8 @@ int Servo2D::init() { int Servo2D::deInit() { ML_LOG(Debug, "Servo2D Deinitializing."); + discard_servo(servo_); + servo_ = nullptr; return 0; } From 747122fb632b16a15b39f5629089b6fc2f726c56 Mon Sep 17 00:00:00 2001 From: Alan Jeffrey Date: Mon, 5 Nov 2018 09:57:26 -0600 Subject: [PATCH 2/3] Responding to review comments --- ports/libmlservo/src/lib.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ports/libmlservo/src/lib.rs b/ports/libmlservo/src/lib.rs index 8f4118d959c..532f0ff0481 100644 --- a/ports/libmlservo/src/lib.rs +++ b/ports/libmlservo/src/lib.rs @@ -233,14 +233,19 @@ pub unsafe extern "C" fn discard_servo(servo: *mut ServoInstance) { if let Some(servo) = servo.as_mut() { let mut servo = Box::from_raw(servo); let finish = Instant::now() + SHUTDOWN_DURATION; - 'outer: while Instant::now() < finish { - servo.servo.handle_events(vec![WindowEvent::Quit]); + servo.servo.handle_events(vec![WindowEvent::Quit]); + 'outer: loop { for (_, msg) in servo.servo.get_events() { if let EmbedderMsg::Shutdown = msg { break 'outer; } } + if Instant::now() > finish { + warn!("Incomplete shutdown."); + break 'outer; + } thread::sleep(SHUTDOWN_POLL_INTERVAL); + servo.servo.handle_events(vec![]); } servo.servo.deinit(); } From 6088ade74684791acd14d94dbaf96581cd7028e8 Mon Sep 17 00:00:00 2001 From: Alan Jeffrey Date: Mon, 5 Nov 2018 10:00:08 -0600 Subject: [PATCH 3/3] Argh tabs vs spaces --- ports/libmlservo/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ports/libmlservo/src/lib.rs b/ports/libmlservo/src/lib.rs index 532f0ff0481..8a20ad16682 100644 --- a/ports/libmlservo/src/lib.rs +++ b/ports/libmlservo/src/lib.rs @@ -241,9 +241,9 @@ pub unsafe extern "C" fn discard_servo(servo: *mut ServoInstance) { } } if Instant::now() > finish { - warn!("Incomplete shutdown."); + warn!("Incomplete shutdown."); break 'outer; - } + } thread::sleep(SHUTDOWN_POLL_INTERVAL); servo.servo.handle_events(vec![]); }