diff options
Diffstat (limited to 'cmds/statsd/src/config/ConfigManager.cpp')
-rw-r--r-- | cmds/statsd/src/config/ConfigManager.cpp | 73 |
1 files changed, 45 insertions, 28 deletions
diff --git a/cmds/statsd/src/config/ConfigManager.cpp b/cmds/statsd/src/config/ConfigManager.cpp index fc949b494194..972adf7d4d05 100644 --- a/cmds/statsd/src/config/ConfigManager.cpp +++ b/cmds/statsd/src/config/ConfigManager.cpp @@ -46,6 +46,41 @@ using std::vector; using android::base::StringPrintf; using std::unique_ptr; +class ConfigReceiverDeathRecipient : public android::IBinder::DeathRecipient { + public: + ConfigReceiverDeathRecipient(sp<ConfigManager> configManager, const ConfigKey& configKey): + mConfigManager(configManager), + mConfigKey(configKey) {} + ~ConfigReceiverDeathRecipient() override = default; + private: + sp<ConfigManager> mConfigManager; + ConfigKey mConfigKey; + + void binderDied(const android::wp<android::IBinder>& who) override { + if (IInterface::asBinder(mConfigManager->GetConfigReceiver(mConfigKey)) == who.promote()) { + mConfigManager->RemoveConfigReceiver(mConfigKey); + } + } +}; + +class ActiveConfigChangedReceiverDeathRecipient : public android::IBinder::DeathRecipient { + public: + ActiveConfigChangedReceiverDeathRecipient(sp<ConfigManager> configManager, const int uid): + mConfigManager(configManager), + mUid(uid) {} + ~ActiveConfigChangedReceiverDeathRecipient() override = default; + private: + sp<ConfigManager> mConfigManager; + int mUid; + + void binderDied(const android::wp<android::IBinder>& who) override { + if (IInterface::asBinder(mConfigManager->GetActiveConfigsChangedReceiver(mUid)) + == who.promote()) { + mConfigManager->RemoveActiveConfigsChangedReceiver(mUid); + } + } +}; + ConfigManager::ConfigManager() { } @@ -118,9 +153,11 @@ void ConfigManager::UpdateConfig(const ConfigKey& key, const StatsdConfig& confi } } -void ConfigManager::SetConfigReceiver(const ConfigKey& key, const sp<IBinder>& intentSender) { +void ConfigManager::SetConfigReceiver(const ConfigKey& key, + const sp<IPendingIntentRef>& pir) { lock_guard<mutex> lock(mMutex); - mConfigReceivers[key] = intentSender; + mConfigReceivers[key] = pir; + IInterface::asBinder(pir)->linkToDeath(new ConfigReceiverDeathRecipient(this, key)); } void ConfigManager::RemoveConfigReceiver(const ConfigKey& key) { @@ -129,9 +166,11 @@ void ConfigManager::RemoveConfigReceiver(const ConfigKey& key) { } void ConfigManager::SetActiveConfigsChangedReceiver(const int uid, - const sp<IBinder>& intentSender) { + const sp<IPendingIntentRef>& pir) { lock_guard<mutex> lock(mMutex); - mActiveConfigsChangedReceivers[uid] = intentSender; + mActiveConfigsChangedReceivers[uid] = pir; + IInterface::asBinder(pir)->linkToDeath( + new ActiveConfigChangedReceiverDeathRecipient(this, uid)); } void ConfigManager::RemoveActiveConfigsChangedReceiver(const int uid) { @@ -150,25 +189,11 @@ void ConfigManager::RemoveConfig(const ConfigKey& key) { // Remove from map uidIt->second.erase(key); - // No more configs for this uid, lets remove the active configs callback. - if (uidIt->second.empty()) { - auto itActiveConfigsChangedReceiver = mActiveConfigsChangedReceivers.find(uid); - if (itActiveConfigsChangedReceiver != mActiveConfigsChangedReceivers.end()) { - mActiveConfigsChangedReceivers.erase(itActiveConfigsChangedReceiver); - } - } - for (const sp<ConfigListener>& listener : mListeners) { broadcastList.push_back(listener); } } - auto itReceiver = mConfigReceivers.find(key); - if (itReceiver != mConfigReceivers.end()) { - // Remove from map - mConfigReceivers.erase(itReceiver); - } - // Remove from disk. There can still be a lingering file on disk so we check // whether or not the config was on memory. remove_saved_configs(key); @@ -199,12 +224,6 @@ void ConfigManager::RemoveConfigs(int uid) { // Remove from map remove_saved_configs(*it); removed.push_back(*it); - mConfigReceivers.erase(*it); - } - - auto itActiveConfigsChangedReceiver = mActiveConfigsChangedReceivers.find(uid); - if (itActiveConfigsChangedReceiver != mActiveConfigsChangedReceivers.end()) { - mActiveConfigsChangedReceivers.erase(itActiveConfigsChangedReceiver); } mConfigs.erase(uidIt); @@ -238,8 +257,6 @@ void ConfigManager::RemoveAllConfigs() { uidIt = mConfigs.erase(uidIt); } - mConfigReceivers.clear(); - mActiveConfigsChangedReceivers.clear(); for (const sp<ConfigListener>& listener : mListeners) { broadcastList.push_back(listener); } @@ -266,7 +283,7 @@ vector<ConfigKey> ConfigManager::GetAllConfigKeys() const { return ret; } -const sp<android::IBinder> ConfigManager::GetConfigReceiver(const ConfigKey& key) const { +const sp<IPendingIntentRef> ConfigManager::GetConfigReceiver(const ConfigKey& key) const { lock_guard<mutex> lock(mMutex); auto it = mConfigReceivers.find(key); @@ -277,7 +294,7 @@ const sp<android::IBinder> ConfigManager::GetConfigReceiver(const ConfigKey& key } } -const sp<android::IBinder> ConfigManager::GetActiveConfigsChangedReceiver(const int uid) const { +const sp<IPendingIntentRef> ConfigManager::GetActiveConfigsChangedReceiver(const int uid) const { lock_guard<mutex> lock(mMutex); auto it = mActiveConfigsChangedReceivers.find(uid); |