Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(635)

Unified Diff: net/disk_cache/memory/mem_entry_impl.h

Issue 1715833002: Reland: Refactor and shorten in-memory cache. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix typo in comment Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: net/disk_cache/memory/mem_entry_impl.h
diff --git a/net/disk_cache/memory/mem_entry_impl.h b/net/disk_cache/memory/mem_entry_impl.h
index 52a1696f63c457be200f402ef5c1ed2c336ab6e3..11634e6ab9a883a64856f31d5e459b65707eb36f 100644
--- a/net/disk_cache/memory/mem_entry_impl.h
+++ b/net/disk_cache/memory/mem_entry_impl.h
@@ -7,9 +7,15 @@
#include <stdint.h>
+#include <string>
+#include <vector>
+
#include "base/containers/hash_tables.h"
+#include "base/containers/linked_list.h"
+#include "base/gtest_prod_util.h"
#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
+#include "base/time/time.h"
#include "net/disk_cache/disk_cache.h"
#include "net/log/net_log.h"
@@ -18,8 +24,8 @@ 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.
+// 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
@@ -31,64 +37,62 @@ class MemBackendImpl;
// 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. It is registered in the backend's
-// ranking list to enable eviction of a partial content.
+// registered in the backend's entry map.
//
-// A sparse 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:
+// 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 guranteed that there is at most one unfilled region and one filled
+// 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_| (inclusive).
+// the variable |child_first_pos_|.
-class MemEntryImpl : public Entry {
+class NET_EXPORT_PRIVATE MemEntryImpl final
+ : public Entry,
+ public base::LinkNode<MemEntryImpl> {
public:
enum EntryType {
- kParentEntry,
- kChildEntry,
+ PARENT_ENTRY,
+ CHILD_ENTRY,
};
- explicit MemEntryImpl(MemBackendImpl* backend);
+ // Provided to better document calls to |UpdateStateOnUse()|.
+ enum EntryModified {
+ ENTRY_WAS_NOT_MODIFIED,
+ ENTRY_WAS_MODIFIED,
+ };
- // Performs the initialization of a EntryImpl that will be added to the
- // cache.
- bool CreateEntry(const std::string& key, net::NetLog* net_log);
+ // Constructor for parent entries.
+ MemEntryImpl(MemBackendImpl* backend,
+ const std::string& key,
+ net::NetLog* net_log);
- // Permanently destroys this entry.
- void InternalDoom();
+ // Constructor for child entries.
+ MemEntryImpl(MemBackendImpl* backend,
+ int child_id,
+ MemEntryImpl* parent,
+ net::NetLog* net_log);
void Open();
- bool InUse();
-
- MemEntryImpl* next() const {
- return next_;
- }
+ bool InUse() const;
- MemEntryImpl* prev() const {
- return prev_;
- }
+ EntryType type() const { return parent_ ? CHILD_ENTRY : PARENT_ENTRY; }
+ const std::string& key() const { return key_; }
+ const MemEntryImpl* parent() const { return parent_; }
+ int child_id() const { return child_id_; }
+ base::Time last_used() const { return last_used_; }
- void set_next(MemEntryImpl* next) {
- next_ = next;
- }
+ // The in-memory size of this entry to use for the purposes of eviction.
+ int GetStorageSize() const;
- void set_prev(MemEntryImpl* prev) {
- prev_ = prev;
- }
+ // Update an entry's position in the backend LRU list and set |last_used_|. If
+ // the entry was modified, also update |last_modified_|.
+ void UpdateStateOnUse(EntryModified modified_enum);
- EntryType type() const {
- return parent_ ? kChildEntry : kParentEntry;
- }
-
- const net::BoundNetLog& net_log() {
- return net_log_;
- }
-
- // Entry interface.
+ // From disk_cache::Entry:
void Doom() override;
void Close() override;
std::string GetKey() const override;
@@ -123,11 +127,15 @@ class MemEntryImpl : public Entry {
int ReadyForSparseIO(const CompletionCallback& callback) override;
private:
+ MemEntryImpl(MemBackendImpl* backend,
+ const std::string& key,
+ int child_id,
+ MemEntryImpl* parent,
+ net::NetLog* net_log);
+
typedef base::hash_map<int, MemEntryImpl*> EntryMap;
- enum {
- NUM_STREAMS = 3
- };
+ static const int kNumStreams = 3;
~MemEntryImpl() override;
@@ -138,53 +146,35 @@ class MemEntryImpl : public Entry {
bool truncate);
int InternalReadSparseData(int64_t offset, IOBuffer* buf, int buf_len);
int InternalWriteSparseData(int64_t offset, IOBuffer* buf, int buf_len);
-
- // Old Entry interface.
- int GetAvailableRange(int64_t offset, int len, int64_t* start);
-
- // Grows and cleans up the data buffer.
- void PrepareTarget(int index, int offset, int buf_len);
-
- // Updates ranking information.
- void UpdateRank(bool modified);
+ int InternalGetAvailableRange(int64_t offset, int len, int64_t* start);
// Initializes the children map and sparse info. This method is only called
// on a parent entry.
bool InitSparseInfo();
- // Performs the initialization of a MemEntryImpl as a child entry.
- // |parent| is the pointer to the parent entry. |child_id| is the ID of
- // the new child.
- bool InitChildEntry(MemEntryImpl* parent, int child_id, net::NetLog* net_log);
-
// Returns an entry responsible for |offset|. The returned entry can be a
// child entry or this entry itself if |offset| points to the first range.
// If such entry does not exist and |create| is true, a new child entry is
// created.
- MemEntryImpl* OpenChild(int64_t offset, bool create);
+ MemEntryImpl* GetChild(int64_t offset, bool create);
// Finds the first child located within the range [|offset|, |offset + len|).
// Returns the number of bytes ahead of |offset| to reach the first available
// bytes in the entry. The first child found is output to |child|.
int FindNextChild(int64_t offset, int len, MemEntryImpl** child);
- // Removes child indexed by |child_id| from the children map.
- void DetachChild(int child_id);
-
std::string key_;
- std::vector<char> data_[NUM_STREAMS]; // User data.
- int32_t data_size_[NUM_STREAMS];
+ std::vector<char> data_[kNumStreams]; // User data.
int ref_count_;
int child_id_; // The ID of a child entry.
int child_first_pos_; // The position of the first byte in a child
// entry.
- MemEntryImpl* next_; // Pointers for the LRU list.
- MemEntryImpl* prev_;
- MemEntryImpl* parent_; // Pointer to the parent entry.
+ // Pointer to the parent entry, or nullptr if this entry is a parent entry.
+ MemEntryImpl* parent_;
scoped_ptr<EntryMap> children_;
- base::Time last_modified_; // LRU information.
+ base::Time last_modified_;
base::Time last_used_;
MemBackendImpl* backend_; // Back pointer to the cache.
bool doomed_; // True if this entry was removed from the cache.

Powered by Google App Engine
This is Rietveld 408576698