Add unbind() binder API.
It will remove the callback from the list and unregister death
notification for the callback.
Bug: 62293007
Test: mma
Change-Id: I527699a160feaad739c50ed1865d557d3cef22e8
diff --git a/binder_bindings/android/os/IUpdateEngine.aidl b/binder_bindings/android/os/IUpdateEngine.aidl
index 67f828a..7e26752 100644
--- a/binder_bindings/android/os/IUpdateEngine.aidl
+++ b/binder_bindings/android/os/IUpdateEngine.aidl
@@ -28,6 +28,8 @@
/** @hide */
boolean bind(IUpdateEngineCallback callback);
/** @hide */
+ boolean unbind(IUpdateEngineCallback callback);
+ /** @hide */
void suspend();
/** @hide */
void resume();
diff --git a/binder_service_android.cc b/binder_service_android.cc
index 872f64c..91a2970 100644
--- a/binder_service_android.cc
+++ b/binder_service_android.cc
@@ -66,9 +66,10 @@
auto binder_wrapper = android::BinderWrapper::Get();
binder_wrapper->RegisterForDeathNotifications(
IUpdateEngineCallback::asBinder(callback),
- base::Bind(&BinderUpdateEngineAndroidService::UnbindCallback,
- base::Unretained(this),
- base::Unretained(callback.get())));
+ base::Bind(
+ base::IgnoreResult(&BinderUpdateEngineAndroidService::UnbindCallback),
+ base::Unretained(this),
+ base::Unretained(callback.get())));
// Send an status update on connection (except when no update sent so far),
// since the status update is oneway and we don't need to wait for the
@@ -80,6 +81,16 @@
return Status::ok();
}
+Status BinderUpdateEngineAndroidService::unbind(
+ const android::sp<IUpdateEngineCallback>& callback, bool* return_value) {
+ auto binder_wrapper = android::BinderWrapper::Get();
+ binder_wrapper->UnregisterForDeathNotifications(
+ IUpdateEngineCallback::asBinder(callback));
+
+ *return_value = UnbindCallback(callback.get());
+ return Status::ok();
+}
+
Status BinderUpdateEngineAndroidService::applyPayload(
const android::String16& url,
int64_t payload_offset,
@@ -128,7 +139,7 @@
return Status::ok();
}
-void BinderUpdateEngineAndroidService::UnbindCallback(
+bool BinderUpdateEngineAndroidService::UnbindCallback(
IUpdateEngineCallback* callback) {
auto it =
std::find_if(callbacks_.begin(),
@@ -137,10 +148,11 @@
return elem.get() == callback;
});
if (it == callbacks_.end()) {
- LOG(ERROR) << "Got death notification for unknown callback.";
- return;
+ LOG(ERROR) << "Unable to unbind unknown callback.";
+ return false;
}
callbacks_.erase(it);
+ return true;
}
} // namespace chromeos_update_engine
diff --git a/binder_service_android.h b/binder_service_android.h
index 3293c0e..375dad4 100644
--- a/binder_service_android.h
+++ b/binder_service_android.h
@@ -61,6 +61,9 @@
android::binder::Status bind(
const android::sp<android::os::IUpdateEngineCallback>& callback,
bool* return_value) override;
+ android::binder::Status unbind(
+ const android::sp<android::os::IUpdateEngineCallback>& callback,
+ bool* return_value) override;
android::binder::Status suspend() override;
android::binder::Status resume() override;
android::binder::Status cancel() override;
@@ -68,8 +71,9 @@
private:
// Remove the passed |callback| from the list of registered callbacks. Called
- // whenever the callback object is destroyed.
- void UnbindCallback(android::os::IUpdateEngineCallback* callback);
+ // on unbind() or whenever the callback object is destroyed.
+ // Returns true on success.
+ bool UnbindCallback(android::os::IUpdateEngineCallback* callback);
// List of currently bound callbacks.
std::vector<android::sp<android::os::IUpdateEngineCallback>> callbacks_;