summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/data/cache_tests/bad_entry/contents.txt66
-rw-r--r--net/data/cache_tests/bad_entry/data_0bin45056 -> 45056 bytes
-rw-r--r--net/data/cache_tests/bad_entry/data_1bin270336 -> 270336 bytes
-rw-r--r--net/data/cache_tests/bad_entry/data_2bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/bad_entry/data_3bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/bad_entry/indexbin262208 -> 262512 bytes
-rw-r--r--net/data/cache_tests/bad_rankings/contents.txt66
-rw-r--r--net/data/cache_tests/bad_rankings/data_0bin45056 -> 45056 bytes
-rw-r--r--net/data/cache_tests/bad_rankings/data_1bin270336 -> 270336 bytes
-rw-r--r--net/data/cache_tests/bad_rankings/data_2bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/bad_rankings/data_3bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/bad_rankings/indexbin262208 -> 262512 bytes
-rw-r--r--net/data/cache_tests/insert_empty1/data_0bin45056 -> 45056 bytes
-rw-r--r--net/data/cache_tests/insert_empty1/data_1bin270336 -> 270336 bytes
-rw-r--r--net/data/cache_tests/insert_empty1/data_2bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/insert_empty1/data_3bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/insert_empty1/indexbin262208 -> 262512 bytes
-rw-r--r--net/data/cache_tests/insert_empty2/data_0bin45056 -> 45056 bytes
-rw-r--r--net/data/cache_tests/insert_empty2/data_1bin270336 -> 270336 bytes
-rw-r--r--net/data/cache_tests/insert_empty2/data_2bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/insert_empty2/data_3bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/insert_empty2/indexbin262208 -> 262512 bytes
-rw-r--r--net/data/cache_tests/insert_empty3/data_0bin45056 -> 45056 bytes
-rw-r--r--net/data/cache_tests/insert_empty3/data_1bin270336 -> 270336 bytes
-rw-r--r--net/data/cache_tests/insert_empty3/data_2bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/insert_empty3/data_3bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/insert_empty3/indexbin262208 -> 262512 bytes
-rw-r--r--net/data/cache_tests/insert_load1/data_0bin45056 -> 45056 bytes
-rw-r--r--net/data/cache_tests/insert_load1/data_1bin270336 -> 270336 bytes
-rw-r--r--net/data/cache_tests/insert_load1/data_2bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/insert_load1/data_3bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/insert_load1/indexbin262208 -> 262512 bytes
-rw-r--r--net/data/cache_tests/insert_load2/data_0bin45056 -> 45056 bytes
-rw-r--r--net/data/cache_tests/insert_load2/data_1bin270336 -> 270336 bytes
-rw-r--r--net/data/cache_tests/insert_load2/data_2bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/insert_load2/data_3bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/insert_load2/indexbin262208 -> 262512 bytes
-rw-r--r--net/data/cache_tests/insert_one1/data_0bin45056 -> 45056 bytes
-rw-r--r--net/data/cache_tests/insert_one1/data_1bin270336 -> 270336 bytes
-rw-r--r--net/data/cache_tests/insert_one1/data_2bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/insert_one1/data_3bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/insert_one1/indexbin262208 -> 262512 bytes
-rw-r--r--net/data/cache_tests/insert_one2/data_0bin45056 -> 45056 bytes
-rw-r--r--net/data/cache_tests/insert_one2/data_1bin270336 -> 270336 bytes
-rw-r--r--net/data/cache_tests/insert_one2/data_2bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/insert_one2/data_3bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/insert_one2/indexbin262208 -> 262512 bytes
-rw-r--r--net/data/cache_tests/insert_one3/data_0bin45056 -> 45056 bytes
-rw-r--r--net/data/cache_tests/insert_one3/data_1bin270336 -> 270336 bytes
-rw-r--r--net/data/cache_tests/insert_one3/data_2bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/insert_one3/data_3bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/insert_one3/indexbin262208 -> 262512 bytes
-rw-r--r--net/data/cache_tests/list_loop/contents.txt228
-rw-r--r--net/data/cache_tests/list_loop/data_0bin45056 -> 45056 bytes
-rw-r--r--net/data/cache_tests/list_loop/data_1bin270336 -> 270336 bytes
-rw-r--r--net/data/cache_tests/list_loop/data_2bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/list_loop/data_3bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/list_loop/indexbin262208 -> 262512 bytes
-rw-r--r--net/data/cache_tests/remove_head1/data_0bin45056 -> 45056 bytes
-rw-r--r--net/data/cache_tests/remove_head1/data_1bin270336 -> 270336 bytes
-rw-r--r--net/data/cache_tests/remove_head1/data_2bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_head1/data_3bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_head1/indexbin262208 -> 262512 bytes
-rw-r--r--net/data/cache_tests/remove_head2/data_0bin45056 -> 45056 bytes
-rw-r--r--net/data/cache_tests/remove_head2/data_1bin270336 -> 270336 bytes
-rw-r--r--net/data/cache_tests/remove_head2/data_2bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_head2/data_3bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_head2/indexbin262208 -> 262512 bytes
-rw-r--r--net/data/cache_tests/remove_head3/data_0bin45056 -> 45056 bytes
-rw-r--r--net/data/cache_tests/remove_head3/data_1bin270336 -> 270336 bytes
-rw-r--r--net/data/cache_tests/remove_head3/data_2bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_head3/data_3bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_head3/indexbin262208 -> 262512 bytes
-rw-r--r--net/data/cache_tests/remove_head4/data_0bin45056 -> 45056 bytes
-rw-r--r--net/data/cache_tests/remove_head4/data_1bin270336 -> 270336 bytes
-rw-r--r--net/data/cache_tests/remove_head4/data_2bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_head4/data_3bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_head4/indexbin262208 -> 262512 bytes
-rw-r--r--net/data/cache_tests/remove_load1/data_0bin45056 -> 45056 bytes
-rw-r--r--net/data/cache_tests/remove_load1/data_1bin270336 -> 270336 bytes
-rw-r--r--net/data/cache_tests/remove_load1/data_2bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_load1/data_3bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_load1/indexbin262208 -> 262512 bytes
-rw-r--r--net/data/cache_tests/remove_load2/data_0bin45056 -> 45056 bytes
-rw-r--r--net/data/cache_tests/remove_load2/data_1bin270336 -> 270336 bytes
-rw-r--r--net/data/cache_tests/remove_load2/data_2bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_load2/data_3bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_load2/indexbin262208 -> 262512 bytes
-rw-r--r--net/data/cache_tests/remove_load3/data_0bin45056 -> 45056 bytes
-rw-r--r--net/data/cache_tests/remove_load3/data_1bin270336 -> 270336 bytes
-rw-r--r--net/data/cache_tests/remove_load3/data_2bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_load3/data_3bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_load3/indexbin262208 -> 262512 bytes
-rw-r--r--net/data/cache_tests/remove_one1/data_0bin45056 -> 45056 bytes
-rw-r--r--net/data/cache_tests/remove_one1/data_1bin270336 -> 270336 bytes
-rw-r--r--net/data/cache_tests/remove_one1/data_2bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_one1/data_3bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_one1/indexbin262208 -> 262512 bytes
-rw-r--r--net/data/cache_tests/remove_one2/data_0bin45056 -> 45056 bytes
-rw-r--r--net/data/cache_tests/remove_one2/data_1bin270336 -> 270336 bytes
-rw-r--r--net/data/cache_tests/remove_one2/data_2bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_one2/data_3bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_one2/indexbin262208 -> 262512 bytes
-rw-r--r--net/data/cache_tests/remove_one3/data_0bin45056 -> 45056 bytes
-rw-r--r--net/data/cache_tests/remove_one3/data_1bin270336 -> 270336 bytes
-rw-r--r--net/data/cache_tests/remove_one3/data_2bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_one3/data_3bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_one3/indexbin262208 -> 262512 bytes
-rw-r--r--net/data/cache_tests/remove_one4/data_0bin45056 -> 45056 bytes
-rw-r--r--net/data/cache_tests/remove_one4/data_1bin270336 -> 270336 bytes
-rw-r--r--net/data/cache_tests/remove_one4/data_2bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_one4/data_3bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_one4/indexbin262208 -> 262512 bytes
-rw-r--r--net/data/cache_tests/remove_tail1/data_0bin45056 -> 45056 bytes
-rw-r--r--net/data/cache_tests/remove_tail1/data_1bin270336 -> 270336 bytes
-rw-r--r--net/data/cache_tests/remove_tail1/data_2bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_tail1/data_3bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_tail1/indexbin262208 -> 262512 bytes
-rw-r--r--net/data/cache_tests/remove_tail2/data_0bin45056 -> 45056 bytes
-rw-r--r--net/data/cache_tests/remove_tail2/data_1bin270336 -> 270336 bytes
-rw-r--r--net/data/cache_tests/remove_tail2/data_2bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_tail2/data_3bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_tail2/indexbin262208 -> 262512 bytes
-rw-r--r--net/data/cache_tests/remove_tail3/data_0bin45056 -> 45056 bytes
-rw-r--r--net/data/cache_tests/remove_tail3/data_1bin270336 -> 270336 bytes
-rw-r--r--net/data/cache_tests/remove_tail3/data_2bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_tail3/data_3bin8192 -> 8192 bytes
-rw-r--r--net/data/cache_tests/remove_tail3/indexbin262208 -> 262512 bytes
-rw-r--r--net/disk_cache/backend_impl.cc4
-rw-r--r--net/disk_cache/backend_impl.h3
-rw-r--r--net/disk_cache/disk_format.h34
-rw-r--r--net/disk_cache/entry_impl.cc24
-rw-r--r--net/disk_cache/entry_impl.h14
-rw-r--r--net/disk_cache/entry_unittest.cc36
-rw-r--r--net/disk_cache/mem_entry_impl.cc13
-rw-r--r--net/disk_cache/mem_entry_impl.h8
-rw-r--r--net/disk_cache/rankings.cc76
-rw-r--r--net/disk_cache/rankings.h10
-rw-r--r--net/tools/dump_cache/dump_files.cc18
-rw-r--r--net/tools/dump_cache/upgrade.cc2
140 files changed, 527 insertions, 75 deletions
diff --git a/net/data/cache_tests/bad_entry/contents.txt b/net/data/cache_tests/bad_entry/contents.txt
new file mode 100644
index 0000000..cffac69
--- /dev/null
+++ b/net/data/cache_tests/bad_entry/contents.txt
@@ -0,0 +1,66 @@
+Index header:
+num_entries: 2
+num_bytes: 27
+this_id: 1
+table_len: 64k
+
+head: 0x90000001
+tail: 0x90000000
+
+Address: 0xa0010002
+Address: 0xa0010003
+
+-------------------------------
+
+entry:
+Address: 0xa0010002
+hash: 0x687d1422
+next: 0
+rankings_node: 0x90000000
+key_len: 13
+long_key: 0
+data_size: 0's
+data_addr: 0's
+key: "the first key"
+
+rankings:
+Address: 0x90000000
+next: 0x90000000
+prev: 0x90000001
+contents: 0xa0010002
+dirty: 0
+pointer: 0
+
+-------------------------------
+
+entry:
+Address: 0xa0010003
+hash: 0x63909ecb
+next: 0
+rankings_node: 0x00000000 <---- Wrong
+key_len: 14
+long_key: 0
+data_size: 0's
+data_addr: 0's
+key: "some other key"
+
+rankings:
+Address: 0x90000001
+next: 0x90000000
+prev: 0x90000001
+contents: 0xa0010003
+dirty: 0
+pointer: 0
+
+================================
+
+Generated with:
+
+disk_cache::Entry *entry;
+ASSERT_TRUE(cache_->CreateEntry("the first key", &entry));
+entry->Close();
+
+ASSERT_TRUE(cache_->CreateEntry("some other key", &entry)); <---- Edit value*
+entry->Close();
+
+* Edit the value with the debugger before it is saved to disk. \ No newline at end of file
diff --git a/net/data/cache_tests/bad_entry/data_0 b/net/data/cache_tests/bad_entry/data_0
index a746b99..f7cb129 100644
--- a/net/data/cache_tests/bad_entry/data_0
+++ b/net/data/cache_tests/bad_entry/data_0
Binary files differ
diff --git a/net/data/cache_tests/bad_entry/data_1 b/net/data/cache_tests/bad_entry/data_1
index 951df12..ccf2842 100644
--- a/net/data/cache_tests/bad_entry/data_1
+++ b/net/data/cache_tests/bad_entry/data_1
Binary files differ
diff --git a/net/data/cache_tests/bad_entry/data_2 b/net/data/cache_tests/bad_entry/data_2
index 5b34782..c7e2eb9 100644
--- a/net/data/cache_tests/bad_entry/data_2
+++ b/net/data/cache_tests/bad_entry/data_2
Binary files differ
diff --git a/net/data/cache_tests/bad_entry/data_3 b/net/data/cache_tests/bad_entry/data_3
index de8e29f..5eec973 100644
--- a/net/data/cache_tests/bad_entry/data_3
+++ b/net/data/cache_tests/bad_entry/data_3
Binary files differ
diff --git a/net/data/cache_tests/bad_entry/index b/net/data/cache_tests/bad_entry/index
index c10a3d3..609cb00 100644
--- a/net/data/cache_tests/bad_entry/index
+++ b/net/data/cache_tests/bad_entry/index
Binary files differ
diff --git a/net/data/cache_tests/bad_rankings/contents.txt b/net/data/cache_tests/bad_rankings/contents.txt
new file mode 100644
index 0000000..a949728
--- /dev/null
+++ b/net/data/cache_tests/bad_rankings/contents.txt
@@ -0,0 +1,66 @@
+Index header:
+num_entries: 2
+num_bytes: 27
+this_id: 1
+table_len: 64k
+
+head: 0x90000001
+tail: 0x90000000
+
+Address: 0xa0010002
+Address: 0xa0010003
+
+-------------------------------
+
+entry:
+Address: 0xa0010002
+hash: 0x687d1422
+next: 0
+rankings_node: 0x90000000
+key_len: 13
+long_key: 0
+data_size: 0's
+data_addr: 0's
+key: "the first key"
+
+rankings:
+Address: 0x90000000
+next: 0x90000000
+prev: 0 <------ wrong
+contents: 0xa0010002
+dirty: 0
+pointer: 0
+
+-------------------------------
+
+entry:
+Address: 0xa0010003
+hash: 0x63909ecb
+next: 0
+rankings_node: 0x90000001
+key_len: 14
+long_key: 0
+data_size: 0's
+data_addr: 0's
+key: "some other key"
+
+rankings:
+Address: 0x90000001
+next: 0x90000000
+prev: 0x90000001
+contents: 0xa0010003
+dirty: 0
+pointer: 0
+
+================================
+
+Generated with:
+
+disk_cache::Entry *entry;
+ASSERT_TRUE(cache_->CreateEntry("the first key", &entry));
+entry->Close();
+
+ASSERT_TRUE(cache_->CreateEntry("some other key", &entry)); <---- Edit value*
+entry->Close();
+
+* Edit the value with the debugger before it is saved to disk. \ No newline at end of file
diff --git a/net/data/cache_tests/bad_rankings/data_0 b/net/data/cache_tests/bad_rankings/data_0
index e0a8032..40f6076 100644
--- a/net/data/cache_tests/bad_rankings/data_0
+++ b/net/data/cache_tests/bad_rankings/data_0
Binary files differ
diff --git a/net/data/cache_tests/bad_rankings/data_1 b/net/data/cache_tests/bad_rankings/data_1
index ae9d564..c38c412 100644
--- a/net/data/cache_tests/bad_rankings/data_1
+++ b/net/data/cache_tests/bad_rankings/data_1
Binary files differ
diff --git a/net/data/cache_tests/bad_rankings/data_2 b/net/data/cache_tests/bad_rankings/data_2
index 5b34782..c7e2eb9 100644
--- a/net/data/cache_tests/bad_rankings/data_2
+++ b/net/data/cache_tests/bad_rankings/data_2
Binary files differ
diff --git a/net/data/cache_tests/bad_rankings/data_3 b/net/data/cache_tests/bad_rankings/data_3
index de8e29f..5eec973 100644
--- a/net/data/cache_tests/bad_rankings/data_3
+++ b/net/data/cache_tests/bad_rankings/data_3
Binary files differ
diff --git a/net/data/cache_tests/bad_rankings/index b/net/data/cache_tests/bad_rankings/index
index c10a3d3..609cb00 100644
--- a/net/data/cache_tests/bad_rankings/index
+++ b/net/data/cache_tests/bad_rankings/index
Binary files differ
diff --git a/net/data/cache_tests/insert_empty1/data_0 b/net/data/cache_tests/insert_empty1/data_0
index cbb785e..9ef058e 100644
--- a/net/data/cache_tests/insert_empty1/data_0
+++ b/net/data/cache_tests/insert_empty1/data_0
Binary files differ
diff --git a/net/data/cache_tests/insert_empty1/data_1 b/net/data/cache_tests/insert_empty1/data_1
index 72b82f2..a12b7ae 100644
--- a/net/data/cache_tests/insert_empty1/data_1
+++ b/net/data/cache_tests/insert_empty1/data_1
Binary files differ
diff --git a/net/data/cache_tests/insert_empty1/data_2 b/net/data/cache_tests/insert_empty1/data_2
index 5b34782..c7e2eb9 100644
--- a/net/data/cache_tests/insert_empty1/data_2
+++ b/net/data/cache_tests/insert_empty1/data_2
Binary files differ
diff --git a/net/data/cache_tests/insert_empty1/data_3 b/net/data/cache_tests/insert_empty1/data_3
index de8e29f..5eec973 100644
--- a/net/data/cache_tests/insert_empty1/data_3
+++ b/net/data/cache_tests/insert_empty1/data_3
Binary files differ
diff --git a/net/data/cache_tests/insert_empty1/index b/net/data/cache_tests/insert_empty1/index
index a26139a..581f312 100644
--- a/net/data/cache_tests/insert_empty1/index
+++ b/net/data/cache_tests/insert_empty1/index
Binary files differ
diff --git a/net/data/cache_tests/insert_empty2/data_0 b/net/data/cache_tests/insert_empty2/data_0
index 20f5c30..1347215 100644
--- a/net/data/cache_tests/insert_empty2/data_0
+++ b/net/data/cache_tests/insert_empty2/data_0
Binary files differ
diff --git a/net/data/cache_tests/insert_empty2/data_1 b/net/data/cache_tests/insert_empty2/data_1
index 72b82f2..0b627ed 100644
--- a/net/data/cache_tests/insert_empty2/data_1
+++ b/net/data/cache_tests/insert_empty2/data_1
Binary files differ
diff --git a/net/data/cache_tests/insert_empty2/data_2 b/net/data/cache_tests/insert_empty2/data_2
index 5b34782..c7e2eb9 100644
--- a/net/data/cache_tests/insert_empty2/data_2
+++ b/net/data/cache_tests/insert_empty2/data_2
Binary files differ
diff --git a/net/data/cache_tests/insert_empty2/data_3 b/net/data/cache_tests/insert_empty2/data_3
index de8e29f..5eec973 100644
--- a/net/data/cache_tests/insert_empty2/data_3
+++ b/net/data/cache_tests/insert_empty2/data_3
Binary files differ
diff --git a/net/data/cache_tests/insert_empty2/index b/net/data/cache_tests/insert_empty2/index
index a26139a..581f312 100644
--- a/net/data/cache_tests/insert_empty2/index
+++ b/net/data/cache_tests/insert_empty2/index
Binary files differ
diff --git a/net/data/cache_tests/insert_empty3/data_0 b/net/data/cache_tests/insert_empty3/data_0
index 187d64f..6cd3e9f 100644
--- a/net/data/cache_tests/insert_empty3/data_0
+++ b/net/data/cache_tests/insert_empty3/data_0
Binary files differ
diff --git a/net/data/cache_tests/insert_empty3/data_1 b/net/data/cache_tests/insert_empty3/data_1
index 72b82f2..ea645be 100644
--- a/net/data/cache_tests/insert_empty3/data_1
+++ b/net/data/cache_tests/insert_empty3/data_1
Binary files differ
diff --git a/net/data/cache_tests/insert_empty3/data_2 b/net/data/cache_tests/insert_empty3/data_2
index 5b34782..c7e2eb9 100644
--- a/net/data/cache_tests/insert_empty3/data_2
+++ b/net/data/cache_tests/insert_empty3/data_2
Binary files differ
diff --git a/net/data/cache_tests/insert_empty3/data_3 b/net/data/cache_tests/insert_empty3/data_3
index de8e29f..5eec973 100644
--- a/net/data/cache_tests/insert_empty3/data_3
+++ b/net/data/cache_tests/insert_empty3/data_3
Binary files differ
diff --git a/net/data/cache_tests/insert_empty3/index b/net/data/cache_tests/insert_empty3/index
index a26139a..f60fc84 100644
--- a/net/data/cache_tests/insert_empty3/index
+++ b/net/data/cache_tests/insert_empty3/index
Binary files differ
diff --git a/net/data/cache_tests/insert_load1/data_0 b/net/data/cache_tests/insert_load1/data_0
index 9ded89b..6817d7c 100644
--- a/net/data/cache_tests/insert_load1/data_0
+++ b/net/data/cache_tests/insert_load1/data_0
Binary files differ
diff --git a/net/data/cache_tests/insert_load1/data_1 b/net/data/cache_tests/insert_load1/data_1
index 12d8b90..34f5ad9 100644
--- a/net/data/cache_tests/insert_load1/data_1
+++ b/net/data/cache_tests/insert_load1/data_1
Binary files differ
diff --git a/net/data/cache_tests/insert_load1/data_2 b/net/data/cache_tests/insert_load1/data_2
index 5b34782..c7e2eb9 100644
--- a/net/data/cache_tests/insert_load1/data_2
+++ b/net/data/cache_tests/insert_load1/data_2
Binary files differ
diff --git a/net/data/cache_tests/insert_load1/data_3 b/net/data/cache_tests/insert_load1/data_3
index de8e29f..5eec973 100644
--- a/net/data/cache_tests/insert_load1/data_3
+++ b/net/data/cache_tests/insert_load1/data_3
Binary files differ
diff --git a/net/data/cache_tests/insert_load1/index b/net/data/cache_tests/insert_load1/index
index 5d2384f..c61c008 100644
--- a/net/data/cache_tests/insert_load1/index
+++ b/net/data/cache_tests/insert_load1/index
Binary files differ
diff --git a/net/data/cache_tests/insert_load2/data_0 b/net/data/cache_tests/insert_load2/data_0
index 3b3c57a..f3f7c25 100644
--- a/net/data/cache_tests/insert_load2/data_0
+++ b/net/data/cache_tests/insert_load2/data_0
Binary files differ
diff --git a/net/data/cache_tests/insert_load2/data_1 b/net/data/cache_tests/insert_load2/data_1
index 16a8d5e..0f2d09f 100644
--- a/net/data/cache_tests/insert_load2/data_1
+++ b/net/data/cache_tests/insert_load2/data_1
Binary files differ
diff --git a/net/data/cache_tests/insert_load2/data_2 b/net/data/cache_tests/insert_load2/data_2
index 5b34782..c7e2eb9 100644
--- a/net/data/cache_tests/insert_load2/data_2
+++ b/net/data/cache_tests/insert_load2/data_2
Binary files differ
diff --git a/net/data/cache_tests/insert_load2/data_3 b/net/data/cache_tests/insert_load2/data_3
index de8e29f..5eec973 100644
--- a/net/data/cache_tests/insert_load2/data_3
+++ b/net/data/cache_tests/insert_load2/data_3
Binary files differ
diff --git a/net/data/cache_tests/insert_load2/index b/net/data/cache_tests/insert_load2/index
index 203405a..d8f7a85 100644
--- a/net/data/cache_tests/insert_load2/index
+++ b/net/data/cache_tests/insert_load2/index
Binary files differ
diff --git a/net/data/cache_tests/insert_one1/data_0 b/net/data/cache_tests/insert_one1/data_0
index a5476b3..1bc3968 100644
--- a/net/data/cache_tests/insert_one1/data_0
+++ b/net/data/cache_tests/insert_one1/data_0
Binary files differ
diff --git a/net/data/cache_tests/insert_one1/data_1 b/net/data/cache_tests/insert_one1/data_1
index b59d85b..ca03c06e 100644
--- a/net/data/cache_tests/insert_one1/data_1
+++ b/net/data/cache_tests/insert_one1/data_1
Binary files differ
diff --git a/net/data/cache_tests/insert_one1/data_2 b/net/data/cache_tests/insert_one1/data_2
index 5b34782..c7e2eb9 100644
--- a/net/data/cache_tests/insert_one1/data_2
+++ b/net/data/cache_tests/insert_one1/data_2
Binary files differ
diff --git a/net/data/cache_tests/insert_one1/data_3 b/net/data/cache_tests/insert_one1/data_3
index de8e29f..5eec973 100644
--- a/net/data/cache_tests/insert_one1/data_3
+++ b/net/data/cache_tests/insert_one1/data_3
Binary files differ
diff --git a/net/data/cache_tests/insert_one1/index b/net/data/cache_tests/insert_one1/index
index 8fc68b9..cf70c4e 100644
--- a/net/data/cache_tests/insert_one1/index
+++ b/net/data/cache_tests/insert_one1/index
Binary files differ
diff --git a/net/data/cache_tests/insert_one2/data_0 b/net/data/cache_tests/insert_one2/data_0
index c19f8f9..533d15e 100644
--- a/net/data/cache_tests/insert_one2/data_0
+++ b/net/data/cache_tests/insert_one2/data_0
Binary files differ
diff --git a/net/data/cache_tests/insert_one2/data_1 b/net/data/cache_tests/insert_one2/data_1
index b59d85b..38ec06f 100644
--- a/net/data/cache_tests/insert_one2/data_1
+++ b/net/data/cache_tests/insert_one2/data_1
Binary files differ
diff --git a/net/data/cache_tests/insert_one2/data_2 b/net/data/cache_tests/insert_one2/data_2
index 5b34782..c7e2eb9 100644
--- a/net/data/cache_tests/insert_one2/data_2
+++ b/net/data/cache_tests/insert_one2/data_2
Binary files differ
diff --git a/net/data/cache_tests/insert_one2/data_3 b/net/data/cache_tests/insert_one2/data_3
index de8e29f..5eec973 100644
--- a/net/data/cache_tests/insert_one2/data_3
+++ b/net/data/cache_tests/insert_one2/data_3
Binary files differ
diff --git a/net/data/cache_tests/insert_one2/index b/net/data/cache_tests/insert_one2/index
index 8fc68b9..cf70c4e 100644
--- a/net/data/cache_tests/insert_one2/index
+++ b/net/data/cache_tests/insert_one2/index
Binary files differ
diff --git a/net/data/cache_tests/insert_one3/data_0 b/net/data/cache_tests/insert_one3/data_0
index c52ee67..c03b617 100644
--- a/net/data/cache_tests/insert_one3/data_0
+++ b/net/data/cache_tests/insert_one3/data_0
Binary files differ
diff --git a/net/data/cache_tests/insert_one3/data_1 b/net/data/cache_tests/insert_one3/data_1
index b59d85b..61db1be 100644
--- a/net/data/cache_tests/insert_one3/data_1
+++ b/net/data/cache_tests/insert_one3/data_1
Binary files differ
diff --git a/net/data/cache_tests/insert_one3/data_2 b/net/data/cache_tests/insert_one3/data_2
index 5b34782..c7e2eb9 100644
--- a/net/data/cache_tests/insert_one3/data_2
+++ b/net/data/cache_tests/insert_one3/data_2
Binary files differ
diff --git a/net/data/cache_tests/insert_one3/data_3 b/net/data/cache_tests/insert_one3/data_3
index de8e29f..5eec973 100644
--- a/net/data/cache_tests/insert_one3/data_3
+++ b/net/data/cache_tests/insert_one3/data_3
Binary files differ
diff --git a/net/data/cache_tests/insert_one3/index b/net/data/cache_tests/insert_one3/index
index 8fc68b9..cea43e6 100644
--- a/net/data/cache_tests/insert_one3/index
+++ b/net/data/cache_tests/insert_one3/index
Binary files differ
diff --git a/net/data/cache_tests/list_loop/contents.txt b/net/data/cache_tests/list_loop/contents.txt
new file mode 100644
index 0000000..fb58b14
--- /dev/null
+++ b/net/data/cache_tests/list_loop/contents.txt
@@ -0,0 +1,228 @@
+Index header:
+num_entries: 8
+num_bytes: 52
+this_id: 1
+table_len: 64k
+
+head: 0x90000004
+tail: 0x90000000
+
+Address: 0xa0010007
+Address: 0xa0010003
+Address: 0xa001000b
+Address: 0xa001000a
+Address: 0xa0010009
+Address: 0xa0010006
+Address: 0xa0010005
+Address: 0xa0010002
+
+
+-------------------------------
+
+entry:
+Address: 0xa0010007
+hash: 0xcb30d119
+next: 0
+rankings_node: 0x90000004
+key_len: 5
+long_key: 0
+data_size[0]: 4
+data_addr[0]: 0xa0010008
+key: "fifth"
+
+rankings:
+Address: 0x90000004
+next: 0x90000001
+prev: 0x90000004
+contents: 0xa0010007
+dirty: 0
+pointer: 0
+
+-------------------------------
+
+entry:
+Address: 0xa0010003
+hash: 0x090fbce3
+next: 0
+rankings_node: 0x90000001
+key_len: 6
+long_key: 0
+data_size[0]: 4
+data_addr[0]: 0xa0010004
+key: "second"
+
+rankings:
+Address: 0x90000001
+next: 0x90000007
+prev: 0x90000004
+contents: 0xa0010003
+dirty: 0
+pointer: 0
+
+-------------------------------
+
+entry:
+Address: 0xa001000b
+hash: 0xad80b702
+next: 0
+rankings_node: 0x90000007
+key_len: 5
+long_key: 0
+data_size: 0's
+data_addr: 0's
+key: "eight"
+
+rankings:
+Address: 0x90000007
+next: 0x90000006
+prev: 0x90000001
+contents: 0xa001000b
+dirty: 0
+pointer: 0
+
+-------------------------------
+
+entry:
+Address: 0xa001000a
+hash: 0xfdae1d2a
+next: 0
+rankings_node: 0x90000006
+key_len: 7
+long_key: 0
+data_size: 0's
+data_addr: 0's
+key: "seventh"
+
+rankings:
+Address: 0x90000006
+next: 0x90000005
+prev: 0x90000007
+contents: 0xa001000a
+dirty: 0
+pointer: 0
+
+-------------------------------
+
+entry:
+Address: 0xa0010009
+hash: 0x2129e026
+next: 0
+rankings_node: 0x90000005
+key_len: 5
+long_key: 0
+data_size: 0's
+data_addr: 0's
+key: "sixth"
+
+rankings:
+Address: 0x90000005
+next: 0x90000003
+prev: 0x90000006
+contents: 0xa0010009
+dirty: 0
+pointer: 0
+
+-------------------------------
+
+entry:
+Address: 0xa0010006
+hash: 0x3d9011cc
+next: 0
+rankings_node: 0x90000003
+key_len: 6
+long_key: 0
+data_size: 0's
+data_addr: 0's
+key: "fourth"
+
+rankings:
+Address: 0x90000003
+next: 0x90000002
+prev: 0x90000005
+contents: 0xa0010006
+dirty: 0
+pointer: 0
+
+-------------------------------
+
+entry:
+Address: 0xa0010005
+hash: 0x8f04b77c
+next: 0
+rankings_node: 0x90000002
+key_len: 5
+long_key: 0
+data_size: 0's
+data_addr: 0's
+key: "third"
+
+rankings:
+Address: 0x90000002
+next: 0x90000001 <--------- wrong
+prev: 0x90000003
+contents: 0xa0010005
+dirty: 0
+pointer: 0
+
+-------------------------------
+
+entry:
+Address: 0xa0010002
+hash: 0x0138974a
+next: 0
+rankings_node: 0x90000000
+key_len: 5
+long_key: 0
+data_size: 0's
+data_addr: 0's
+key: "first"
+
+rankings:
+Address: 0x90000000
+next: 0x90000000
+prev: 0x90000002
+contents: 0xa0010002
+dirty: 0
+pointer: 0
+
+==============================
+
+Generated with:
+
+disk_cache::Entry *entry;
+ASSERT_TRUE(cache_->CreateEntry("first", &entry));
+entry->Close();
+
+char buffer[] = "abcd";
+ASSERT_TRUE(cache_->CreateEntry("second", &entry));
+entry->WriteData(0, 0, buffer, 4, NULL, false);
+entry->Close();
+
+ASSERT_TRUE(cache_->CreateEntry("third", &entry));
+entry->Close();
+
+ASSERT_TRUE(cache_->CreateEntry("fourth", &entry));
+entry->Close();
+
+ASSERT_TRUE(cache_->CreateEntry("fifth", &entry));
+entry->WriteData(0, 0, buffer, 4, NULL, false);
+entry->Close();
+
+ASSERT_TRUE(cache_->CreateEntry("sixth", &entry));
+entry->Close();
+
+ASSERT_TRUE(cache_->CreateEntry("seventh", &entry));
+entry->Close();
+
+ASSERT_TRUE(cache_->CreateEntry("eight", &entry));
+entry->Close();
+
+ASSERT_TRUE(cache_->OpenEntry("second", &entry));
+entry->ReadData(0, 0, buffer, 4, NULL); <--- fix the values*
+entry->Close();
+
+ASSERT_TRUE(cache_->OpenEntry("fifth", &entry));
+entry->ReadData(0, 0, buffer, 4, NULL);
+entry->Close();
+
+* break on Rankings::Remove() and edit the values before they are saved. \ No newline at end of file
diff --git a/net/data/cache_tests/list_loop/data_0 b/net/data/cache_tests/list_loop/data_0
index 308e8f2..6bf0533 100644
--- a/net/data/cache_tests/list_loop/data_0
+++ b/net/data/cache_tests/list_loop/data_0
Binary files differ
diff --git a/net/data/cache_tests/list_loop/data_1 b/net/data/cache_tests/list_loop/data_1
index 7fc6323..32244ab 100644
--- a/net/data/cache_tests/list_loop/data_1
+++ b/net/data/cache_tests/list_loop/data_1
Binary files differ
diff --git a/net/data/cache_tests/list_loop/data_2 b/net/data/cache_tests/list_loop/data_2
index 5b34782..c7e2eb9 100644
--- a/net/data/cache_tests/list_loop/data_2
+++ b/net/data/cache_tests/list_loop/data_2
Binary files differ
diff --git a/net/data/cache_tests/list_loop/data_3 b/net/data/cache_tests/list_loop/data_3
index de8e29f..5eec973 100644
--- a/net/data/cache_tests/list_loop/data_3
+++ b/net/data/cache_tests/list_loop/data_3
Binary files differ
diff --git a/net/data/cache_tests/list_loop/index b/net/data/cache_tests/list_loop/index
index 1415154..32acaf8 100644
--- a/net/data/cache_tests/list_loop/index
+++ b/net/data/cache_tests/list_loop/index
Binary files differ
diff --git a/net/data/cache_tests/remove_head1/data_0 b/net/data/cache_tests/remove_head1/data_0
index 705a7c0..294a460 100644
--- a/net/data/cache_tests/remove_head1/data_0
+++ b/net/data/cache_tests/remove_head1/data_0
Binary files differ
diff --git a/net/data/cache_tests/remove_head1/data_1 b/net/data/cache_tests/remove_head1/data_1
index b59d85b..c6aaf51 100644
--- a/net/data/cache_tests/remove_head1/data_1
+++ b/net/data/cache_tests/remove_head1/data_1
Binary files differ
diff --git a/net/data/cache_tests/remove_head1/data_2 b/net/data/cache_tests/remove_head1/data_2
index 5b34782..c7e2eb9 100644
--- a/net/data/cache_tests/remove_head1/data_2
+++ b/net/data/cache_tests/remove_head1/data_2
Binary files differ
diff --git a/net/data/cache_tests/remove_head1/data_3 b/net/data/cache_tests/remove_head1/data_3
index de8e29f..5eec973 100644
--- a/net/data/cache_tests/remove_head1/data_3
+++ b/net/data/cache_tests/remove_head1/data_3
Binary files differ
diff --git a/net/data/cache_tests/remove_head1/index b/net/data/cache_tests/remove_head1/index
index 64b93ce..401c046 100644
--- a/net/data/cache_tests/remove_head1/index
+++ b/net/data/cache_tests/remove_head1/index
Binary files differ
diff --git a/net/data/cache_tests/remove_head2/data_0 b/net/data/cache_tests/remove_head2/data_0
index 0baf18c..a024649 100644
--- a/net/data/cache_tests/remove_head2/data_0
+++ b/net/data/cache_tests/remove_head2/data_0
Binary files differ
diff --git a/net/data/cache_tests/remove_head2/data_1 b/net/data/cache_tests/remove_head2/data_1
index b59d85b..f8556ef 100644
--- a/net/data/cache_tests/remove_head2/data_1
+++ b/net/data/cache_tests/remove_head2/data_1
Binary files differ
diff --git a/net/data/cache_tests/remove_head2/data_2 b/net/data/cache_tests/remove_head2/data_2
index 5b34782..c7e2eb9 100644
--- a/net/data/cache_tests/remove_head2/data_2
+++ b/net/data/cache_tests/remove_head2/data_2
Binary files differ
diff --git a/net/data/cache_tests/remove_head2/data_3 b/net/data/cache_tests/remove_head2/data_3
index de8e29f..5eec973 100644
--- a/net/data/cache_tests/remove_head2/data_3
+++ b/net/data/cache_tests/remove_head2/data_3
Binary files differ
diff --git a/net/data/cache_tests/remove_head2/index b/net/data/cache_tests/remove_head2/index
index 64b93ce..461c261 100644
--- a/net/data/cache_tests/remove_head2/index
+++ b/net/data/cache_tests/remove_head2/index
Binary files differ
diff --git a/net/data/cache_tests/remove_head3/data_0 b/net/data/cache_tests/remove_head3/data_0
index 2922728..578903e 100644
--- a/net/data/cache_tests/remove_head3/data_0
+++ b/net/data/cache_tests/remove_head3/data_0
Binary files differ
diff --git a/net/data/cache_tests/remove_head3/data_1 b/net/data/cache_tests/remove_head3/data_1
index b59d85b..3454dab 100644
--- a/net/data/cache_tests/remove_head3/data_1
+++ b/net/data/cache_tests/remove_head3/data_1
Binary files differ
diff --git a/net/data/cache_tests/remove_head3/data_2 b/net/data/cache_tests/remove_head3/data_2
index 5b34782..c7e2eb9 100644
--- a/net/data/cache_tests/remove_head3/data_2
+++ b/net/data/cache_tests/remove_head3/data_2
Binary files differ
diff --git a/net/data/cache_tests/remove_head3/data_3 b/net/data/cache_tests/remove_head3/data_3
index de8e29f..5eec973 100644
--- a/net/data/cache_tests/remove_head3/data_3
+++ b/net/data/cache_tests/remove_head3/data_3
Binary files differ
diff --git a/net/data/cache_tests/remove_head3/index b/net/data/cache_tests/remove_head3/index
index 64b93ce..461c261 100644
--- a/net/data/cache_tests/remove_head3/index
+++ b/net/data/cache_tests/remove_head3/index
Binary files differ
diff --git a/net/data/cache_tests/remove_head4/data_0 b/net/data/cache_tests/remove_head4/data_0
index 0f8f735..68eee38 100644
--- a/net/data/cache_tests/remove_head4/data_0
+++ b/net/data/cache_tests/remove_head4/data_0
Binary files differ
diff --git a/net/data/cache_tests/remove_head4/data_1 b/net/data/cache_tests/remove_head4/data_1
index b59d85b..bb6847b 100644
--- a/net/data/cache_tests/remove_head4/data_1
+++ b/net/data/cache_tests/remove_head4/data_1
Binary files differ
diff --git a/net/data/cache_tests/remove_head4/data_2 b/net/data/cache_tests/remove_head4/data_2
index 5b34782..c7e2eb9 100644
--- a/net/data/cache_tests/remove_head4/data_2
+++ b/net/data/cache_tests/remove_head4/data_2
Binary files differ
diff --git a/net/data/cache_tests/remove_head4/data_3 b/net/data/cache_tests/remove_head4/data_3
index de8e29f..5eec973 100644
--- a/net/data/cache_tests/remove_head4/data_3
+++ b/net/data/cache_tests/remove_head4/data_3
Binary files differ
diff --git a/net/data/cache_tests/remove_head4/index b/net/data/cache_tests/remove_head4/index
index 64b93ce..461c261 100644
--- a/net/data/cache_tests/remove_head4/index
+++ b/net/data/cache_tests/remove_head4/index
Binary files differ
diff --git a/net/data/cache_tests/remove_load1/data_0 b/net/data/cache_tests/remove_load1/data_0
index b2283fc..b44fb2a 100644
--- a/net/data/cache_tests/remove_load1/data_0
+++ b/net/data/cache_tests/remove_load1/data_0
Binary files differ
diff --git a/net/data/cache_tests/remove_load1/data_1 b/net/data/cache_tests/remove_load1/data_1
index 1fd9f30..c1a3f49 100644
--- a/net/data/cache_tests/remove_load1/data_1
+++ b/net/data/cache_tests/remove_load1/data_1
Binary files differ
diff --git a/net/data/cache_tests/remove_load1/data_2 b/net/data/cache_tests/remove_load1/data_2
index 5b34782..c7e2eb9 100644
--- a/net/data/cache_tests/remove_load1/data_2
+++ b/net/data/cache_tests/remove_load1/data_2
Binary files differ
diff --git a/net/data/cache_tests/remove_load1/data_3 b/net/data/cache_tests/remove_load1/data_3
index de8e29f..5eec973 100644
--- a/net/data/cache_tests/remove_load1/data_3
+++ b/net/data/cache_tests/remove_load1/data_3
Binary files differ
diff --git a/net/data/cache_tests/remove_load1/index b/net/data/cache_tests/remove_load1/index
index 00d45e8..9f84a51 100644
--- a/net/data/cache_tests/remove_load1/index
+++ b/net/data/cache_tests/remove_load1/index
Binary files differ
diff --git a/net/data/cache_tests/remove_load2/data_0 b/net/data/cache_tests/remove_load2/data_0
index 8229ee8..be92b70 100644
--- a/net/data/cache_tests/remove_load2/data_0
+++ b/net/data/cache_tests/remove_load2/data_0
Binary files differ
diff --git a/net/data/cache_tests/remove_load2/data_1 b/net/data/cache_tests/remove_load2/data_1
index dea2f55..7bbf64b 100644
--- a/net/data/cache_tests/remove_load2/data_1
+++ b/net/data/cache_tests/remove_load2/data_1
Binary files differ
diff --git a/net/data/cache_tests/remove_load2/data_2 b/net/data/cache_tests/remove_load2/data_2
index 5b34782..c7e2eb9 100644
--- a/net/data/cache_tests/remove_load2/data_2
+++ b/net/data/cache_tests/remove_load2/data_2
Binary files differ
diff --git a/net/data/cache_tests/remove_load2/data_3 b/net/data/cache_tests/remove_load2/data_3
index de8e29f..5eec973 100644
--- a/net/data/cache_tests/remove_load2/data_3
+++ b/net/data/cache_tests/remove_load2/data_3
Binary files differ
diff --git a/net/data/cache_tests/remove_load2/index b/net/data/cache_tests/remove_load2/index
index 6d42289..153af0a 100644
--- a/net/data/cache_tests/remove_load2/index
+++ b/net/data/cache_tests/remove_load2/index
Binary files differ
diff --git a/net/data/cache_tests/remove_load3/data_0 b/net/data/cache_tests/remove_load3/data_0
index 67567aa..1407e2a 100644
--- a/net/data/cache_tests/remove_load3/data_0
+++ b/net/data/cache_tests/remove_load3/data_0
Binary files differ
diff --git a/net/data/cache_tests/remove_load3/data_1 b/net/data/cache_tests/remove_load3/data_1
index f793108..f18ae1d 100644
--- a/net/data/cache_tests/remove_load3/data_1
+++ b/net/data/cache_tests/remove_load3/data_1
Binary files differ
diff --git a/net/data/cache_tests/remove_load3/data_2 b/net/data/cache_tests/remove_load3/data_2
index 5b34782..c7e2eb9 100644
--- a/net/data/cache_tests/remove_load3/data_2
+++ b/net/data/cache_tests/remove_load3/data_2
Binary files differ
diff --git a/net/data/cache_tests/remove_load3/data_3 b/net/data/cache_tests/remove_load3/data_3
index de8e29f..5eec973 100644
--- a/net/data/cache_tests/remove_load3/data_3
+++ b/net/data/cache_tests/remove_load3/data_3
Binary files differ
diff --git a/net/data/cache_tests/remove_load3/index b/net/data/cache_tests/remove_load3/index
index 2d17d55..89a4c83 100644
--- a/net/data/cache_tests/remove_load3/index
+++ b/net/data/cache_tests/remove_load3/index
Binary files differ
diff --git a/net/data/cache_tests/remove_one1/data_0 b/net/data/cache_tests/remove_one1/data_0
index aafc926..79f9b76 100644
--- a/net/data/cache_tests/remove_one1/data_0
+++ b/net/data/cache_tests/remove_one1/data_0
Binary files differ
diff --git a/net/data/cache_tests/remove_one1/data_1 b/net/data/cache_tests/remove_one1/data_1
index 72b82f2..f5d4345 100644
--- a/net/data/cache_tests/remove_one1/data_1
+++ b/net/data/cache_tests/remove_one1/data_1
Binary files differ
diff --git a/net/data/cache_tests/remove_one1/data_2 b/net/data/cache_tests/remove_one1/data_2
index 5b34782..c7e2eb9 100644
--- a/net/data/cache_tests/remove_one1/data_2
+++ b/net/data/cache_tests/remove_one1/data_2
Binary files differ
diff --git a/net/data/cache_tests/remove_one1/data_3 b/net/data/cache_tests/remove_one1/data_3
index de8e29f..5eec973 100644
--- a/net/data/cache_tests/remove_one1/data_3
+++ b/net/data/cache_tests/remove_one1/data_3
Binary files differ
diff --git a/net/data/cache_tests/remove_one1/index b/net/data/cache_tests/remove_one1/index
index 1a9488d..2c632fe 100644
--- a/net/data/cache_tests/remove_one1/index
+++ b/net/data/cache_tests/remove_one1/index
Binary files differ
diff --git a/net/data/cache_tests/remove_one2/data_0 b/net/data/cache_tests/remove_one2/data_0
index ce16041..0b38cfb 100644
--- a/net/data/cache_tests/remove_one2/data_0
+++ b/net/data/cache_tests/remove_one2/data_0
Binary files differ
diff --git a/net/data/cache_tests/remove_one2/data_1 b/net/data/cache_tests/remove_one2/data_1
index 72b82f2..2eb52ab 100644
--- a/net/data/cache_tests/remove_one2/data_1
+++ b/net/data/cache_tests/remove_one2/data_1
Binary files differ
diff --git a/net/data/cache_tests/remove_one2/data_2 b/net/data/cache_tests/remove_one2/data_2
index 5b34782..c7e2eb9 100644
--- a/net/data/cache_tests/remove_one2/data_2
+++ b/net/data/cache_tests/remove_one2/data_2
Binary files differ
diff --git a/net/data/cache_tests/remove_one2/data_3 b/net/data/cache_tests/remove_one2/data_3
index de8e29f..5eec973 100644
--- a/net/data/cache_tests/remove_one2/data_3
+++ b/net/data/cache_tests/remove_one2/data_3
Binary files differ
diff --git a/net/data/cache_tests/remove_one2/index b/net/data/cache_tests/remove_one2/index
index 1a9488d..7f0daae 100644
--- a/net/data/cache_tests/remove_one2/index
+++ b/net/data/cache_tests/remove_one2/index
Binary files differ
diff --git a/net/data/cache_tests/remove_one3/data_0 b/net/data/cache_tests/remove_one3/data_0
index 5790b9c..4b74a31 100644
--- a/net/data/cache_tests/remove_one3/data_0
+++ b/net/data/cache_tests/remove_one3/data_0
Binary files differ
diff --git a/net/data/cache_tests/remove_one3/data_1 b/net/data/cache_tests/remove_one3/data_1
index 72b82f2..ff003e0 100644
--- a/net/data/cache_tests/remove_one3/data_1
+++ b/net/data/cache_tests/remove_one3/data_1
Binary files differ
diff --git a/net/data/cache_tests/remove_one3/data_2 b/net/data/cache_tests/remove_one3/data_2
index 5b34782..c7e2eb9 100644
--- a/net/data/cache_tests/remove_one3/data_2
+++ b/net/data/cache_tests/remove_one3/data_2
Binary files differ
diff --git a/net/data/cache_tests/remove_one3/data_3 b/net/data/cache_tests/remove_one3/data_3
index de8e29f..5eec973 100644
--- a/net/data/cache_tests/remove_one3/data_3
+++ b/net/data/cache_tests/remove_one3/data_3
Binary files differ
diff --git a/net/data/cache_tests/remove_one3/index b/net/data/cache_tests/remove_one3/index
index 1a9488d..6cb2e3f 100644
--- a/net/data/cache_tests/remove_one3/index
+++ b/net/data/cache_tests/remove_one3/index
Binary files differ
diff --git a/net/data/cache_tests/remove_one4/data_0 b/net/data/cache_tests/remove_one4/data_0
index b9d3270..6a38aa4 100644
--- a/net/data/cache_tests/remove_one4/data_0
+++ b/net/data/cache_tests/remove_one4/data_0
Binary files differ
diff --git a/net/data/cache_tests/remove_one4/data_1 b/net/data/cache_tests/remove_one4/data_1
index 72b82f2..a51de3e 100644
--- a/net/data/cache_tests/remove_one4/data_1
+++ b/net/data/cache_tests/remove_one4/data_1
Binary files differ
diff --git a/net/data/cache_tests/remove_one4/data_2 b/net/data/cache_tests/remove_one4/data_2
index 5b34782..c7e2eb9 100644
--- a/net/data/cache_tests/remove_one4/data_2
+++ b/net/data/cache_tests/remove_one4/data_2
Binary files differ
diff --git a/net/data/cache_tests/remove_one4/data_3 b/net/data/cache_tests/remove_one4/data_3
index de8e29f..5eec973 100644
--- a/net/data/cache_tests/remove_one4/data_3
+++ b/net/data/cache_tests/remove_one4/data_3
Binary files differ
diff --git a/net/data/cache_tests/remove_one4/index b/net/data/cache_tests/remove_one4/index
index 1a9488d..6cb2e3f 100644
--- a/net/data/cache_tests/remove_one4/index
+++ b/net/data/cache_tests/remove_one4/index
Binary files differ
diff --git a/net/data/cache_tests/remove_tail1/data_0 b/net/data/cache_tests/remove_tail1/data_0
index d8aadc2..e5858df 100644
--- a/net/data/cache_tests/remove_tail1/data_0
+++ b/net/data/cache_tests/remove_tail1/data_0
Binary files differ
diff --git a/net/data/cache_tests/remove_tail1/data_1 b/net/data/cache_tests/remove_tail1/data_1
index 7c00477..6e481cb 100644
--- a/net/data/cache_tests/remove_tail1/data_1
+++ b/net/data/cache_tests/remove_tail1/data_1
Binary files differ
diff --git a/net/data/cache_tests/remove_tail1/data_2 b/net/data/cache_tests/remove_tail1/data_2
index 5b34782..c7e2eb9 100644
--- a/net/data/cache_tests/remove_tail1/data_2
+++ b/net/data/cache_tests/remove_tail1/data_2
Binary files differ
diff --git a/net/data/cache_tests/remove_tail1/data_3 b/net/data/cache_tests/remove_tail1/data_3
index de8e29f..5eec973 100644
--- a/net/data/cache_tests/remove_tail1/data_3
+++ b/net/data/cache_tests/remove_tail1/data_3
Binary files differ
diff --git a/net/data/cache_tests/remove_tail1/index b/net/data/cache_tests/remove_tail1/index
index e68e6f3..e781189 100644
--- a/net/data/cache_tests/remove_tail1/index
+++ b/net/data/cache_tests/remove_tail1/index
Binary files differ
diff --git a/net/data/cache_tests/remove_tail2/data_0 b/net/data/cache_tests/remove_tail2/data_0
index e21acd2..fcdc25b 100644
--- a/net/data/cache_tests/remove_tail2/data_0
+++ b/net/data/cache_tests/remove_tail2/data_0
Binary files differ
diff --git a/net/data/cache_tests/remove_tail2/data_1 b/net/data/cache_tests/remove_tail2/data_1
index 7c00477..bd2772e 100644
--- a/net/data/cache_tests/remove_tail2/data_1
+++ b/net/data/cache_tests/remove_tail2/data_1
Binary files differ
diff --git a/net/data/cache_tests/remove_tail2/data_2 b/net/data/cache_tests/remove_tail2/data_2
index 5b34782..c7e2eb9 100644
--- a/net/data/cache_tests/remove_tail2/data_2
+++ b/net/data/cache_tests/remove_tail2/data_2
Binary files differ
diff --git a/net/data/cache_tests/remove_tail2/data_3 b/net/data/cache_tests/remove_tail2/data_3
index de8e29f..5eec973 100644
--- a/net/data/cache_tests/remove_tail2/data_3
+++ b/net/data/cache_tests/remove_tail2/data_3
Binary files differ
diff --git a/net/data/cache_tests/remove_tail2/index b/net/data/cache_tests/remove_tail2/index
index e68e6f3..9c5b980 100644
--- a/net/data/cache_tests/remove_tail2/index
+++ b/net/data/cache_tests/remove_tail2/index
Binary files differ
diff --git a/net/data/cache_tests/remove_tail3/data_0 b/net/data/cache_tests/remove_tail3/data_0
index 2a73a7d..d500c82 100644
--- a/net/data/cache_tests/remove_tail3/data_0
+++ b/net/data/cache_tests/remove_tail3/data_0
Binary files differ
diff --git a/net/data/cache_tests/remove_tail3/data_1 b/net/data/cache_tests/remove_tail3/data_1
index 7c00477..fd7342a 100644
--- a/net/data/cache_tests/remove_tail3/data_1
+++ b/net/data/cache_tests/remove_tail3/data_1
Binary files differ
diff --git a/net/data/cache_tests/remove_tail3/data_2 b/net/data/cache_tests/remove_tail3/data_2
index 5b34782..c7e2eb9 100644
--- a/net/data/cache_tests/remove_tail3/data_2
+++ b/net/data/cache_tests/remove_tail3/data_2
Binary files differ
diff --git a/net/data/cache_tests/remove_tail3/data_3 b/net/data/cache_tests/remove_tail3/data_3
index de8e29f..5eec973 100644
--- a/net/data/cache_tests/remove_tail3/data_3
+++ b/net/data/cache_tests/remove_tail3/data_3
Binary files differ
diff --git a/net/data/cache_tests/remove_tail3/index b/net/data/cache_tests/remove_tail3/index
index e68e6f3..9c5b980 100644
--- a/net/data/cache_tests/remove_tail3/index
+++ b/net/data/cache_tests/remove_tail3/index
Binary files differ
diff --git a/net/disk_cache/backend_impl.cc b/net/disk_cache/backend_impl.cc
index 7aa1e78..d9fe0cc 100644
--- a/net/disk_cache/backend_impl.cc
+++ b/net/disk_cache/backend_impl.cc
@@ -540,6 +540,10 @@ void BackendImpl::DeleteBlock(Addr block_address, bool deep) {
block_files_.DeleteBlock(block_address, deep);
}
+LruData* BackendImpl::GetLruData() {
+ return &data_->header.lru;
+}
+
void BackendImpl::UpdateRank(CacheRankingsBlock* node, bool modified) {
if (!read_only_)
rankings_.UpdateRank(node, modified);
diff --git a/net/disk_cache/backend_impl.h b/net/disk_cache/backend_impl.h
index 5c88682..7b747de 100644
--- a/net/disk_cache/backend_impl.h
+++ b/net/disk_cache/backend_impl.h
@@ -68,6 +68,9 @@ class BackendImpl : public Backend {
// the related storage in addition of releasing the related block.
void DeleteBlock(Addr block_address, bool deep);
+ // Retrieves a pointer to the lru-related data.
+ LruData* GetLruData();
+
// Updates the ranking information for an entry.
void UpdateRank(CacheRankingsBlock* node, bool modified);
diff --git a/net/disk_cache/disk_format.h b/net/disk_cache/disk_format.h
index d874359..2e839a1 100644
--- a/net/disk_cache/disk_format.h
+++ b/net/disk_cache/disk_format.h
@@ -36,7 +36,7 @@
// entry keeps track of all the information related to the same cache entry,
// such as the key, hash value, data pointers etc. A rankings node keeps track
// of the information that is updated frequently for a given entry, such as its
-// location on the LRU list, last access time etc.
+// location on the LRU lists, last access time etc.
//
// The files that store internal information for the cache (blocks and index)
// are at least partially memory mapped. They have a location that is signaled
@@ -63,7 +63,16 @@ typedef uint32 CacheAddr;
const int kIndexTablesize = 0x10000;
const uint32 kIndexMagic = 0xC103CAC3;
-const uint32 kCurrentVersion = 0x10003; // Version 1.3.
+const uint32 kCurrentVersion = 0x20000; // Version 2.0.
+
+struct LruData {
+ CacheAddr heads[5];
+ CacheAddr tails[5];
+ CacheAddr transaction; // In-flight operation target.
+ int32 operation; // Actual in-flight operation.
+ int32 operation_list; // In-flight operation list.
+ int32 pad[7];
+};
// Header for the master index file.
struct IndexHeader {
@@ -75,7 +84,8 @@ struct IndexHeader {
int32 this_id; // Id for all entries being changed (dirty flag).
CacheAddr stats; // Storage for usage data.
int32 table_len; // Actual size of the table (0 == kIndexTablesize).
- int32 pad[8];
+ int32 pad[64];
+ LruData lru; // Eviction control data.
IndexHeader() {
memset(this, 0, sizeof(*this));
magic = kIndexMagic;
@@ -99,17 +109,29 @@ struct EntryStore {
uint32 hash; // Full hash of the key.
CacheAddr next; // Next entry with the same hash or bucket.
CacheAddr rankings_node; // Rankings node for this entry.
+ int32 reuse_count; // How often is this entry used.
+ int32 refetch_count; // How often is this fetched from the net.
+ int32 state; // Current state.
+ uint64 creation_time;
int32 key_len;
CacheAddr long_key; // Optional address of a long key.
- int32 data_size[2]; // We can store up to 2 data chunks for each
- CacheAddr data_addr[2]; // entry.
- char key[256 - 9 * 4]; // null terminated
+ int32 data_size[4]; // We can store up to 4 data streams for each
+ CacheAddr data_addr[4]; // entry.
+ int32 pad[6];
+ char key[256 - 24 * 4]; // null terminated
};
COMPILE_ASSERT(sizeof(EntryStore) == 256, bad_EntyStore);
const int kMaxInternalKeyLength = 4 * sizeof(EntryStore) -
offsetof(EntryStore, key) - 1;
+// Possible states for a given entry.
+enum EntryState {
+ ENTRY_NORMAL = 0,
+ ENTRY_EVICTED, // The entry was recently evicted from the cache.
+ ENTRY_DOOMED // The entry was doomed.
+};
+
#pragma pack(push, old, 4)
// Rankings information for a given entry.
struct RankingsNode {
diff --git a/net/disk_cache/entry_impl.cc b/net/disk_cache/entry_impl.cc
index 2e7b8c46..cc2b07d 100644
--- a/net/disk_cache/entry_impl.cc
+++ b/net/disk_cache/entry_impl.cc
@@ -16,6 +16,9 @@ using base::TimeDelta;
namespace {
+// Index for the file used to store the key, if any (files_[kKeyFileIndex]).
+const int kKeyFileIndex = 3;
+
// This class implements FileIOCallback to buffer the callback from a file IO
// operation from the actual net class.
class SyncCallback: public disk_cache::FileIOCallback {
@@ -72,7 +75,8 @@ EntryImpl::EntryImpl(BackendImpl* backend, Addr address)
entry_.LazyInit(backend->File(address), address);
doomed_ = false;
backend_ = backend;
- unreported_size_[0] = unreported_size_[1] = 0;
+ for (int i = 0; i < NUM_STREAMS; i++)
+ unreported_size_[i] = 0;
}
// When an entry is deleted from the cache, we clean up all the data associated
@@ -85,7 +89,7 @@ EntryImpl::~EntryImpl() {
if (doomed_) {
UMA_HISTOGRAM_COUNTS(L"DiskCache.DeleteHeader", GetDataSize(0));
UMA_HISTOGRAM_COUNTS(L"DiskCache.DeleteData", GetDataSize(1));
- for (int index = 0; index < kKeyFileIndex; index++) {
+ for (int index = 0; index < NUM_STREAMS; index++) {
Addr address(entry_.Data()->data_addr[index]);
if (address.is_initialized()) {
DeleteData(address, index);
@@ -106,7 +110,7 @@ EntryImpl::~EntryImpl() {
backend_->DeleteBlock(entry_.address(), false);
} else {
bool ret = true;
- for (int index = 0; index < kKeyFileIndex; index++) {
+ for (int index = 0; index < NUM_STREAMS; index++) {
if (user_buffers_[index].get()) {
if (!(ret = Flush(index, entry_.Data()->data_size[index], false)))
LOG(ERROR) << "Failed to save user data";
@@ -154,6 +158,7 @@ std::string EntryImpl::GetKey() const {
if (entry->Data()->key_len > kMaxInternalKeyLength) {
Addr address(entry->Data()->long_key);
DCHECK(address.is_initialized());
+ COMPILE_ASSERT(NUM_STREAMS == kKeyFileIndex, invalid_key_index);
File* file = const_cast<EntryImpl*>(this)->GetBackingFile(address,
kKeyFileIndex);
@@ -182,7 +187,7 @@ Time EntryImpl::GetLastModified() const {
}
int32 EntryImpl::GetDataSize(int index) const {
- if (index < 0 || index > 1)
+ if (index < 0 || index >= NUM_STREAMS)
return 0;
CacheEntryBlock* entry = const_cast<CacheEntryBlock*>(&entry_);
@@ -192,7 +197,7 @@ int32 EntryImpl::GetDataSize(int index) const {
int EntryImpl::ReadData(int index, int offset, char* buf, int buf_len,
net::CompletionCallback* completion_callback) {
DCHECK(node_.Data()->dirty);
- if (index < 0 || index > 1)
+ if (index < 0 || index >= NUM_STREAMS)
return net::ERR_INVALID_ARGUMENT;
int entry_size = entry_.Data()->data_size[index];
@@ -258,7 +263,7 @@ int EntryImpl::WriteData(int index, int offset, const char* buf, int buf_len,
net::CompletionCallback* completion_callback,
bool truncate) {
DCHECK(node_.Data()->dirty);
- if (index < 0 || index > 1)
+ if (index < 0 || index >= NUM_STREAMS)
return net::ERR_INVALID_ARGUMENT;
if (offset < 0 || buf_len < 0)
@@ -372,6 +377,7 @@ bool EntryImpl::CreateEntry(Addr node_address, const std::string& key,
node->pointer = this;
entry_store->hash = hash;
+ entry_store->creation_time = Time::Now().ToInternalValue();
entry_store->key_len = static_cast<int32>(key.size());
if (entry_store->key_len > kMaxInternalKeyLength) {
Addr address(0);
@@ -507,7 +513,7 @@ void EntryImpl::SetTimes(base::Time last_used, base::Time last_modified) {
bool EntryImpl::CreateDataBlock(int index, int size) {
Addr address(entry_.Data()->data_addr[index]);
- DCHECK(0 == index || 1 == index);
+ DCHECK(index >= 0 && index < NUM_STREAMS);
if (!CreateBlock(size, &address))
return false;
@@ -577,10 +583,10 @@ File* EntryImpl::GetBackingFile(Addr address, int index) {
}
File* EntryImpl::GetExternalFile(Addr address, int index) {
- DCHECK(index >= 0 && index <= 2);
+ DCHECK(index >= 0 && index <= kKeyFileIndex);
if (!files_[index].get()) {
// For a key file, use mixed mode IO.
- scoped_refptr<File> file(new File(2 == index));
+ scoped_refptr<File> file(new File(kKeyFileIndex == index));
if (file->Init(backend_->GetFileName(address)))
files_[index].swap(file);
}
diff --git a/net/disk_cache/entry_impl.h b/net/disk_cache/entry_impl.h
index b504b0bd..9b26c80 100644
--- a/net/disk_cache/entry_impl.h
+++ b/net/disk_cache/entry_impl.h
@@ -89,10 +89,11 @@ class EntryImpl : public Entry, public base::RefCounted<EntryImpl> {
void SetTimes(base::Time last_used, base::Time last_modified);
private:
- ~EntryImpl();
+ enum {
+ NUM_STREAMS = 3
+ };
- // Index for the file used to store the key, if any (files_[kKeyFileIndex]).
- static const int kKeyFileIndex = 2;
+ ~EntryImpl();
// Initializes the storage for an internal or external data block.
bool CreateDataBlock(int index, int size);
@@ -134,9 +135,10 @@ class EntryImpl : public Entry, public base::RefCounted<EntryImpl> {
CacheEntryBlock entry_; // Key related information for this entry.
CacheRankingsBlock node_; // Rankings related information for this entry.
BackendImpl* backend_; // Back pointer to the cache.
- scoped_array<char> user_buffers_[2]; // Store user data.
- scoped_refptr<File> files_[3]; // Files to store external user data and key.
- int unreported_size_[2]; // Bytes not reported yet to the backend.
+ scoped_array<char> user_buffers_[NUM_STREAMS]; // Store user data.
+ scoped_refptr<File> files_[NUM_STREAMS + 1]; // Files to store external user
+ // data and key.
+ int unreported_size_[NUM_STREAMS]; // Bytes not reported yet to the backend.
bool doomed_; // True if this entry was removed from the cache.
DISALLOW_EVIL_CONSTRUCTORS(EntryImpl);
diff --git a/net/disk_cache/entry_unittest.cc b/net/disk_cache/entry_unittest.cc
index 9793649..abd1008 100644
--- a/net/disk_cache/entry_unittest.cc
+++ b/net/disk_cache/entry_unittest.cc
@@ -24,6 +24,7 @@ class DiskCacheEntryTest : public DiskCacheTestWithCache {
void InternalAsyncIO();
void ExternalSyncIO();
void ExternalAsyncIO();
+ void StreamAccess();
void GetKey();
void GrowData();
void TruncateData();
@@ -373,6 +374,41 @@ TEST_F(DiskCacheEntryTest, MemoryOnlyExternalAsyncIO) {
ExternalAsyncIO();
}
+void DiskCacheEntryTest::StreamAccess() {
+ disk_cache::Entry *entry = NULL;
+ ASSERT_TRUE(cache_->CreateEntry("the first key", &entry));
+ ASSERT_TRUE(NULL != entry);
+
+ const int kBufferSize = 1024;
+ char buffer1[kBufferSize];
+ char buffer2[kBufferSize];
+
+ const int kNumStreams = 3;
+ for (int i = 0; i < kNumStreams; i++) {
+ CacheTestFillBuffer(buffer1, kBufferSize, false);
+ EXPECT_EQ(kBufferSize, entry->WriteData(i, 0, buffer1, kBufferSize, NULL,
+ false));
+ memset(buffer2, 0, kBufferSize);
+ EXPECT_EQ(kBufferSize, entry->ReadData(i, 0, buffer2, kBufferSize, NULL));
+ EXPECT_EQ(0, memcmp(buffer1, buffer2, kBufferSize));
+ }
+
+ EXPECT_EQ(net::ERR_INVALID_ARGUMENT,
+ entry->ReadData(kNumStreams, 0, buffer1, kBufferSize, NULL));
+ entry->Close();
+}
+
+TEST_F(DiskCacheEntryTest, StreamAccess) {
+ InitCache();
+ StreamAccess();
+}
+
+TEST_F(DiskCacheEntryTest, MemoryOnlyStreamAccess) {
+ SetMemoryOnlyMode();
+ InitCache();
+ StreamAccess();
+}
+
void DiskCacheEntryTest::GetKey() {
std::string key1("the first key");
disk_cache::Entry *entry1;
diff --git a/net/disk_cache/mem_entry_impl.cc b/net/disk_cache/mem_entry_impl.cc
index 2bbf4a5..6bc7b6b 100644
--- a/net/disk_cache/mem_entry_impl.cc
+++ b/net/disk_cache/mem_entry_impl.cc
@@ -15,12 +15,13 @@ MemEntryImpl::MemEntryImpl(MemBackendImpl* backend) {
doomed_ = false;
backend_ = backend;
ref_count_ = 0;
- data_size_[0] = data_size_[1] = 0;
+ for (int i = 0; i < NUM_STREAMS; i++)
+ data_size_[i] = 0;
}
MemEntryImpl::~MemEntryImpl() {
- backend_->ModifyStorageSize(data_size_[0], 0);
- backend_->ModifyStorageSize(data_size_[1], 0);
+ for (int i = 0; i < NUM_STREAMS; i++)
+ backend_->ModifyStorageSize(data_size_[i], 0);
backend_->ModifyStorageSize(static_cast<int32>(key_.size()), 0);
}
@@ -75,7 +76,7 @@ Time MemEntryImpl::GetLastModified() const {
}
int32 MemEntryImpl::GetDataSize(int index) const {
- if (index < 0 || index > 1)
+ if (index < 0 || index >= NUM_STREAMS)
return 0;
return data_size_[index];
@@ -83,7 +84,7 @@ int32 MemEntryImpl::GetDataSize(int index) const {
int MemEntryImpl::ReadData(int index, int offset, char* buf, int buf_len,
net::CompletionCallback* completion_callback) {
- if (index < 0 || index > 1)
+ if (index < 0 || index >= NUM_STREAMS)
return net::ERR_INVALID_ARGUMENT;
int entry_size = GetDataSize(index);
@@ -105,7 +106,7 @@ int MemEntryImpl::ReadData(int index, int offset, char* buf, int buf_len,
int MemEntryImpl::WriteData(int index, int offset, const char* buf, int buf_len,
net::CompletionCallback* completion_callback,
bool truncate) {
- if (index < 0 || index > 1)
+ if (index < 0 || index >= NUM_STREAMS)
return net::ERR_INVALID_ARGUMENT;
if (offset < 0 || buf_len < 0)
diff --git a/net/disk_cache/mem_entry_impl.h b/net/disk_cache/mem_entry_impl.h
index 98c3e4a..d6e44dd 100644
--- a/net/disk_cache/mem_entry_impl.h
+++ b/net/disk_cache/mem_entry_impl.h
@@ -57,6 +57,10 @@ class MemEntryImpl : public Entry {
bool InUse();
private:
+ enum {
+ NUM_STREAMS = 3
+ };
+
~MemEntryImpl();
// Grows and cleans up the data buffer.
@@ -66,8 +70,8 @@ class MemEntryImpl : public Entry {
void UpdateRank(bool modified);
std::string key_;
- std::vector<char> data_[2]; // User data.
- int32 data_size_[2];
+ std::vector<char> data_[NUM_STREAMS]; // User data.
+ int32 data_size_[NUM_STREAMS];
int ref_count_;
MemEntryImpl* next_; // Pointers for the LRU list.
diff --git a/net/disk_cache/rankings.cc b/net/disk_cache/rankings.cc
index 82e5c7b..b690c75 100644
--- a/net/disk_cache/rankings.cc
+++ b/net/disk_cache/rankings.cc
@@ -16,10 +16,13 @@ disk_cache::RankCrashes g_rankings_crash = disk_cache::NO_CRASH;
namespace {
-const int kHeadIndex = 0;
-const int kTailIndex = 1;
-const int kTransactionIndex = 2;
-const int kOperationIndex = 3;
+enum Lists {
+ NO_USE = 0, // List of entries that have not been reused.
+ LOW_USE, // List of entries with low reuse.
+ HIGH_USE, // List of entries with high reuse.
+ DELETED, // List of recently deleted or doomed entries.
+ LAST_ELEMENT
+};
enum Operation {
INSERT = 1,
@@ -37,25 +40,29 @@ class Transaction {
// avoid having the compiler doing optimizations on when to read or write
// from user_data because it is the basis of the crash detection. Maybe
// volatile is not enough for that, but it should be a good hint.
- Transaction(volatile int32* user_data, disk_cache::Addr addr, Operation op);
+ Transaction(volatile disk_cache::LruData* data, disk_cache::Addr addr,
+ Operation op, int list);
~Transaction();
private:
- volatile int32* user_data_;
- DISALLOW_EVIL_CONSTRUCTORS(Transaction);
+ volatile disk_cache::LruData* data_;
+ DISALLOW_COPY_AND_ASSIGN(Transaction);
};
-Transaction::Transaction(volatile int32* user_data, disk_cache::Addr addr,
- Operation op) : user_data_(user_data) {
- DCHECK(!user_data_[kTransactionIndex]);
+Transaction::Transaction(volatile disk_cache::LruData* data,
+ disk_cache::Addr addr, Operation op, int list)
+ : data_(data) {
+ DCHECK(!data_->transaction);
DCHECK(addr.is_initialized());
- user_data_[kOperationIndex] = op;
- user_data_[kTransactionIndex] = static_cast<int32>(addr.value());
+ data_->operation = op;
+ data_->operation_list = list;
+ data_->transaction = addr.value();
}
Transaction::~Transaction() {
- DCHECK(user_data_[kTransactionIndex]);
- user_data_[kTransactionIndex] = 0;
- user_data_[kOperationIndex] = 0;
+ DCHECK(data_->transaction);
+ data_->transaction = 0;
+ data_->operation = 0;
+ data_->operation_list = 0;
}
// Code locations that can generate crashes.
@@ -160,14 +167,13 @@ bool Rankings::Init(BackendImpl* backend) {
return false;
backend_ = backend;
- MappedFile* file = backend_->File(Addr(RANKINGS, 0, 0, 0));
- header_ = reinterpret_cast<BlockFileHeader*>(file->buffer());
+ control_data_ = backend_->GetLruData();
head_ = ReadHead();
tail_ = ReadTail();
- if (header_->user[kTransactionIndex])
+ if (control_data_->transaction)
CompleteTransaction();
init_ = true;
@@ -178,7 +184,7 @@ void Rankings::Reset() {
init_ = false;
head_.set_value(0);
tail_.set_value(0);
- header_ = NULL;
+ control_data_ = NULL;
}
bool Rankings::GetRanking(CacheRankingsBlock* rankings) {
@@ -220,7 +226,7 @@ bool Rankings::GetRanking(CacheRankingsBlock* rankings) {
void Rankings::Insert(CacheRankingsBlock* node, bool modified) {
Trace("Insert 0x%x", node->address().value());
DCHECK(node->HasData());
- Transaction lock(header_->user, node->address(), INSERT);
+ Transaction lock(control_data_, node->address(), INSERT, NO_USE);
CacheRankingsBlock head(backend_->File(head_), head_);
if (head_.is_initialized()) {
if (!GetRanking(&head))
@@ -307,7 +313,7 @@ void Rankings::Remove(CacheRankingsBlock* node) {
if (!CheckLinks(node, &prev, &next))
return;
- Transaction lock(header_->user, node->address(), REMOVE);
+ Transaction lock(control_data_, node->address(), REMOVE, NO_USE);
prev.Data()->next = next.address().value();
next.Data()->prev = prev.address().value();
GenerateCrash(ON_REMOVE_1);
@@ -368,7 +374,7 @@ void Rankings::UpdateRank(CacheRankingsBlock* node, bool modified) {
}
void Rankings::CompleteTransaction() {
- Addr node_addr(static_cast<CacheAddr>(header_->user[kTransactionIndex]));
+ Addr node_addr(static_cast<CacheAddr>(control_data_->transaction));
if (!node_addr.is_initialized() || node_addr.is_separate_file()) {
NOTREACHED();
LOG(ERROR) << "Invalid rankings info.";
@@ -387,10 +393,10 @@ void Rankings::CompleteTransaction() {
// We want to leave the node inside the list. The entry must me marked as
// dirty, and will be removed later. Otherwise, we'll get assertions when
// attempting to remove the dirty entry.
- if (INSERT == header_->user[kOperationIndex]) {
+ if (INSERT == control_data_->operation) {
Trace("FinishInsert h:0x%x t:0x%x", head_.value(), tail_.value());
FinishInsert(&node);
- } else if (REMOVE == header_->user[kOperationIndex]) {
+ } else if (REMOVE == control_data_->operation) {
Trace("RevertRemove h:0x%x t:0x%x", head_.value(), tail_.value());
RevertRemove(&node);
} else {
@@ -400,8 +406,8 @@ void Rankings::CompleteTransaction() {
}
void Rankings::FinishInsert(CacheRankingsBlock* node) {
- header_->user[kTransactionIndex] = 0;
- header_->user[kOperationIndex] = 0;
+ control_data_->transaction = 0;
+ control_data_->operation = 0;
if (head_.value() != node->address().value()) {
if (tail_.value() == node->address().value()) {
// This part will be skipped by the logic of Insert.
@@ -420,13 +426,13 @@ void Rankings::RevertRemove(CacheRankingsBlock* node) {
Addr prev_addr(node->Data()->prev);
if (!next_addr.is_initialized() || !prev_addr.is_initialized()) {
// The operation actually finished. Nothing to do.
- header_->user[kTransactionIndex] = 0;
+ control_data_->transaction = 0;
return;
}
if (next_addr.is_separate_file() || prev_addr.is_separate_file()) {
NOTREACHED();
LOG(WARNING) << "Invalid rankings info.";
- header_->user[kTransactionIndex] = 0;
+ control_data_->transaction = 0;
return;
}
@@ -465,8 +471,8 @@ void Rankings::RevertRemove(CacheRankingsBlock* node) {
next.Store();
prev.Store();
- header_->user[kTransactionIndex] = 0;
- header_->user[kOperationIndex] = 0;
+ control_data_->transaction = 0;
+ control_data_->operation = 0;
}
CacheRankingsBlock* Rankings::GetNext(CacheRankingsBlock* node) {
@@ -588,21 +594,19 @@ bool Rankings::SanityCheck(CacheRankingsBlock* node, bool from_list) {
}
Addr Rankings::ReadHead() {
- CacheAddr head = static_cast<CacheAddr>(header_->user[kHeadIndex]);
- return Addr(head);
+ return Addr(control_data_->heads[NO_USE]);
}
Addr Rankings::ReadTail() {
- CacheAddr tail = static_cast<CacheAddr>(header_->user[kTailIndex]);
- return Addr(tail);
+ return Addr(control_data_->tails[NO_USE]);
}
void Rankings::WriteHead() {
- header_->user[kHeadIndex] = static_cast<int32>(head_.value());
+ control_data_->heads[NO_USE] = head_.value();
}
void Rankings::WriteTail() {
- header_->user[kTailIndex] = static_cast<int32>(tail_.value());
+ control_data_->tails[NO_USE] = tail_.value();
}
bool Rankings::CheckEntry(CacheRankingsBlock* rankings) {
diff --git a/net/disk_cache/rankings.h b/net/disk_cache/rankings.h
index 1a2dadc..4347fa2 100644
--- a/net/disk_cache/rankings.h
+++ b/net/disk_cache/rankings.h
@@ -4,8 +4,8 @@
// See net/disk_cache/disk_cache.h for the public interface.
-#ifndef NET_DISK_CACHE_RANKINGS_H__
-#define NET_DISK_CACHE_RANKINGS_H__
+#ifndef NET_DISK_CACHE_RANKINGS_H_
+#define NET_DISK_CACHE_RANKINGS_H_
#include <list>
@@ -141,14 +141,14 @@ class Rankings {
bool init_;
Addr head_;
Addr tail_;
- BlockFileHeader* header_; // Header of the block-file used to store rankings.
BackendImpl* backend_;
+ LruData* control_data_; // Data related to the LRU lists.
IteratorList iterators_;
- DISALLOW_EVIL_CONSTRUCTORS(Rankings);
+ DISALLOW_COPY_AND_ASSIGN(Rankings);
};
} // namespace disk_cache
-#endif // NET_DISK_CACHE_RANKINGS_H__
+#endif // NET_DISK_CACHE_RANKINGS_H_
diff --git a/net/tools/dump_cache/dump_files.cc b/net/tools/dump_cache/dump_files.cc
index 67bdad2..1275254 100644
--- a/net/tools/dump_cache/dump_files.cc
+++ b/net/tools/dump_cache/dump_files.cc
@@ -61,6 +61,13 @@ void DumpIndexHeader(const std::wstring name) {
printf("last file number: %d\n", header.last_file);
printf("current id: %d\n", header.this_id);
printf("table length: %d\n", header.table_len);
+ for (int i = 0; i < 5; i++) {
+ printf("head %d: 0x%x\n", i, header.lru.heads[i]);
+ printf("tail %d: 0x%x\n", i, header.lru.tails[i]);
+ }
+ printf("transaction: 0x%x\n", header.lru.transaction);
+ printf("operation: %d\n", header.lru.operation);
+ printf("operation list: %d\n", header.lru.operation_list);
printf("-------------------------\n\n");
}
@@ -218,10 +225,13 @@ void DumpEntry(const disk_cache::EntryStore& entry) {
printf("key length: %d\n", entry.key_len);
printf("key: \"%s\"\n", key.c_str());
printf("key addr: 0x%x\n", entry.long_key);
- printf("data size 0: %d\n", entry.data_size[0]);
- printf("data size 1: %d\n", entry.data_size[1]);
- printf("data addr 0: 0x%x\n", entry.data_addr[0]);
- printf("data addr 1: 0x%x\n", entry.data_addr[1]);
+ printf("reuse count: %d\n", entry.reuse_count);
+ printf("refetch count: %d\n", entry.refetch_count);
+ printf("state: %d\n", entry.state);
+ for (int i = 0; i < 4; i++) {
+ printf("data size %d: %d\n", i, entry.data_size[i]);
+ printf("data addr %d: 0x%x\n", i, entry.data_addr[i]);
+ }
printf("----------\n\n");
}
diff --git a/net/tools/dump_cache/upgrade.cc b/net/tools/dump_cache/upgrade.cc
index c715f14..d048c6f 100644
--- a/net/tools/dump_cache/upgrade.cc
+++ b/net/tools/dump_cache/upgrade.cc
@@ -12,7 +12,7 @@ namespace {
const wchar_t kPipePrefix[] = L"\\\\.\\pipe\\dump_cache_";
const int kChannelSize = 64 * 1024;
-const int kNumStreams = 2;
+const int kNumStreams = 4;
// Simple macro to print out formatted debug messages. It is similar to a DLOG
// except that it doesn't include a header.