Add setDisplayService and waitDisplayService in IVirtualizationServiceInternal
In normal app context, it cannot add a service into service manager, so
add something similar into VirtualizationServiceInternal.
Bug: 331708504
Test: check if the display shows
Change-Id: I895e6a8affe3bc4e9de6bea226ebc40a7fcf7a0d
diff --git a/virtualizationservice/src/aidl.rs b/virtualizationservice/src/aidl.rs
index c6150b2..9258b82 100644
--- a/virtualizationservice/src/aidl.rs
+++ b/virtualizationservice/src/aidl.rs
@@ -51,7 +51,7 @@
use std::os::unix::fs::PermissionsExt;
use std::os::unix::raw::{pid_t, uid_t};
use std::path::{Path, PathBuf};
-use std::sync::{Arc, Mutex, Weak};
+use std::sync::{Arc, Condvar, Mutex, Weak};
use tombstoned_client::{DebuggerdDumpType, TombstonedConnection};
use virtualizationcommon::Certificate::Certificate;
use virtualizationmaintenance::{
@@ -170,12 +170,15 @@
#[derive(Clone)]
pub struct VirtualizationServiceInternal {
state: Arc<Mutex<GlobalState>>,
+ display_service_set: Arc<Condvar>,
}
impl VirtualizationServiceInternal {
pub fn init() -> VirtualizationServiceInternal {
- let service =
- VirtualizationServiceInternal { state: Arc::new(Mutex::new(GlobalState::new())) };
+ let service = VirtualizationServiceInternal {
+ state: Arc::new(Mutex::new(GlobalState::new())),
+ display_service_set: Arc::new(Condvar::new()),
+ };
std::thread::spawn(|| {
if let Err(e) = handle_stream_connection_tombstoned() {
@@ -190,6 +193,30 @@
impl Interface for VirtualizationServiceInternal {}
impl IVirtualizationServiceInternal for VirtualizationServiceInternal {
+ fn setDisplayService(
+ &self,
+ ibinder: &binder::SpIBinder,
+ ) -> std::result::Result<(), binder::Status> {
+ check_manage_access()?;
+ check_use_custom_virtual_machine()?;
+ let state = &mut *self.state.lock().unwrap();
+ state.display_service = Some(ibinder.clone());
+ self.display_service_set.notify_all();
+ Ok(())
+ }
+
+ fn waitDisplayService(&self) -> std::result::Result<binder::SpIBinder, binder::Status> {
+ check_manage_access()?;
+ check_use_custom_virtual_machine()?;
+ let state = self
+ .display_service_set
+ .wait_while(self.state.lock().unwrap(), |state| state.display_service.is_none())
+ .unwrap();
+ Ok((state.display_service)
+ .as_ref()
+ .cloned()
+ .expect("Display service cannot be None in this context"))
+ }
fn removeMemlockRlimit(&self) -> binder::Result<()> {
let pid = get_calling_pid();
let lim = libc::rlimit { rlim_cur: libc::RLIM_INFINITY, rlim_max: libc::RLIM_INFINITY };
@@ -588,6 +615,8 @@
/// State relating to secrets held by (optional) Secretkeeper instance on behalf of VMs.
sk_state: Option<maintenance::State>,
+
+ display_service: Option<binder::SpIBinder>,
}
impl GlobalState {
@@ -596,6 +625,7 @@
held_contexts: HashMap::new(),
dtbo_file: Mutex::new(None),
sk_state: maintenance::State::new(),
+ display_service: None,
}
}