blob: 468add143565b661f6b5ebc05be9247ec84679ae [file] [log] [blame]
Siarhei Vishniakoua04181f2021-03-26 05:56:49 +00001/*
2 * Copyright (C) 2021 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Prabir Pradhan48108662022-09-09 21:22:04 +000017#pragma once
Siarhei Vishniakoua04181f2021-03-26 05:56:49 +000018
Siarhei Vishniakouad16bf22023-09-05 18:24:44 -070019#include <android-base/thread_annotations.h>
Siarhei Vishniakou99b9d382021-04-01 08:03:41 +000020#include <kll.h>
Siarhei Vishniakoua04181f2021-03-26 05:56:49 +000021#include <statslog.h>
22#include <utils/Timers.h>
23
24#include "InputEventTimeline.h"
25
26namespace android::inputdispatcher {
27
28enum SketchIndex : size_t {
29 EVENT_TO_READ = 0,
30 READ_TO_DELIVER = 1,
31 DELIVER_TO_CONSUME = 2,
32 CONSUME_TO_FINISH = 3,
33 CONSUME_TO_GPU_COMPLETE = 4,
34 GPU_COMPLETE_TO_PRESENT = 5,
35 END_TO_END = 6, // EVENT_TO_PRESENT
36 SIZE = 7, // Must be last
37};
38
39// Let's create a full timeline here:
40// eventTime
41// readTime
42// <---- after this point, the data becomes per-connection
43// deliveryTime // time at which the event was sent to the receiver
44// consumeTime // time at which the receiver read the event
45// finishTime // time at which the finish event was received
46// GraphicsTimeline::GPU_COMPLETED_TIME
47// GraphicsTimeline::PRESENT_TIME
48
49/**
Siarhei Vishniakoua04181f2021-03-26 05:56:49 +000050 * Keep sketches of the provided events and report slow events
51 */
52class LatencyAggregator final : public InputEventTimelineProcessor {
53public:
54 LatencyAggregator();
55 /**
56 * Record a complete event timeline
57 */
58 void processTimeline(const InputEventTimeline& timeline) override;
59
jioana24878b52024-09-10 10:13:27 +000060 void pushLatencyStatistics() override;
61
Siarhei Vishniakou4c9d6ff2023-04-18 11:23:20 -070062 std::string dump(const char* prefix) const;
Siarhei Vishniakoua04181f2021-03-26 05:56:49 +000063
64 ~LatencyAggregator();
65
66private:
Siarhei Vishniakouad16bf22023-09-05 18:24:44 -070067 // Binder call -- called on a binder thread. This is different from the thread where the rest of
68 // the public API is called.
Siarhei Vishniakoua04181f2021-03-26 05:56:49 +000069 static AStatsManager_PullAtomCallbackReturn pullAtomCallback(int32_t atom_tag,
70 AStatsEventList* data,
71 void* cookie);
72 AStatsManager_PullAtomCallbackReturn pullData(AStatsEventList* data);
Siarhei Vishniakouad16bf22023-09-05 18:24:44 -070073
Siarhei Vishniakoua04181f2021-03-26 05:56:49 +000074 // ---------- Slow event handling ----------
75 void processSlowEvent(const InputEventTimeline& timeline);
76 nsecs_t mLastSlowEventTime = 0;
77 // How many slow events have been skipped due to rate limiting
78 size_t mNumSkippedSlowEvents = 0;
79 // How many events have been received since the last time we reported a slow event
80 size_t mNumEventsSinceLastSlowEventReport = 0;
81
82 // ---------- Statistics handling ----------
Siarhei Vishniakouad16bf22023-09-05 18:24:44 -070083 // Statistics is pulled rather than pushed. It's pulled on a binder thread, and therefore will
84 // be accessed by two different threads. The lock is needed to protect the pulled data.
85 mutable std::mutex mLock;
Siarhei Vishniakoua04181f2021-03-26 05:56:49 +000086 void processStatistics(const InputEventTimeline& timeline);
87 // Sketches
Siarhei Vishniakou99b9d382021-04-01 08:03:41 +000088 std::array<std::unique_ptr<dist_proc::aggregation::KllQuantile>, SketchIndex::SIZE>
Siarhei Vishniakouad16bf22023-09-05 18:24:44 -070089 mDownSketches GUARDED_BY(mLock);
Siarhei Vishniakou99b9d382021-04-01 08:03:41 +000090 std::array<std::unique_ptr<dist_proc::aggregation::KllQuantile>, SketchIndex::SIZE>
Siarhei Vishniakouad16bf22023-09-05 18:24:44 -070091 mMoveSketches GUARDED_BY(mLock);
Siarhei Vishniakou99b9d382021-04-01 08:03:41 +000092 // How many events have been processed so far
Siarhei Vishniakouad16bf22023-09-05 18:24:44 -070093 size_t mNumSketchEventsProcessed GUARDED_BY(mLock) = 0;
Siarhei Vishniakoua04181f2021-03-26 05:56:49 +000094};
95
96} // namespace android::inputdispatcher