diff --git a/ports/libmlservo/src/lib.rs b/ports/libmlservo/src/lib.rs index 78150ef1643..2f8873716d4 100644 --- a/ports/libmlservo/src/lib.rs +++ b/ports/libmlservo/src/lib.rs @@ -47,6 +47,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 { @@ -294,11 +297,30 @@ 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; + 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(); } } diff --git a/support/magicleap/Servo2D/code/src/Servo2D.cpp b/support/magicleap/Servo2D/code/src/Servo2D.cpp index 81babf942c5..1b7fb3463db 100644 --- a/support/magicleap/Servo2D/code/src/Servo2D.cpp +++ b/support/magicleap/Servo2D/code/src/Servo2D.cpp @@ -59,8 +59,6 @@ Servo2D::Servo2D() { // Destroy a Servo 2D instance Servo2D::~Servo2D() { ML_LOG(Debug, "Servo2D Destructor."); - discard_servo(servo_); - servo_ = nullptr; } // The prism dimensions @@ -168,6 +166,8 @@ int Servo2D::init() { int Servo2D::deInit() { ML_LOG(Debug, "Servo2D Deinitializing."); + discard_servo(servo_); + servo_ = nullptr; return 0; }