// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef NET_DISK_CACHE_MEMORY_MEM_ENTRY_IMPL_H_ #define NET_DISK_CACHE_MEMORY_MEM_ENTRY_IMPL_H_ #include <stdint.h> #include <map> #include <memory> #include <string> #include <vector> #include "base/containers/linked_list.h" #include "base/gtest_prod_util.h" #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/time/time.h" #include "base/trace_event/memory_usage_estimator.h" #include "net/base/interval.h" #include "net/base/net_export.h" #include "net/disk_cache/disk_cache.h" #include "net/log/net_log_with_source.h" namespace net { class NetLog; } namespace disk_cache { class MemBackendImpl; // This class implements the Entry interface for the memory-only cache. An // object of this class represents a single entry on the cache. We use two types // of entries, parent and child to support sparse caching. // // A parent entry is non-sparse until a sparse method is invoked (i.e. // ReadSparseData, WriteSparseData, GetAvailableRange) when sparse information // is initialized. It then manages a list of child entries and delegates the // sparse API calls to the child entries. It creates and deletes child entries // and updates the list when needed. // // A child entry is used to carry partial cache content, non-sparse methods like // ReadData and WriteData cannot be applied to them. The lifetime of a child // entry is managed by the parent entry that created it except that the entry // can be evicted independently. A child entry does not have a key and it is not // registered in the backend's entry map. // // A sparse child entry has a fixed maximum size and can be partially // filled. There can only be one continous filled region in a sparse entry, as // illustrated by the following example: // | xxx ooooo | // x = unfilled region // o = filled region // It is guaranteed that there is at most one unfilled region and one filled // region, and the unfilled region (if there is one) is always before the filled // region. The book keeping for filled region in a sparse entry is done by using // the variable |child_first_pos_|. class NET_EXPORT_PRIVATE MemEntryImpl final : public Entry, public base::LinkNode<MemEntryImpl> { … }; } // namespace disk_cache #endif // NET_DISK_CACHE_MEMORY_MEM_ENTRY_IMPL_H_