diff options
author | Wang Ningyuan <ningyuan@google.com> | 2022-10-27 18:55:33 +0900 |
---|---|---|
committer | Wang Ningyuan <ningyuan@google.com> | 2022-10-27 18:55:33 +0900 |
commit | 2d0c97d2cb247cc0156dcc080fdabeac54b5eac5 (patch) | |
tree | 4e3ad535c834eb3dde5d29aa9cbdcb0d7234065f | |
parent | 21a409b24ea6c8262393fb432360af4dcdd67b5d (diff) | |
download | Uwb-2d0c97d2cb247cc0156dcc080fdabeac54b5eac5.tar.gz |
Fixes system crash when UWB toggled off (JNI)
This CL fixes b/255681743, where the system would crash when UWB is
toggled off. This is caused due to Runtime shared by LogWriter dropped
in async context.
Bug: 255681743
Test: cargo test
Test: make com.android.google.uwb
Test: manual function test with ag/19881044 cherrypicked
Change-Id: I039f014f0c00fc5f8ffac00b6140744417035980
-rw-r--r-- | indev_uwb_adaptation/jni/src/api.rs | 10 | ||||
-rw-r--r-- | service/uci/jni_new/Android.bp | 1 | ||||
-rw-r--r-- | service/uci/jni_new/src/dispatcher.rs | 11 |
3 files changed, 21 insertions, 1 deletions
diff --git a/indev_uwb_adaptation/jni/src/api.rs b/indev_uwb_adaptation/jni/src/api.rs index 4bb75277..6fe0ac1a 100644 --- a/indev_uwb_adaptation/jni/src/api.rs +++ b/indev_uwb_adaptation/jni/src/api.rs @@ -22,6 +22,7 @@ use jni::sys::{jboolean, jbyte, jbyteArray, jint, jlong, jobject}; use jni::JNIEnv; use log::{debug, error}; use num_traits::FromPrimitive; +use tokio::runtime::Builder as RuntimeBuilder; use uci_hal_android::uci_hal_android::UciHalAndroid; use uwb_core::params::{AppConfigParams, CountryCode}; @@ -89,9 +90,17 @@ pub extern "system" fn Java_com_android_server_uwb_indev_UwbServiceCore_nativeUw return *JObject::null() as jlong; } }; + let runtime = match RuntimeBuilder::new_multi_thread().enable_all().build() { + Ok(r) => r, + Err(e) => { + error!("Couldn't build tokio Runtime."); + return *JObject::null() as jlong; + } + }; let uci_logger_factory = match PcapngUciLoggerFactoryBuilder::new() .log_path("/data/misc/apexdata/com.android.uwb/log") .filename_prefix("uwb_uci") + .runtime_handle(runtime.handle().to_owned()) .build() { Some(m) => m, @@ -102,6 +111,7 @@ pub extern "system" fn Java_com_android_server_uwb_indev_UwbServiceCore_nativeUw }; if let Some(uwb_service) = UwbServiceBuilder::new() .callback_builder(UwbServiceCallbackBuilderImpl::new(vm, callback_obj, class_loader_obj)) + .runtime(runtime) .uci_hal(UciHalAndroid::new("default")) .uci_logger_factory(uci_logger_factory) .build() diff --git a/service/uci/jni_new/Android.bp b/service/uci/jni_new/Android.bp index 8a243c1d..0483f679 100644 --- a/service/uci/jni_new/Android.bp +++ b/service/uci/jni_new/Android.bp @@ -16,6 +16,7 @@ rust_defaults { "liblogger", "libnum_traits", "libthiserror", + "libtokio", "libuci_hal_android", "libuwb_core", "libuwb_uci_packets", diff --git a/service/uci/jni_new/src/dispatcher.rs b/service/uci/jni_new/src/dispatcher.rs index 35ceeb71..1dc455d1 100644 --- a/service/uci/jni_new/src/dispatcher.rs +++ b/service/uci/jni_new/src/dispatcher.rs @@ -21,6 +21,7 @@ use std::sync::Arc; use jni::objects::GlobalRef; use jni::JavaVM; +use tokio::runtime::{Builder as RuntimeBuilder, Runtime}; use uci_hal_android::uci_hal_android::UciHalAndroid; use uwb_core::error::{Error as UwbCoreError, Result as UwbCoreResult}; use uwb_core::uci::pcapng_uci_logger_factory::PcapngUciLoggerFactoryBuilder; @@ -32,6 +33,7 @@ use uwb_core::uci::uci_manager_sync::UciManagerSync; /// Destruction does NOT wait until the spawned threads are closed. pub(crate) struct Dispatcher { pub manager_map: HashMap<String, UciManagerSync>, + _runtime: Runtime, } impl Dispatcher { /// Constructs Dispatcher. @@ -41,10 +43,16 @@ impl Dispatcher { callback_obj: GlobalRef, chip_ids: &[T], ) -> UwbCoreResult<Dispatcher> { + let runtime = RuntimeBuilder::new_multi_thread() + .thread_name("UwbService") + .enable_all() + .build() + .map_err(|_| UwbCoreError::Unknown)?; let mut manager_map = HashMap::<String, UciManagerSync>::new(); let mut log_file_factory = PcapngUciLoggerFactoryBuilder::new() .log_path("/data/misc/apexdata/com.android.uwb/log") .filename_prefix("uwb_uci") + .runtime_handle(runtime.handle().to_owned()) .build() .ok_or(UwbCoreError::Unknown)?; for chip_id in chip_ids { @@ -59,10 +67,11 @@ impl Dispatcher { callback_obj: callback_obj.clone(), }, logger, + runtime.handle().to_owned(), )?; manager_map.insert(chip_id.as_ref().to_string(), manager); } - Ok(Self { manager_map }) + Ok(Self { manager_map, _runtime: runtime }) } /// Constructs dispatcher, and return a pointer owning it. |