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