| /* |
| * 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 |