diff options
author | 2023-07-06 17:41:14 +0000 | |
---|---|---|
committer | 2023-07-06 17:41:14 +0000 | |
commit | dff3962ca11934ac07593b59dad5507d0ff91504 (patch) | |
tree | ec119b14c12cf55cb8ba7fe189597de7e8ca5634 | |
parent | 7af31cb0f6ae3cb5678106c4857f28dce38e09e8 (diff) | |
parent | 047695b3ed309ec1b95b5d2fadf41d2415ac739f (diff) |
Merge "Metrics Collector: Prevent queuing interactions from ignored devices" into udc-qpr-dev
-rw-r--r-- | services/inputflinger/InputDeviceMetricsCollector.cpp | 10 | ||||
-rw-r--r-- | services/inputflinger/SyncQueue.h | 17 | ||||
-rw-r--r-- | services/inputflinger/tests/InputDeviceMetricsCollector_test.cpp | 1 | ||||
-rw-r--r-- | services/inputflinger/tests/SyncQueue_test.cpp | 12 |
4 files changed, 37 insertions, 3 deletions
diff --git a/services/inputflinger/InputDeviceMetricsCollector.cpp b/services/inputflinger/InputDeviceMetricsCollector.cpp index 999e17512a..7c99a1cb99 100644 --- a/services/inputflinger/InputDeviceMetricsCollector.cpp +++ b/services/inputflinger/InputDeviceMetricsCollector.cpp @@ -39,6 +39,8 @@ constexpr nanoseconds DEFAULT_USAGE_SESSION_TIMEOUT = std::chrono::minutes(2); */ const bool DEBUG = __android_log_is_loggable(ANDROID_LOG_DEBUG, LOG_TAG, ANDROID_LOG_INFO); +constexpr size_t INTERACTIONS_QUEUE_CAPACITY = 500; + int32_t linuxBusToInputDeviceBusEnum(int32_t linuxBus) { // When adding cases to this switch, also add them to the copy of this method in // TouchpadInputMapper.cpp. @@ -201,7 +203,10 @@ InputDeviceMetricsCollector::InputDeviceMetricsCollector(InputListenerInterface& InputDeviceMetricsCollector::InputDeviceMetricsCollector(InputListenerInterface& listener, InputDeviceMetricsLogger& logger, nanoseconds usageSessionTimeout) - : mNextListener(listener), mLogger(logger), mUsageSessionTimeout(usageSessionTimeout) {} + : mNextListener(listener), + mLogger(logger), + mUsageSessionTimeout(usageSessionTimeout), + mInteractionsQueue(INTERACTIONS_QUEUE_CAPACITY) {} void InputDeviceMetricsCollector::notifyInputDevicesChanged( const NotifyInputDevicesChangedArgs& args) { @@ -262,6 +267,9 @@ void InputDeviceMetricsCollector::notifyPointerCaptureChanged( void InputDeviceMetricsCollector::notifyDeviceInteraction(int32_t deviceId, nsecs_t timestamp, const std::set<Uid>& uids) { + if (isIgnoredInputDeviceId(deviceId)) { + return; + } mInteractionsQueue.push(DeviceId{deviceId}, timestamp, uids); } diff --git a/services/inputflinger/SyncQueue.h b/services/inputflinger/SyncQueue.h index 62efd5598a..84ccace96e 100644 --- a/services/inputflinger/SyncQueue.h +++ b/services/inputflinger/SyncQueue.h @@ -27,6 +27,10 @@ namespace android { template <class T> class SyncQueue { public: + SyncQueue() = default; + + SyncQueue(size_t capacity) : mCapacity(capacity) {} + /** Retrieve and remove the oldest object. Returns std::nullopt if the queue is empty. */ std::optional<T> pop() { std::scoped_lock lock(mLock); @@ -38,14 +42,23 @@ public: return t; }; - /** Add a new object to the queue. */ + /** + * Add a new object to the queue. + * Return true if an element was successfully added. + * Return false if the queue is full. + */ template <class... Args> - void push(Args&&... args) { + bool push(Args&&... args) { std::scoped_lock lock(mLock); + if (mCapacity && mQueue.size() == mCapacity) { + return false; + } mQueue.emplace_back(args...); + return true; }; private: + const std::optional<size_t> mCapacity; std::mutex mLock; std::list<T> mQueue GUARDED_BY(mLock); }; diff --git a/services/inputflinger/tests/InputDeviceMetricsCollector_test.cpp b/services/inputflinger/tests/InputDeviceMetricsCollector_test.cpp index 0aa5e238c3..484e7d6896 100644 --- a/services/inputflinger/tests/InputDeviceMetricsCollector_test.cpp +++ b/services/inputflinger/tests/InputDeviceMetricsCollector_test.cpp @@ -421,6 +421,7 @@ TEST_F(InputDeviceMetricsCollectorTest, DontLogUsageForIgnoredDevices) { // Device was used. mMetricsCollector.notifyMotion(generateMotionArgs(ignoredDeviceId)); mTestListener.assertNotifyMotionWasCalled(); + mMetricsCollector.notifyDeviceInteraction(ignoredDeviceId, TIME.count(), uids({0, 1, 2})); ASSERT_NO_FATAL_FAILURE(assertUsageNotLogged()); // Device was used again after the usage timeout expired, but we still don't log usage. diff --git a/services/inputflinger/tests/SyncQueue_test.cpp b/services/inputflinger/tests/SyncQueue_test.cpp index af2f961ed4..b57ccc24be 100644 --- a/services/inputflinger/tests/SyncQueue_test.cpp +++ b/services/inputflinger/tests/SyncQueue_test.cpp @@ -50,6 +50,18 @@ TEST(SyncQueueTest, isFIFO) { } } +// Make sure the queue has strict capacity limits. +TEST(SyncQueueTest, QueueReachesCapacity) { + constexpr size_t capacity = 3; + SyncQueue<int> queue(capacity); + + // First 3 elements should be added successfully + ASSERT_TRUE(queue.push(1)); + ASSERT_TRUE(queue.push(2)); + ASSERT_TRUE(queue.push(3)); + ASSERT_FALSE(queue.push(4)) << "Queue should reach capacity at size " << capacity; +} + TEST(SyncQueueTest, AllowsMultipleThreads) { SyncQueue<int> queue; |