From f124f53bc1372cb9fecf56a59917eaad25419fd4 Mon Sep 17 00:00:00 2001 From: Christien Rioux Date: Thu, 10 Apr 2025 11:10:02 -0400 Subject: [PATCH] don't panic during abnormal shutdown --- veilid-core/src/core_context.rs | 1 - veilid-core/src/table_store/mod.rs | 3 ++- veilid-flutter/rust/src/dart_ffi.rs | 12 ++++-------- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/veilid-core/src/core_context.rs b/veilid-core/src/core_context.rs index a50e0ecf..b8dedabc 100644 --- a/veilid-core/src/core_context.rs +++ b/veilid-core/src/core_context.rs @@ -284,7 +284,6 @@ pub async fn api_startup_config( // Only allow one startup/shutdown per program_name+namespace combination simultaneously let _tag_guard = STARTUP_TABLE.lock_tag(init_key.clone()).await; - // See if we have an API started up already if INITIALIZED.lock().contains(&init_key) { apibail_already_initialized!(); diff --git a/veilid-core/src/table_store/mod.rs b/veilid-core/src/table_store/mod.rs index afc7d82d..8d5f680c 100644 --- a/veilid-core/src/table_store/mod.rs +++ b/veilid-core/src/table_store/mod.rs @@ -531,10 +531,11 @@ impl TableStore { let mut inner = self.inner.lock(); inner.opened.shrink_to_fit(); if !inner.opened.is_empty() { - panic!( + veilid_log!(self warn "all open databases should have been closed: {:?}", inner.opened ); + inner.opened.clear(); } inner.all_tables_db = None; inner.all_table_names.clear(); diff --git a/veilid-flutter/rust/src/dart_ffi.rs b/veilid-flutter/rust/src/dart_ffi.rs index 5eb3fdca..a241b832 100644 --- a/veilid-flutter/rust/src/dart_ffi.rs +++ b/veilid-flutter/rust/src/dart_ffi.rs @@ -78,13 +78,6 @@ async fn get_veilid_api() -> veilid_core::VeilidAPIResult veilid_core::VeilidAPIResult { - let mut api_lock = VEILID_API.lock().await; - api_lock - .take() - .ok_or(veilid_core::VeilidAPIError::NotInitialized) -} - ///////////////////////////////////////// // FFI Helpers @@ -513,7 +506,10 @@ pub extern "C" fn detach(port: i64) { pub extern "C" fn shutdown_veilid_core(port: i64) { DartIsolateWrapper::new(port).spawn_result( async move { - let veilid_api = take_veilid_api().await?; + let mut api_lock = VEILID_API.lock().await; + let veilid_api = api_lock + .take() + .ok_or(veilid_core::VeilidAPIError::NotInitialized)?; veilid_api.shutdown().await; APIRESULT_VOID }