mirror of
https://github.com/Evolution-X/hardware_interfaces
synced 2026-02-01 16:50:18 +00:00
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:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user