From 4ee37bc91e55371399435eaa020813fdb7b898ac Mon Sep 17 00:00:00 2001 From: Mark Salyzyn Date: Thu, 3 Sep 2015 16:08:50 -0700 Subject: 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 --- logd/LogBuffer.cpp | 17 +++++++++-------- logd/LogBuffer.h | 3 ++- 2 files changed, 11 insertions(+), 9 deletions(-) (limited to 'logd') 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__ -- cgit v1.1