| /* |
| * Copyright (C) 2018 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 "src/traced/probes/filesystem/lru_inode_cache.h" |
| |
| namespace perfetto { |
| |
| InodeMapValue* LRUInodeCache::Get(const InodeKey& k) { |
| const auto& map_it = map_.find(k); |
| if (map_it == map_.end()) { |
| return nullptr; |
| } |
| auto list_entry = map_it->second; |
| // Bump this item to the front of the cache. |
| // We can borrow both elements of the pair stored in the list because |
| // insert does not need them. |
| Insert(map_it, std::move(list_entry->first), std::move(list_entry->second)); |
| return &list_.begin()->second; |
| } |
| |
| void LRUInodeCache::Insert(InodeKey k, InodeMapValue v) { |
| auto it = map_.find(k); |
| return Insert(it, std::move(k), std::move(v)); |
| } |
| |
| void LRUInodeCache::Insert(typename MapType::iterator map_it, |
| InodeKey k, |
| InodeMapValue v) { |
| list_.emplace_front(k, std::move(v)); |
| if (map_it != map_.end()) { |
| ListIteratorType& list_it = map_it->second; |
| list_.erase(list_it); |
| list_it = list_.begin(); |
| } else { |
| map_.emplace(std::move(k), list_.begin()); |
| } |
| |
| if (map_.size() > capacity_) { |
| auto list_last_it = list_.end(); |
| list_last_it--; |
| map_.erase(list_last_it->first); |
| list_.erase(list_last_it); |
| } |
| } |
| } // namespace perfetto |