health: use recursive_mutex.

Need to use an reentrant lock.

Bug: 117167903
Test: vts
Change-Id: I25a366e06ed9d983823f7276668b7f45ddcf1c2b
This commit is contained in:
Yifan Hong
2018-10-02 14:06:51 -07:00
parent 2f5884c94c
commit a46c0dae81
2 changed files with 4 additions and 6 deletions

View File

@@ -46,7 +46,7 @@ Return<Result> Health::registerCallback(const sp<IHealthInfoCallback>& callback)
}
{
std::lock_guard<std::mutex> _lock(callbacks_lock_);
std::lock_guard<decltype(callbacks_lock_)> lock(callbacks_lock_);
callbacks_.push_back(callback);
// unlock
}
@@ -65,7 +65,7 @@ bool Health::unregisterCallbackInternal(const sp<IBase>& callback) {
if (callback == nullptr) return false;
bool removed = false;
std::lock_guard<std::mutex> _lock(callbacks_lock_);
std::lock_guard<decltype(callbacks_lock_)> lock(callbacks_lock_);
for (auto it = callbacks_.begin(); it != callbacks_.end();) {
if (interfacesEqual(*it, callback)) {
it = callbacks_.erase(it);
@@ -175,7 +175,7 @@ void Health::notifyListeners(HealthInfo* healthInfo) {
healthInfo->diskStats = stats;
healthInfo->storageInfos = info;
std::lock_guard<std::mutex> _lock(callbacks_lock_);
std::lock_guard<decltype(callbacks_lock_)> lock(callbacks_lock_);
for (auto it = callbacks_.begin(); it != callbacks_.end();) {
auto ret = (*it)->healthInfoChanged(*healthInfo);
if (!ret.isOk() && ret.isDeadObject()) {

View File

@@ -31,12 +31,10 @@ struct Health : public IHealth, hidl_death_recipient {
// Should only be called by implementation itself (-impl, -service).
// Clients should not call this function. Instead, initInstance() initializes and returns the
// global instance that has fewer functions.
// TODO(b/62229583): clean up and hide these functions after update() logic is simplified.
static sp<Health> getImplementation();
Health(struct healthd_config* c);
// TODO(b/62229583): clean up and hide these functions after update() logic is simplified.
void notifyListeners(HealthInfo* info);
// Methods from IHealth follow.
@@ -61,7 +59,7 @@ struct Health : public IHealth, hidl_death_recipient {
private:
static sp<Health> instance_;
std::mutex callbacks_lock_;
std::recursive_mutex callbacks_lock_;
std::vector<sp<IHealthInfoCallback>> callbacks_;
std::unique_ptr<BatteryMonitor> battery_monitor_;