mirror of
https://github.com/Evolution-X/hardware_interfaces
synced 2026-02-01 22:04:26 +00:00
Merge "Bound pending write events queue to avoid OOM"
am: 6cbd36f357
Change-Id: Ice70a28b24275e9463d2f3750fa39c0f5d811f00
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user