summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWang Ningyuan <ningyuan@google.com>2022-10-27 18:55:33 +0900
committerWang Ningyuan <ningyuan@google.com>2022-10-27 18:55:33 +0900
commit2d0c97d2cb247cc0156dcc080fdabeac54b5eac5 (patch)
tree4e3ad535c834eb3dde5d29aa9cbdcb0d7234065f
parent21a409b24ea6c8262393fb432360af4dcdd67b5d (diff)
downloadUwb-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.rs10
-rw-r--r--service/uci/jni_new/Android.bp1
-rw-r--r--service/uci/jni_new/src/dispatcher.rs11
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.