OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // The cache is stored on disk as a collection of block-files, plus an index | 5 // The cache is stored on disk as a collection of block-files, plus an index |
6 // file plus a collection of external files. | 6 // file plus a collection of external files. |
7 // | 7 // |
8 // Any data blob bigger than kMaxBlockSize (disk_cache/addr.h) will be stored in | 8 // Any data blob bigger than kMaxBlockSize (disk_cache/addr.h) will be stored in |
9 // a separate file named f_xxx where x is a hexadecimal number. Shorter data | 9 // a separate file named f_xxx where x is a hexadecimal number. Shorter data |
10 // will be stored as a series of blocks on a block-file. In any case, CacheAddr | 10 // will be stored as a series of blocks on a block-file. In any case, CacheAddr |
(...skipping 27 matching lines...) Expand all Loading... |
38 // a separate identifier (maintained on the "this_id" header field) that is used | 38 // a separate identifier (maintained on the "this_id" header field) that is used |
39 // to mark every entry that is created or modified. When the entry is closed, | 39 // to mark every entry that is created or modified. When the entry is closed, |
40 // and all the data can be trusted, the dirty flag is cleared from the entry. | 40 // and all the data can be trusted, the dirty flag is cleared from the entry. |
41 // When the cache encounters an entry whose identifier is different than the one | 41 // When the cache encounters an entry whose identifier is different than the one |
42 // being currently used, it means that the entry was not properly closed on a | 42 // being currently used, it means that the entry was not properly closed on a |
43 // previous run, so it is discarded. | 43 // previous run, so it is discarded. |
44 | 44 |
45 #ifndef NET_DISK_CACHE_BLOCKFILE_DISK_FORMAT_H_ | 45 #ifndef NET_DISK_CACHE_BLOCKFILE_DISK_FORMAT_H_ |
46 #define NET_DISK_CACHE_BLOCKFILE_DISK_FORMAT_H_ | 46 #define NET_DISK_CACHE_BLOCKFILE_DISK_FORMAT_H_ |
47 | 47 |
48 #include "base/basictypes.h" | 48 #include <stddef.h> |
| 49 #include <stdint.h> |
| 50 #include <string.h> |
| 51 |
49 #include "net/base/net_export.h" | 52 #include "net/base/net_export.h" |
50 #include "net/disk_cache/blockfile/disk_format_base.h" | 53 #include "net/disk_cache/blockfile/disk_format_base.h" |
51 | 54 |
52 namespace disk_cache { | 55 namespace disk_cache { |
53 | 56 |
54 const int kIndexTablesize = 0x10000; | 57 const int kIndexTablesize = 0x10000; |
55 const uint32 kIndexMagic = 0xC103CAC3; | 58 const uint32_t kIndexMagic = 0xC103CAC3; |
56 const uint32 kCurrentVersion = 0x20000; // Version 2.0. | 59 const uint32_t kCurrentVersion = 0x20000; // Version 2.0. |
57 | 60 |
58 struct LruData { | 61 struct LruData { |
59 int32 pad1[2]; | 62 int32_t pad1[2]; |
60 int32 filled; // Flag to tell when we filled the cache. | 63 int32_t filled; // Flag to tell when we filled the cache. |
61 int32 sizes[5]; | 64 int32_t sizes[5]; |
62 CacheAddr heads[5]; | 65 CacheAddr heads[5]; |
63 CacheAddr tails[5]; | 66 CacheAddr tails[5]; |
64 CacheAddr transaction; // In-flight operation target. | 67 CacheAddr transaction; // In-flight operation target. |
65 int32 operation; // Actual in-flight operation. | 68 int32_t operation; // Actual in-flight operation. |
66 int32 operation_list; // In-flight operation list. | 69 int32_t operation_list; // In-flight operation list. |
67 int32 pad2[7]; | 70 int32_t pad2[7]; |
68 }; | 71 }; |
69 | 72 |
70 // Header for the master index file. | 73 // Header for the master index file. |
71 struct NET_EXPORT_PRIVATE IndexHeader { | 74 struct NET_EXPORT_PRIVATE IndexHeader { |
72 IndexHeader(); | 75 IndexHeader(); |
73 | 76 |
74 uint32 magic; | 77 uint32_t magic; |
75 uint32 version; | 78 uint32_t version; |
76 int32 num_entries; // Number of entries currently stored. | 79 int32_t num_entries; // Number of entries currently stored. |
77 int32 num_bytes; // Total size of the stored data. | 80 int32_t num_bytes; // Total size of the stored data. |
78 int32 last_file; // Last external file created. | 81 int32_t last_file; // Last external file created. |
79 int32 this_id; // Id for all entries being changed (dirty flag). | 82 int32_t this_id; // Id for all entries being changed (dirty flag). |
80 CacheAddr stats; // Storage for usage data. | 83 CacheAddr stats; // Storage for usage data. |
81 int32 table_len; // Actual size of the table (0 == kIndexTablesize). | 84 int32_t table_len; // Actual size of the table (0 == kIndexTablesize). |
82 int32 crash; // Signals a previous crash. | 85 int32_t crash; // Signals a previous crash. |
83 int32 experiment; // Id of an ongoing test. | 86 int32_t experiment; // Id of an ongoing test. |
84 uint64 create_time; // Creation time for this set of files. | 87 uint64_t create_time; // Creation time for this set of files. |
85 int32 pad[52]; | 88 int32_t pad[52]; |
86 LruData lru; // Eviction control data. | 89 LruData lru; // Eviction control data. |
87 }; | 90 }; |
88 | 91 |
89 // The structure of the whole index file. | 92 // The structure of the whole index file. |
90 struct Index { | 93 struct Index { |
91 IndexHeader header; | 94 IndexHeader header; |
92 CacheAddr table[kIndexTablesize]; // Default size. Actual size controlled | 95 CacheAddr table[kIndexTablesize]; // Default size. Actual size controlled |
93 // by header.table_len. | 96 // by header.table_len. |
94 }; | 97 }; |
95 | 98 |
96 // Main structure for an entry on the backing storage. If the key is longer than | 99 // Main structure for an entry on the backing storage. If the key is longer than |
97 // what can be stored on this structure, it will be extended on consecutive | 100 // what can be stored on this structure, it will be extended on consecutive |
98 // blocks (adding 256 bytes each time), up to 4 blocks (1024 - 32 - 1 chars). | 101 // blocks (adding 256 bytes each time), up to 4 blocks (1024 - 32 - 1 chars). |
99 // After that point, the whole key will be stored as a data block or external | 102 // After that point, the whole key will be stored as a data block or external |
100 // file. | 103 // file. |
101 struct EntryStore { | 104 struct EntryStore { |
102 uint32 hash; // Full hash of the key. | 105 uint32_t hash; // Full hash of the key. |
103 CacheAddr next; // Next entry with the same hash or bucket. | 106 CacheAddr next; // Next entry with the same hash or bucket. |
104 CacheAddr rankings_node; // Rankings node for this entry. | 107 CacheAddr rankings_node; // Rankings node for this entry. |
105 int32 reuse_count; // How often is this entry used. | 108 int32_t reuse_count; // How often is this entry used. |
106 int32 refetch_count; // How often is this fetched from the net. | 109 int32_t refetch_count; // How often is this fetched from the net. |
107 int32 state; // Current state. | 110 int32_t state; // Current state. |
108 uint64 creation_time; | 111 uint64_t creation_time; |
109 int32 key_len; | 112 int32_t key_len; |
110 CacheAddr long_key; // Optional address of a long key. | 113 CacheAddr long_key; // Optional address of a long key. |
111 int32 data_size[4]; // We can store up to 4 data streams for each | 114 int32_t data_size[4]; // We can store up to 4 data streams for each |
112 CacheAddr data_addr[4]; // entry. | 115 CacheAddr data_addr[4]; // entry. |
113 uint32 flags; // Any combination of EntryFlags. | 116 uint32_t flags; // Any combination of EntryFlags. |
114 int32 pad[4]; | 117 int32_t pad[4]; |
115 uint32 self_hash; // The hash of EntryStore up to this point. | 118 uint32_t self_hash; // The hash of EntryStore up to this point. |
116 char key[256 - 24 * 4]; // null terminated | 119 char key[256 - 24 * 4]; // null terminated |
117 }; | 120 }; |
118 | 121 |
119 static_assert(sizeof(EntryStore) == 256, "bad EntryStore"); | 122 static_assert(sizeof(EntryStore) == 256, "bad EntryStore"); |
120 const int kMaxInternalKeyLength = 4 * sizeof(EntryStore) - | 123 const int kMaxInternalKeyLength = 4 * sizeof(EntryStore) - |
121 offsetof(EntryStore, key) - 1; | 124 offsetof(EntryStore, key) - 1; |
122 | 125 |
123 // Possible states for a given entry. | 126 // Possible states for a given entry. |
124 enum EntryState { | 127 enum EntryState { |
125 ENTRY_NORMAL = 0, | 128 ENTRY_NORMAL = 0, |
126 ENTRY_EVICTED, // The entry was recently evicted from the cache. | 129 ENTRY_EVICTED, // The entry was recently evicted from the cache. |
127 ENTRY_DOOMED // The entry was doomed. | 130 ENTRY_DOOMED // The entry was doomed. |
128 }; | 131 }; |
129 | 132 |
130 // Flags that can be applied to an entry. | 133 // Flags that can be applied to an entry. |
131 enum EntryFlags { | 134 enum EntryFlags { |
132 PARENT_ENTRY = 1, // This entry has children (sparse) entries. | 135 PARENT_ENTRY = 1, // This entry has children (sparse) entries. |
133 CHILD_ENTRY = 1 << 1 // Child entry that stores sparse data. | 136 CHILD_ENTRY = 1 << 1 // Child entry that stores sparse data. |
134 }; | 137 }; |
135 | 138 |
136 #pragma pack(push, 4) | 139 #pragma pack(push, 4) |
137 // Rankings information for a given entry. | 140 // Rankings information for a given entry. |
138 struct RankingsNode { | 141 struct RankingsNode { |
139 uint64 last_used; // LRU info. | 142 uint64_t last_used; // LRU info. |
140 uint64 last_modified; // LRU info. | 143 uint64_t last_modified; // LRU info. |
141 CacheAddr next; // LRU list. | 144 CacheAddr next; // LRU list. |
142 CacheAddr prev; // LRU list. | 145 CacheAddr prev; // LRU list. |
143 CacheAddr contents; // Address of the EntryStore. | 146 CacheAddr contents; // Address of the EntryStore. |
144 int32 dirty; // The entry is being modifyied. | 147 int32_t dirty; // The entry is being modifyied. |
145 uint32 self_hash; // RankingsNode's hash. | 148 uint32_t self_hash; // RankingsNode's hash. |
146 }; | 149 }; |
147 #pragma pack(pop) | 150 #pragma pack(pop) |
148 | 151 |
149 static_assert(sizeof(RankingsNode) == 36, "bad RankingsNode"); | 152 static_assert(sizeof(RankingsNode) == 36, "bad RankingsNode"); |
150 | 153 |
151 } // namespace disk_cache | 154 } // namespace disk_cache |
152 | 155 |
153 #endif // NET_DISK_CACHE_BLOCKFILE_DISK_FORMAT_H_ | 156 #endif // NET_DISK_CACHE_BLOCKFILE_DISK_FORMAT_H_ |
OLD | NEW |