Loading sensors/2.0/multihal/HalProxy.cpp +8 −4 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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: " Loading Loading @@ -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(); } } } Loading Loading @@ -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(); } } Loading sensors/2.0/multihal/include/HalProxy.h +6 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading
sensors/2.0/multihal/HalProxy.cpp +8 −4 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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: " Loading Loading @@ -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(); } } } Loading Loading @@ -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(); } } Loading
sensors/2.0/multihal/include/HalProxy.h +6 −0 Original line number Diff line number Diff line Loading @@ -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; Loading