Fix thread safety issue on clearing cache
Historically, we havent held a lock on ForceClearCache and ClearCacheIfNecessary. This is not thread safe because kAllPullAtomInfo must be accessed in a lock, especially now that pullers can be registered/unregistered. Test: atest statsd_test, wrote a repro cl. Bug: 168156854 Change-Id: I47d53a6d9d274bca4c78dbfd87e0097091b7b8cb
This commit is contained in:
@@ -315,6 +315,7 @@ void StatsPullerManager::OnAlarmFired(int64_t elapsedTimeNs) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int StatsPullerManager::ForceClearPullerCache() {
|
int StatsPullerManager::ForceClearPullerCache() {
|
||||||
|
std::lock_guard<std::mutex> _l(mLock);
|
||||||
int totalCleared = 0;
|
int totalCleared = 0;
|
||||||
for (const auto& pulledAtom : kAllPullAtomInfo) {
|
for (const auto& pulledAtom : kAllPullAtomInfo) {
|
||||||
totalCleared += pulledAtom.second->ForceClearCache();
|
totalCleared += pulledAtom.second->ForceClearCache();
|
||||||
@@ -323,6 +324,7 @@ int StatsPullerManager::ForceClearPullerCache() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int StatsPullerManager::ClearPullerCacheIfNecessary(int64_t timestampNs) {
|
int StatsPullerManager::ClearPullerCacheIfNecessary(int64_t timestampNs) {
|
||||||
|
std::lock_guard<std::mutex> _l(mLock);
|
||||||
int totalCleared = 0;
|
int totalCleared = 0;
|
||||||
for (const auto& pulledAtom : kAllPullAtomInfo) {
|
for (const auto& pulledAtom : kAllPullAtomInfo) {
|
||||||
totalCleared += pulledAtom.second->ClearCacheIfNecessary(timestampNs);
|
totalCleared += pulledAtom.second->ClearCacheIfNecessary(timestampNs);
|
||||||
|
|||||||
Reference in New Issue
Block a user