Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6cbd36f3 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Bound pending write events queue to avoid OOM"

parents 64b332dd 5098f0a9
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -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();
    }
}
+6 −0
Original line number Diff line number Diff line
@@ -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;