health: registerCallback() and getHealthInfo() does not notify all callbacks

registerCallback() and getHealthInfo() unintentionally broadcast
health info to all callbacks, which has a performance impact.

* registerCallback() still invokes the new callback immediately
* getHealthInfo() does not call any callbacks at all.

Test: VTS test call getHealthInfo does not invoke update()
Bug: 117167903
Change-Id: Ida99fdd73831e747fbf2d65089c7c0e7661fe7c4
This commit is contained in:
Yifan Hong
2018-10-02 14:11:35 -07:00
parent a46c0dae81
commit e9fc235eb4
2 changed files with 18 additions and 2 deletions

View File

@@ -58,7 +58,7 @@ Return<Result> Health::registerCallback(const sp<IHealthInfoCallback>& callback)
// ignore the error
}
return update();
return updateAndNotify(callback);
}
bool Health::unregisterCallbackInternal(const sp<IBase>& callback) {
@@ -156,6 +156,18 @@ Return<Result> Health::update() {
return Result::SUCCESS;
}
Return<Result> Health::updateAndNotify(const sp<IHealthInfoCallback>& callback) {
std::lock_guard<decltype(callbacks_lock_)> lock(callbacks_lock_);
std::vector<sp<IHealthInfoCallback>> storedCallbacks{std::move(callbacks_)};
callbacks_.clear();
if (callback != nullptr) {
callbacks_.push_back(callback);
}
Return<Result> result = update();
callbacks_ = std::move(storedCallbacks);
return result;
}
void Health::notifyListeners(HealthInfo* healthInfo) {
std::vector<StorageInfo> info;
get_storage_info(info);
@@ -233,7 +245,7 @@ Return<void> Health::getDiskStats(getDiskStats_cb _hidl_cb) {
Return<void> Health::getHealthInfo(getHealthInfo_cb _hidl_cb) {
using android::hardware::health::V1_0::hal_conversion::convertToHealthInfo;
update();
updateAndNotify(nullptr);
struct android::BatteryProperties p = getBatteryProperties(battery_monitor_.get());
V1_0::HealthInfo batteryInfo;

View File

@@ -64,6 +64,10 @@ struct Health : public IHealth, hidl_death_recipient {
std::unique_ptr<BatteryMonitor> battery_monitor_;
bool unregisterCallbackInternal(const sp<IBase>& cb);
// update() and only notify the given callback, but none of the other callbacks.
// If cb is null, do not notify any callback at all.
Return<Result> updateAndNotify(const sp<IHealthInfoCallback>& cb);
};
} // namespace implementation