Fix TODOs made during migration to libbinder_ndk
Test: atest GtsStatsdHostTestCases
Bug: 149254662
Change-Id: I50a1998e693f9a0c447cd655f8efa11afa28803b
diff --git a/cmds/statsd/src/config/ConfigManager.cpp b/cmds/statsd/src/config/ConfigManager.cpp
index 9bdb588..6d9c644 100644
--- a/cmds/statsd/src/config/ConfigManager.cpp
+++ b/cmds/statsd/src/config/ConfigManager.cpp
@@ -54,20 +54,22 @@
shared_ptr<IPendingIntentRef> mPir;
};
-static void configReceiverDied(void* cookie) {
+void ConfigManager::configReceiverDied(void* cookie) {
auto cookie_ = static_cast<ConfigReceiverDeathCookie*>(cookie);
- sp<ConfigManager> configManager = cookie_->mConfigManager;
- ConfigKey configKey = cookie_->mConfigKey;
- shared_ptr<IPendingIntentRef> pir = cookie_->mPir;
+ sp<ConfigManager>& thiz = cookie_->mConfigManager;
+ ConfigKey& configKey = cookie_->mConfigKey;
+ shared_ptr<IPendingIntentRef>& pir = cookie_->mPir;
- // TODO(b/149254662): Fix threading. This currently fails if a new
- // pir gets set between the get and the remove.
- if (configManager->GetConfigReceiver(configKey) == pir) {
- configManager->RemoveConfigReceiver(configKey);
+ // Erase the mapping from the config key to the config receiver (pir) if the
+ // mapping still exists.
+ lock_guard<mutex> lock(thiz->mMutex);
+ auto it = thiz->mConfigReceivers.find(configKey);
+ if (it != thiz->mConfigReceivers.end() && it->second == pir) {
+ thiz->mConfigReceivers.erase(configKey);
}
- // The death recipient corresponding to this specific pir can never
- // be triggered again, so free up resources.
- // TODO(b/149254662): Investigate other options to manage the memory.
+
+ // The death recipient corresponding to this specific pir can never be
+ // triggered again, so free up resources.
delete cookie_;
}
@@ -83,26 +85,29 @@
shared_ptr<IPendingIntentRef> mPir;
};
-static void activeConfigChangedReceiverDied(void* cookie) {
+void ConfigManager::activeConfigChangedReceiverDied(void* cookie) {
auto cookie_ = static_cast<ActiveConfigChangedReceiverDeathCookie*>(cookie);
- sp<ConfigManager> configManager = cookie_->mConfigManager;
+ sp<ConfigManager>& thiz = cookie_->mConfigManager;
int uid = cookie_->mUid;
- shared_ptr<IPendingIntentRef> pir = cookie_->mPir;
+ shared_ptr<IPendingIntentRef>& pir = cookie_->mPir;
- // TODO(b/149254662): Fix threading. This currently fails if a new
- // pir gets set between the get and the remove.
- if (configManager->GetActiveConfigsChangedReceiver(uid) == pir) {
- configManager->RemoveActiveConfigsChangedReceiver(uid);
+ // Erase the mapping from the config key to the active config changed
+ // receiver (pir) if the mapping still exists.
+ lock_guard<mutex> lock(thiz->mMutex);
+ auto it = thiz->mActiveConfigsChangedReceivers.find(uid);
+ if (it != thiz->mActiveConfigsChangedReceivers.end() && it->second == pir) {
+ thiz->mActiveConfigsChangedReceivers.erase(uid);
}
+
// The death recipient corresponding to this specific pir can never
// be triggered again, so free up resources.
delete cookie_;
}
-ConfigManager::ConfigManager():
+ConfigManager::ConfigManager() :
mConfigReceiverDeathRecipient(AIBinder_DeathRecipient_new(configReceiverDied)),
mActiveConfigChangedReceiverDeathRecipient(
- AIBinder_DeathRecipient_new(activeConfigChangedReceiverDied)) {
+ AIBinder_DeathRecipient_new(activeConfigChangedReceiverDied)) {
}
ConfigManager::~ConfigManager() {
@@ -189,8 +194,10 @@
void ConfigManager::SetActiveConfigsChangedReceiver(const int uid,
const shared_ptr<IPendingIntentRef>& pir) {
- lock_guard<mutex> lock(mMutex);
- mActiveConfigsChangedReceivers[uid] = pir;
+ {
+ lock_guard<mutex> lock(mMutex);
+ mActiveConfigsChangedReceivers[uid] = pir;
+ }
AIBinder_linkToDeath(pir->asBinder().get(), mActiveConfigChangedReceiverDeathRecipient.get(),
new ActiveConfigChangedReceiverDeathCookie(this, uid, pir));
}