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

Commit 57ed4c98 authored by Stan Rokita's avatar Stan Rokita Committed by android-build-merger
Browse files

Merge "Bound pending write events queue to avoid OOM" am: 6cbd36f3 am: 797b06e2

am: ac564f28

Change-Id: I09b08508fd3cf53381d524613dad63621eb63595
parents e32c7b2a ac564f28
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;