Merge "Clear callbacks when destroying DvrHwcClient" into oc-dr1-dev
diff --git a/libs/vr/libdvr/dvr_hardware_composer_client.cpp b/libs/vr/libdvr/dvr_hardware_composer_client.cpp
index 46d72ca..4e87cf6 100644
--- a/libs/vr/libdvr/dvr_hardware_composer_client.cpp
+++ b/libs/vr/libdvr/dvr_hardware_composer_client.cpp
@@ -100,10 +100,13 @@
}
void dvrHwcClientDestroy(DvrHwcClient* client) {
+ client->composer->clearObserver();
+
// NOTE: Deleting DvrHwcClient* isn't enough since DvrHwcClient::callback is a
// shared pointer that could be referenced from a binder thread. But the
// client callback isn't valid past this calls so that needs to be reset.
client->callback->Shutdown();
+
delete client;
}
diff --git a/services/vr/hardware_composer/aidl/android/dvr/IVrComposer.aidl b/services/vr/hardware_composer/aidl/android/dvr/IVrComposer.aidl
index 5fd5c36..be1ec5b 100644
--- a/services/vr/hardware_composer/aidl/android/dvr/IVrComposer.aidl
+++ b/services/vr/hardware_composer/aidl/android/dvr/IVrComposer.aidl
@@ -17,4 +17,9 @@
* Registers a callback used to receive frame notifications.
*/
void registerObserver(in IVrComposerCallback callback);
+
+ /**
+ * Clears a previously registered frame notification callback.
+ */
+ void clearObserver();
}
diff --git a/services/vr/hardware_composer/vr_composer.cpp b/services/vr/hardware_composer/vr_composer.cpp
index c45fbf4..36a313a 100644
--- a/services/vr/hardware_composer/vr_composer.cpp
+++ b/services/vr/hardware_composer/vr_composer.cpp
@@ -42,6 +42,12 @@
return binder::Status::ok();
}
+binder::Status VrComposer::clearObserver() {
+ std::lock_guard<std::mutex> guard(mutex_);
+ callback_ = nullptr;
+ return binder::Status::ok();
+}
+
base::unique_fd VrComposer::OnNewFrame(const ComposerView::Frame& frame) {
std::lock_guard<std::mutex> guard(mutex_);
diff --git a/services/vr/hardware_composer/vr_composer.h b/services/vr/hardware_composer/vr_composer.h
index 93d1f2b..7b580c6 100644
--- a/services/vr/hardware_composer/vr_composer.h
+++ b/services/vr/hardware_composer/vr_composer.h
@@ -27,6 +27,8 @@
binder::Status registerObserver(
const sp<IVrComposerCallback>& callback) override;
+ binder::Status clearObserver() override;
+
// ComposerView::Observer:
base::unique_fd OnNewFrame(const ComposerView::Frame& frame) override;