diff --git a/health/aidl/default/Health.cpp b/health/aidl/default/Health.cpp index b2c0f0a6cf..a16087c06d 100644 --- a/health/aidl/default/Health.cpp +++ b/health/aidl/default/Health.cpp @@ -253,15 +253,6 @@ std::optional Health::ShouldKeepScreenOn() { return healthd_config_->screen_on(&props); } -namespace { -bool IsDeadObjectLogged(const ndk::ScopedAStatus& ret) { - if (ret.isOk()) return false; - if (ret.getStatus() == ::STATUS_DEAD_OBJECT) return true; - LOG(ERROR) << "Cannot call healthInfoChanged on callback: " << ret.getDescription(); - return false; -} -} // namespace - // // Subclass helpers / overrides // @@ -305,8 +296,10 @@ ndk::ScopedAStatus Health::registerCallback(const std::shared_ptrhealthInfoChanged(health_info); IsDeadObjectLogged(res)) { - (void)unregisterCallback(callback); + auto res = callback->healthInfoChanged(health_info); + if (!res.isOk()) { + LOG(DEBUG) << "Cannot call healthInfoChanged:" << res.getDescription() + << ". Do nothing here if callback is dead as it will be cleaned up later."; } return ndk::ScopedAStatus::ok(); } @@ -353,13 +346,13 @@ ndk::ScopedAStatus Health::update() { void Health::OnHealthInfoChanged(const HealthInfo& health_info) { // Notify all callbacks std::unique_lock lock(callbacks_lock_); - // is_dead notifies a callback and return true if it is dead. - auto is_dead = [&](const auto& linked) { + for (const auto& linked : callbacks_) { auto res = linked->callback()->healthInfoChanged(health_info); - return IsDeadObjectLogged(res); - }; - auto it = std::remove_if(callbacks_.begin(), callbacks_.end(), is_dead); - callbacks_.erase(it, callbacks_.end()); // calls unlinkToDeath on deleted callbacks. + if (!res.isOk()) { + LOG(DEBUG) << "Cannot call healthInfoChanged:" << res.getDescription() + << ". Do nothing here if callback is dead as it will be cleaned up later."; + } + } lock.unlock(); // Let HalHealthLoop::OnHealthInfoChanged() adjusts uevent / wakealarm periods