Skip to content

Commit 5696003

Browse files
pmuetschardAndroid (Google) Code Review
authored andcommitted
Merge "Fix JankTracker multimap lookups." into main
2 parents 6a3b850 + fe91787 commit 5696003

2 files changed

Lines changed: 38 additions & 5 deletions

File tree

services/surfaceflinger/Jank/JankTracker.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ void JankTracker::onJankData(int32_t layerId, gui::JankData data) {
8888
}
8989

9090
void JankTracker::addJankListenerLocked(int32_t layerId, sp<IBinder> listener) {
91-
for (auto it = mJankListeners.find(layerId); it != mJankListeners.end(); it++) {
91+
auto range = mJankListeners.equal_range(layerId);
92+
for (auto it = range.first; it != range.second; it++) {
9293
if (it->second.mListener == listener) {
9394
// Undo the duplicate increment in addJankListener.
9495
sListenerCount--;
@@ -106,7 +107,8 @@ void JankTracker::doFlushJankData(int32_t layerId) {
106107
std::vector<sp<IBinder>> toSend;
107108

108109
mLock.lock();
109-
for (auto it = mJankListeners.find(layerId); it != mJankListeners.end();) {
110+
auto range = mJankListeners.equal_range(layerId);
111+
for (auto it = range.first; it != range.second;) {
110112
if (!jankData.empty()) {
111113
toSend.emplace_back(it->second.mListener);
112114
}
@@ -133,7 +135,8 @@ void JankTracker::doFlushJankData(int32_t layerId) {
133135

134136
void JankTracker::markJankListenerForRemovalLocked(int32_t layerId, sp<IBinder> listener,
135137
int64_t afterVysnc) {
136-
for (auto it = mJankListeners.find(layerId); it != mJankListeners.end(); it++) {
138+
auto range = mJankListeners.equal_range(layerId);
139+
for (auto it = range.first; it != range.second; it++) {
137140
if (it->second.mListener == listener) {
138141
it->second.mRemoveAfter = std::max(static_cast<int64_t>(0), afterVysnc);
139142
return;
@@ -156,7 +159,8 @@ int64_t JankTracker::transferAvailableJankData(int32_t layerId,
156159

157160
void JankTracker::dropJankListener(int32_t layerId, sp<IBinder> listener) {
158161
const std::lock_guard<std::mutex> _l(mLock);
159-
for (auto it = mJankListeners.find(layerId); it != mJankListeners.end(); it++) {
162+
auto range = mJankListeners.equal_range(layerId);
163+
for (auto it = range.first; it != range.second; it++) {
160164
if (it->second.mListener == listener) {
161165
mJankListeners.erase(it);
162166
sListenerCount--;

services/surfaceflinger/tests/unittests/JankTrackerTest.cpp

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,4 +213,33 @@ TEST_F(JankTrackerTest, listenerCountIsAccurateOnDuplicateRegistration) {
213213
EXPECT_EQ(listenerCount(), 0u);
214214
}
215215

216-
} // namespace android
216+
TEST_F(JankTrackerTest, multipleLayersAreTrackedIndependently) {
217+
size_t jankDataReceived = 0;
218+
size_t numBatchesReceived = 0;
219+
220+
EXPECT_CALL(*mListener.get(), onJankData(_))
221+
.WillRepeatedly([&](const std::vector<gui::JankData>& jankData) {
222+
jankDataReceived += jankData.size();
223+
numBatchesReceived++;
224+
return binder::Status::ok();
225+
});
226+
addJankListener(123);
227+
addJankListener(321);
228+
addJankData(123, 1);
229+
addJankData(123, 2);
230+
addJankData(123, 3);
231+
addJankData(321, 4);
232+
addJankData(321, 5);
233+
234+
JankTracker::flushJankData(123);
235+
flushBackgroundThread();
236+
EXPECT_EQ(numBatchesReceived, 1u);
237+
EXPECT_EQ(jankDataReceived, 3u);
238+
239+
JankTracker::flushJankData(321);
240+
flushBackgroundThread();
241+
EXPECT_EQ(numBatchesReceived, 2u);
242+
EXPECT_EQ(jankDataReceived, 5u);
243+
}
244+
245+
} // namespace android

0 commit comments

Comments
 (0)