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 #include "net/disk_cache/backend_impl.h" | 5 #include "net/disk_cache/backend_impl.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/file_path.h" | 8 #include "base/file_path.h" |
9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
(...skipping 801 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
812 stats_.OnEvent(Stats::CREATE_ERROR); | 812 stats_.OnEvent(Stats::CREATE_ERROR); |
813 return NULL; | 813 return NULL; |
814 } | 814 } |
815 | 815 |
816 cache_entry->BeginLogging(net_log_, true); | 816 cache_entry->BeginLogging(net_log_, true); |
817 | 817 |
818 // We are not failing the operation; let's add this to the map. | 818 // We are not failing the operation; let's add this to the map. |
819 open_entries_[entry_address.value()] = cache_entry; | 819 open_entries_[entry_address.value()] = cache_entry; |
820 | 820 |
821 // Save the entry. | 821 // Save the entry. |
822 block_files_.GetFile(entry_address)->Store(cache_entry->entry()); | 822 cache_entry->entry()->Store(); |
823 block_files_.GetFile(node_address)->Store(cache_entry->rankings()); | 823 cache_entry->rankings()->Store(); |
gavinp
2011/11/29 15:47:42
Nice.
| |
824 IncreaseNumEntries(); | 824 IncreaseNumEntries(); |
825 entry_count_++; | 825 entry_count_++; |
826 | 826 |
827 // Link this entry through the index. | 827 // Link this entry through the index. |
828 if (parent.get()) { | 828 if (parent.get()) { |
829 parent->SetNextAddress(entry_address); | 829 parent->SetNextAddress(entry_address); |
830 } else { | 830 } else { |
831 data_->table[hash & mask_] = entry_address.value(); | 831 data_->table[hash & mask_] = entry_address.value(); |
832 } | 832 } |
833 | 833 |
(...skipping 802 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1636 STRESS_NOTREACHED(); | 1636 STRESS_NOTREACHED(); |
1637 return ERR_INVALID_ENTRY; | 1637 return ERR_INVALID_ENTRY; |
1638 } | 1638 } |
1639 | 1639 |
1640 STRESS_DCHECK(block_files_.IsValid( | 1640 STRESS_DCHECK(block_files_.IsValid( |
1641 Addr(cache_entry->entry()->Data()->rankings_node))); | 1641 Addr(cache_entry->entry()->Data()->rankings_node))); |
1642 | 1642 |
1643 if (!cache_entry->LoadNodeAddress()) | 1643 if (!cache_entry->LoadNodeAddress()) |
1644 return ERR_READ_FAILURE; | 1644 return ERR_READ_FAILURE; |
1645 | 1645 |
1646 // Prevent overwriting the dirty flag on the destructor. | |
1647 cache_entry->SetDirtyFlag(GetCurrentEntryId()); | |
1648 | |
1649 if (!rankings_.SanityCheck(cache_entry->rankings(), false)) { | 1646 if (!rankings_.SanityCheck(cache_entry->rankings(), false)) { |
1650 STRESS_NOTREACHED(); | 1647 STRESS_NOTREACHED(); |
1651 cache_entry->SetDirtyFlag(0); | 1648 cache_entry->SetDirtyFlag(0); |
1652 // Don't remove this from the list (it is not linked properly). Instead, | 1649 // Don't remove this from the list (it is not linked properly). Instead, |
1653 // break the link back to the entry because it is going away, and leave the | 1650 // break the link back to the entry because it is going away, and leave the |
1654 // rankings node to be deleted if we find it through a list. | 1651 // rankings node to be deleted if we find it through a list. |
1655 rankings_.SetContents(cache_entry->rankings(), 0); | 1652 rankings_.SetContents(cache_entry->rankings(), 0); |
1656 } else if (!rankings_.DataSanityCheck(cache_entry->rankings(), false)) { | 1653 } else if (!rankings_.DataSanityCheck(cache_entry->rankings(), false)) { |
1657 STRESS_NOTREACHED(); | 1654 STRESS_NOTREACHED(); |
1658 cache_entry->SetDirtyFlag(0); | 1655 cache_entry->SetDirtyFlag(0); |
1659 rankings_.SetContents(cache_entry->rankings(), address.value()); | 1656 rankings_.SetContents(cache_entry->rankings(), address.value()); |
1660 } | 1657 } |
1661 | 1658 |
1662 if (!cache_entry->DataSanityCheck()) { | 1659 if (!cache_entry->DataSanityCheck()) { |
1663 LOG(WARNING) << "Messed up entry found."; | 1660 LOG(WARNING) << "Messed up entry found."; |
1664 cache_entry->SetDirtyFlag(0); | 1661 cache_entry->SetDirtyFlag(0); |
1665 cache_entry->FixForDelete(); | 1662 cache_entry->FixForDelete(); |
1666 } | 1663 } |
1667 | 1664 |
1665 // Prevent overwriting the dirty flag on the destructor. | |
1666 cache_entry->SetDirtyFlag(GetCurrentEntryId()); | |
gavinp
2011/11/29 15:47:42
Why is this moving beyond the two sanity-check blo
rvargas (doing something else)
2011/11/29 19:08:56
Because this is reading Rankings; we want the firs
| |
1667 | |
1668 if (cache_entry->dirty()) { | 1668 if (cache_entry->dirty()) { |
1669 Trace("Dirty entry 0x%p 0x%x", reinterpret_cast<void*>(cache_entry.get()), | 1669 Trace("Dirty entry 0x%p 0x%x", reinterpret_cast<void*>(cache_entry.get()), |
1670 address.value()); | 1670 address.value()); |
1671 } | 1671 } |
1672 | 1672 |
1673 open_entries_[address.value()] = cache_entry; | 1673 open_entries_[address.value()] = cache_entry; |
1674 | 1674 |
1675 cache_entry->BeginLogging(net_log_, false); | 1675 cache_entry->BeginLogging(net_log_, false); |
1676 cache_entry.swap(entry); | 1676 cache_entry.swap(entry); |
1677 return 0; | 1677 return 0; |
(...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2212 ok = ok && block_files_.IsValid(cache_entry->rankings()->address()); | 2212 ok = ok && block_files_.IsValid(cache_entry->rankings()->address()); |
2213 EntryStore* data = cache_entry->entry()->Data(); | 2213 EntryStore* data = cache_entry->entry()->Data(); |
2214 for (size_t i = 0; i < arraysize(data->data_addr); i++) { | 2214 for (size_t i = 0; i < arraysize(data->data_addr); i++) { |
2215 if (data->data_addr[i]) { | 2215 if (data->data_addr[i]) { |
2216 Addr address(data->data_addr[i]); | 2216 Addr address(data->data_addr[i]); |
2217 if (address.is_block_file()) | 2217 if (address.is_block_file()) |
2218 ok = ok && block_files_.IsValid(address); | 2218 ok = ok && block_files_.IsValid(address); |
2219 } | 2219 } |
2220 } | 2220 } |
2221 | 2221 |
2222 RankingsNode* rankings = cache_entry->rankings()->Data(); | 2222 return ok && cache_entry->rankings()->VerifyHash(); |
2223 return ok && !rankings->dummy; | |
2224 } | 2223 } |
2225 | 2224 |
2226 int BackendImpl::MaxBuffersSize() { | 2225 int BackendImpl::MaxBuffersSize() { |
2227 static int64 total_memory = base::SysInfo::AmountOfPhysicalMemory(); | 2226 static int64 total_memory = base::SysInfo::AmountOfPhysicalMemory(); |
2228 static bool done = false; | 2227 static bool done = false; |
2229 | 2228 |
2230 if (!done) { | 2229 if (!done) { |
2231 const int kMaxBuffersSize = 30 * 1024 * 1024; | 2230 const int kMaxBuffersSize = 30 * 1024 * 1024; |
2232 | 2231 |
2233 // We want to use up to 2% of the computer's memory. | 2232 // We want to use up to 2% of the computer's memory. |
2234 total_memory = total_memory * 2 / 100; | 2233 total_memory = total_memory * 2 / 100; |
2235 if (total_memory > kMaxBuffersSize || total_memory <= 0) | 2234 if (total_memory > kMaxBuffersSize || total_memory <= 0) |
2236 total_memory = kMaxBuffersSize; | 2235 total_memory = kMaxBuffersSize; |
2237 | 2236 |
2238 done = true; | 2237 done = true; |
2239 } | 2238 } |
2240 | 2239 |
2241 return static_cast<int>(total_memory); | 2240 return static_cast<int>(total_memory); |
2242 } | 2241 } |
2243 | 2242 |
2244 } // namespace disk_cache | 2243 } // namespace disk_cache |
OLD | NEW |