diff options
author | Mark Salyzyn <salyzyn@google.com> | 2015-09-03 16:08:50 -0700 |
---|---|---|
committer | Mark Salyzyn <salyzyn@google.com> | 2015-09-04 14:32:46 +0000 |
commit | 4ee37bc91e55371399435eaa020813fdb7b898ac (patch) | |
tree | 0e6280c730c89f914ca02fd4baea0adb73e6286c /logd | |
parent | d9a06afb19156b61ee85c975a292d884bba09c7f (diff) | |
download | system_core-4ee37bc91e55371399435eaa020813fdb7b898ac.zip system_core-4ee37bc91e55371399435eaa020813fdb7b898ac.tar.gz system_core-4ee37bc91e55371399435eaa020813fdb7b898ac.tar.bz2 |
logd: worst uid record watermark part four
(cherry pick from commit 831aa297307a038705bc771281ffd53266484b4a)
With part deux we caused an apparent regression by not checking for
stale recorded iterators. This checking was on-purpose bypassesed
when leading prune entries were to be deleted without touching the
statistics engine due to an in-place merge.
Part deux had us leaving iterators we were not focussed on untouched
which in turn because they were left behind, had a much higher
likelihood of being deleted without touching the statistics engine.
Perform the check every delete.
Bug: 23789348
Bug: 23490267
Change-Id: Idc6cc23d1f9e3b6cd9a083139a0de59479fbfe08
Diffstat (limited to 'logd')
-rw-r--r-- | logd/LogBuffer.cpp | 17 | ||||
-rw-r--r-- | logd/LogBuffer.h | 3 |
2 files changed, 11 insertions, 9 deletions
diff --git a/logd/LogBuffer.cpp b/logd/LogBuffer.cpp index 9605ef8..4933a46 100644 --- a/logd/LogBuffer.cpp +++ b/logd/LogBuffer.cpp @@ -238,7 +238,8 @@ void LogBuffer::maybePrune(log_id_t id) { } } -LogBufferElementCollection::iterator LogBuffer::erase(LogBufferElementCollection::iterator it) { +LogBufferElementCollection::iterator LogBuffer::erase( + LogBufferElementCollection::iterator it, bool engageStats) { LogBufferElement *e = *it; log_id_t id = e->getLogId(); LogBufferIteratorMap::iterator f = mLastWorstUid[id].find(e->getUid()); @@ -247,7 +248,11 @@ LogBufferElementCollection::iterator LogBuffer::erase(LogBufferElementCollection mLastWorstUid[id].erase(f); } it = mLogElements.erase(it); - stats.subtract(e); + if (engageStats) { + stats.subtract(e); + } else { + stats.erase(e); + } delete e; return it; @@ -442,9 +447,7 @@ void LogBuffer::prune(log_id_t id, unsigned long pruneRows, uid_t caller_uid) { // merge any drops if (dropped && last.merge(e, dropped)) { - it = mLogElements.erase(it); - stats.erase(e); - delete e; + it = erase(it, false); continue; } @@ -510,9 +513,7 @@ void LogBuffer::prune(log_id_t id, unsigned long pruneRows, uid_t caller_uid) { stats.drop(e); e->setDropped(1); if (last.merge(e, 1)) { - it = mLogElements.erase(it); - stats.erase(e); - delete e; + it = erase(it, false); } else { last.add(e); mLastWorstUid[id][e->getUid()] = it; diff --git a/logd/LogBuffer.h b/logd/LogBuffer.h index e94598c..4769a6c 100644 --- a/logd/LogBuffer.h +++ b/logd/LogBuffer.h @@ -87,7 +87,8 @@ public: private: void maybePrune(log_id_t id); void prune(log_id_t id, unsigned long pruneRows, uid_t uid = AID_ROOT); - LogBufferElementCollection::iterator erase(LogBufferElementCollection::iterator it); + LogBufferElementCollection::iterator erase( + LogBufferElementCollection::iterator it, bool engageStats = true); }; #endif // _LOGD_LOG_BUFFER_H__ |