|  | /* | 
|  | * Copyright (C) 2020 The Android Open Source Project | 
|  | * | 
|  | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | * you may not use this file except in compliance with the License. | 
|  | * You may obtain a copy of the License at | 
|  | * | 
|  | *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, software | 
|  | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | * See the License for the specific language governing permissions and | 
|  | * limitations under the License. | 
|  | */ | 
|  |  | 
|  | #include "AnrTracker.h" | 
|  |  | 
|  | namespace android::inputdispatcher { | 
|  |  | 
|  | template <typename T> | 
|  | static T max(const T& a, const T& b) { | 
|  | return a < b ? b : a; | 
|  | } | 
|  |  | 
|  | void AnrTracker::insert(nsecs_t timeoutTime, sp<IBinder> token) { | 
|  | mAnrTimeouts.insert(std::make_pair(timeoutTime, std::move(token))); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Erase a single entry only. If there are multiple duplicate entries | 
|  | * (same time, same connection), then only remove one of them. | 
|  | */ | 
|  | void AnrTracker::erase(nsecs_t timeoutTime, const sp<IBinder>& token) { | 
|  | auto pair = std::make_pair(timeoutTime, token); | 
|  | auto it = mAnrTimeouts.find(pair); | 
|  | if (it != mAnrTimeouts.end()) { | 
|  | mAnrTimeouts.erase(it); | 
|  | } | 
|  | } | 
|  |  | 
|  | void AnrTracker::eraseToken(const sp<IBinder>& token) { | 
|  | for (auto it = mAnrTimeouts.begin(); it != mAnrTimeouts.end();) { | 
|  | if (it->second == token) { | 
|  | it = mAnrTimeouts.erase(it); | 
|  | } else { | 
|  | ++it; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | bool AnrTracker::empty() const { | 
|  | return mAnrTimeouts.empty(); | 
|  | } | 
|  |  | 
|  | // If empty() is false, return the time at which the next connection should cause an ANR | 
|  | // If empty() is true, return LLONG_MAX | 
|  | nsecs_t AnrTracker::firstTimeout() const { | 
|  | if (mAnrTimeouts.empty()) { | 
|  | return std::numeric_limits<nsecs_t>::max(); | 
|  | } | 
|  | return mAnrTimeouts.begin()->first; | 
|  | } | 
|  |  | 
|  | const sp<IBinder>& AnrTracker::firstToken() const { | 
|  | return mAnrTimeouts.begin()->second; | 
|  | } | 
|  |  | 
|  | void AnrTracker::clear() { | 
|  | mAnrTimeouts.clear(); | 
|  | } | 
|  |  | 
|  | } // namespace android::inputdispatcher |