Merge "Bound pending write events queue to avoid OOM"

This commit is contained in:
Treehugger Robot
2019-11-05 02:13:34 +00:00
committed by Gerrit Code Review
2 changed files with 14 additions and 4 deletions

View File

@@ -150,6 +150,7 @@ Return<Result> HalProxy::initialize(
// Clears the queue if any events were pending write before.
mPendingWriteEventsQueue = std::queue<std::pair<std::vector<Event>, size_t>>();
mSizePendingWriteEventsQueue = 0;
// Clears previously connected dynamic sensors
mDynamicSensors.clear();
@@ -287,7 +288,7 @@ Return<void> HalProxy::debug(const hidl_handle& fd, const hidl_vec<hidl_string>&
<< " ms ago" << std::endl;
// TODO(b/142969448): Add logging for history of wakelock acquisition per subhal.
stream << " Wakelock ref count: " << mWakelockRefCount << std::endl;
stream << " Size of pending write events queue: " << mPendingWriteEventsQueue.size()
stream << " # of events on pending write writes queue: " << mSizePendingWriteEventsQueue
<< std::endl;
if (!mPendingWriteEventsQueue.empty()) {
stream << " Size of events list on front of pending writes queue: "
@@ -490,8 +491,10 @@ void HalProxy::handlePendingWrites() {
// all the events ahead of it down to fill gap off array at front after the erase.
pendingWriteEvents.erase(pendingWriteEvents.begin(),
pendingWriteEvents.begin() + eventQueueSize);
mSizePendingWriteEventsQueue -= eventQueueSize;
} else {
mPendingWriteEventsQueue.pop();
mSizePendingWriteEventsQueue -= pendingWriteEvents.size();
}
}
}
@@ -563,11 +566,12 @@ void HalProxy::postEventsToMessageQueue(const std::vector<Event>& events, size_t
}
}
}
if (numToWrite < events.size()) {
// TODO(b/143302327): Bound the mPendingWriteEventsQueue so that we do not trigger OOMs if
// framework stalls
size_t numLeft = events.size() - numToWrite;
if (numToWrite < events.size() &&
mSizePendingWriteEventsQueue + numLeft <= kMaxSizePendingWriteEventsQueue) {
std::vector<Event> eventsLeft(events.begin() + numToWrite, events.end());
mPendingWriteEventsQueue.push({eventsLeft, numWakeupEvents});
mSizePendingWriteEventsQueue += numLeft;
mEventQueueWriteCV.notify_one();
}
}

View File

@@ -200,6 +200,12 @@ class HalProxy : public ISensors, public IScopedWakelockRefCounter {
*/
std::queue<std::pair<std::vector<Event>, size_t>> mPendingWriteEventsQueue;
//! The max number of events allowed in the pending write events queue
static constexpr size_t kMaxSizePendingWriteEventsQueue = 100000;
//! The number of events in the pending write events queue
size_t mSizePendingWriteEventsQueue = 0;
//! The mutex protecting writing to the fmq and the pending events queue
std::mutex mEventQueueWriteMutex;