summaryrefslogtreecommitdiff
path: root/cmds/statsd/src/config/ConfigManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cmds/statsd/src/config/ConfigManager.cpp')
-rw-r--r--cmds/statsd/src/config/ConfigManager.cpp131
1 files changed, 90 insertions, 41 deletions
diff --git a/cmds/statsd/src/config/ConfigManager.cpp b/cmds/statsd/src/config/ConfigManager.cpp
index 61eeee3796df..d0f55abe7033 100644
--- a/cmds/statsd/src/config/ConfigManager.cpp
+++ b/cmds/statsd/src/config/ConfigManager.cpp
@@ -59,71 +59,106 @@ void ConfigManager::StartupForTest() {
}
void ConfigManager::AddListener(const sp<ConfigListener>& listener) {
+ lock_guard<mutex> lock(mMutex);
mListeners.push_back(listener);
}
void ConfigManager::UpdateConfig(const ConfigKey& key, const StatsdConfig& config) {
- // Add to set
- mConfigs.insert(key);
+ vector<sp<ConfigListener>> broadcastList;
+ {
+ lock_guard <mutex> lock(mMutex);
- // Save to disk
- update_saved_configs(key, config);
+ // Add to set
+ mConfigs.insert(key);
+
+ // Save to disk
+ update_saved_configs_locked(key, config);
+
+ for (sp<ConfigListener> listener : mListeners) {
+ broadcastList.push_back(listener);
+ }
+ }
// Tell everyone
- for (auto& listener : mListeners) {
+ for (sp<ConfigListener> listener:broadcastList) {
listener->OnConfigUpdated(key, config);
}
}
-void ConfigManager::SetConfigReceiver(const ConfigKey& key, const string& pkg, const string& cls) {
- mConfigReceivers[key] = pair<string, string>(pkg, cls);
+void ConfigManager::SetConfigReceiver(const ConfigKey& key, const sp<IBinder>& intentSender) {
+ lock_guard<mutex> lock(mMutex);
+ mConfigReceivers[key] = intentSender;
}
void ConfigManager::RemoveConfigReceiver(const ConfigKey& key) {
+ lock_guard<mutex> lock(mMutex);
mConfigReceivers.erase(key);
}
void ConfigManager::RemoveConfig(const ConfigKey& key) {
- auto it = mConfigs.find(key);
- if (it != mConfigs.end()) {
- // Remove from map
- mConfigs.erase(it);
+ vector<sp<ConfigListener>> broadcastList;
+ {
+ lock_guard <mutex> lock(mMutex);
+
+ auto it = mConfigs.find(key);
+ if (it != mConfigs.end()) {
+ // Remove from map
+ mConfigs.erase(it);
+
+ for (sp<ConfigListener> listener : mListeners) {
+ broadcastList.push_back(listener);
+ }
+ }
- // Tell everyone
- for (auto& listener : mListeners) {
- listener->OnConfigRemoved(key);
+ 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);
}
- // 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);
+ for (sp<ConfigListener> listener:broadcastList) {
+ listener->OnConfigRemoved(key);
+ }
}
void ConfigManager::remove_saved_configs(const ConfigKey& key) {
- string suffix = StringPrintf("%d-%lld", key.GetUid(), (long long)key.GetId());
+ string suffix = StringPrintf("%d_%lld", key.GetUid(), (long long)key.GetId());
StorageManager::deleteSuffixedFiles(STATS_SERVICE_DIR, suffix.c_str());
}
void ConfigManager::RemoveConfigs(int uid) {
vector<ConfigKey> removed;
+ vector<sp<ConfigListener>> broadcastList;
+ {
+ lock_guard <mutex> lock(mMutex);
+
+
+ for (auto it = mConfigs.begin(); it != mConfigs.end();) {
+ // Remove from map
+ if (it->GetUid() == uid) {
+ remove_saved_configs(*it);
+ removed.push_back(*it);
+ mConfigReceivers.erase(*it);
+ it = mConfigs.erase(it);
+ } else {
+ it++;
+ }
+ }
- for (auto it = mConfigs.begin(); it != mConfigs.end();) {
- // Remove from map
- if (it->GetUid() == uid) {
- remove_saved_configs(*it);
- removed.push_back(*it);
- mConfigReceivers.erase(*it);
- it = mConfigs.erase(it);
- } else {
- it++;
+ for (sp<ConfigListener> listener : mListeners) {
+ broadcastList.push_back(listener);
}
}
// Remove separately so if they do anything in the callback they can't mess up our iteration.
for (auto& key : removed) {
// Tell everyone
- for (auto& listener : mListeners) {
+ for (sp<ConfigListener> listener:broadcastList) {
listener->OnConfigRemoved(key);
}
}
@@ -131,27 +166,38 @@ void ConfigManager::RemoveConfigs(int uid) {
void ConfigManager::RemoveAllConfigs() {
vector<ConfigKey> removed;
+ vector<sp<ConfigListener>> broadcastList;
+ {
+ lock_guard <mutex> lock(mMutex);
- for (auto it = mConfigs.begin(); it != mConfigs.end();) {
- // Remove from map
- removed.push_back(*it);
- auto receiverIt = mConfigReceivers.find(*it);
- if (receiverIt != mConfigReceivers.end()) {
- mConfigReceivers.erase(*it);
+
+ for (auto it = mConfigs.begin(); it != mConfigs.end();) {
+ // Remove from map
+ removed.push_back(*it);
+ auto receiverIt = mConfigReceivers.find(*it);
+ if (receiverIt != mConfigReceivers.end()) {
+ mConfigReceivers.erase(*it);
+ }
+ it = mConfigs.erase(it);
+ }
+
+ for (sp<ConfigListener> listener : mListeners) {
+ broadcastList.push_back(listener);
}
- it = mConfigs.erase(it);
}
// Remove separately so if they do anything in the callback they can't mess up our iteration.
for (auto& key : removed) {
// Tell everyone
- for (auto& listener : mListeners) {
+ for (sp<ConfigListener> listener:broadcastList) {
listener->OnConfigRemoved(key);
}
}
}
vector<ConfigKey> ConfigManager::GetAllConfigKeys() const {
+ lock_guard<mutex> lock(mMutex);
+
vector<ConfigKey> ret;
for (auto it = mConfigs.cbegin(); it != mConfigs.cend(); ++it) {
ret.push_back(*it);
@@ -159,29 +205,32 @@ vector<ConfigKey> ConfigManager::GetAllConfigKeys() const {
return ret;
}
-const pair<string, string> ConfigManager::GetConfigReceiver(const ConfigKey& key) const {
+const sp<android::IBinder> ConfigManager::GetConfigReceiver(const ConfigKey& key) const {
+ lock_guard<mutex> lock(mMutex);
+
auto it = mConfigReceivers.find(key);
if (it == mConfigReceivers.end()) {
- return pair<string,string>();
+ return nullptr;
} else {
return it->second;
}
}
void ConfigManager::Dump(FILE* out) {
+ lock_guard<mutex> lock(mMutex);
+
fprintf(out, "CONFIGURATIONS (%d)\n", (int)mConfigs.size());
fprintf(out, " uid name\n");
for (const auto& key : mConfigs) {
fprintf(out, " %6d %lld\n", key.GetUid(), (long long)key.GetId());
auto receiverIt = mConfigReceivers.find(key);
if (receiverIt != mConfigReceivers.end()) {
- fprintf(out, " -> received by %s, %s\n", receiverIt->second.first.c_str(),
- receiverIt->second.second.c_str());
+ fprintf(out, " -> received by PendingIntent as binder\n");
}
}
}
-void ConfigManager::update_saved_configs(const ConfigKey& key, const StatsdConfig& config) {
+void ConfigManager::update_saved_configs_locked(const ConfigKey& key, const StatsdConfig& config) {
// If there is a pre-existing config with same key we should first delete it.
remove_saved_configs(key);