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

Side by Side Diff: net/disk_cache/entry_impl.cc

Issue 42682: Disk Cache: Second pass (and final) to allow multiple instances... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 8 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/disk_cache/backend_impl.cc ('k') | net/disk_cache/eviction.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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/entry_impl.h" 5 #include "net/disk_cache/entry_impl.h"
6 6
7 #include "base/histogram.h" 7 #include "base/histogram.h"
8 #include "base/message_loop.h" 8 #include "base/message_loop.h"
9 #include "base/string_util.h" 9 #include "base/string_util.h"
10 #include "net/base/io_buffer.h" 10 #include "net/base/io_buffer.h"
11 #include "net/base/net_errors.h" 11 #include "net/base/net_errors.h"
12 #include "net/disk_cache/backend_impl.h" 12 #include "net/disk_cache/backend_impl.h"
13 #include "net/disk_cache/cache_util.h" 13 #include "net/disk_cache/cache_util.h"
14 #include "net/disk_cache/histogram_macros.h"
14 15
15 using base::Time; 16 using base::Time;
16 using base::TimeDelta; 17 using base::TimeDelta;
17 18
18 namespace { 19 namespace {
19 20
20 // Index for the file used to store the key, if any (files_[kKeyFileIndex]). 21 // Index for the file used to store the key, if any (files_[kKeyFileIndex]).
21 const int kKeyFileIndex = 3; 22 const int kKeyFileIndex = 3;
22 23
23 // This class implements FileIOCallback to buffer the callback from a file IO 24 // This class implements FileIOCallback to buffer the callback from a file IO
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 buf_len = entry_size - offset; 202 buf_len = entry_size - offset;
202 203
203 UpdateRank(false); 204 UpdateRank(false);
204 205
205 backend_->OnEvent(Stats::READ_DATA); 206 backend_->OnEvent(Stats::READ_DATA);
206 207
207 if (user_buffers_[index].get()) { 208 if (user_buffers_[index].get()) {
208 // Complete the operation locally. 209 // Complete the operation locally.
209 DCHECK(kMaxBlockSize >= offset + buf_len); 210 DCHECK(kMaxBlockSize >= offset + buf_len);
210 memcpy(buf->data() , user_buffers_[index].get() + offset, buf_len); 211 memcpy(buf->data() , user_buffers_[index].get() + offset, buf_len);
211 stats.AddTime(Time::Now() - start); 212 if (backend_->cache_type() == net::DISK_CACHE)
213 stats.AddTime(Time::Now() - start);
212 return buf_len; 214 return buf_len;
213 } 215 }
214 216
215 Addr address(entry_.Data()->data_addr[index]); 217 Addr address(entry_.Data()->data_addr[index]);
216 DCHECK(address.is_initialized()); 218 DCHECK(address.is_initialized());
217 if (!address.is_initialized()) 219 if (!address.is_initialized())
218 return net::ERR_FAILED; 220 return net::ERR_FAILED;
219 221
220 File* file = GetBackingFile(address, index); 222 File* file = GetBackingFile(address, index);
221 if (!file) 223 if (!file)
(...skipping 11 matching lines...) Expand all
233 bool completed; 235 bool completed;
234 if (!file->Read(buf->data(), buf_len, file_offset, io_callback, &completed)) { 236 if (!file->Read(buf->data(), buf_len, file_offset, io_callback, &completed)) {
235 if (io_callback) 237 if (io_callback)
236 io_callback->Discard(); 238 io_callback->Discard();
237 return net::ERR_FAILED; 239 return net::ERR_FAILED;
238 } 240 }
239 241
240 if (io_callback && completed) 242 if (io_callback && completed)
241 io_callback->Discard(); 243 io_callback->Discard();
242 244
243 stats.AddTime(Time::Now() - start); 245 if (backend_->cache_type() == net::DISK_CACHE)
246 stats.AddTime(Time::Now() - start);
244 return (completed || !completion_callback) ? buf_len : net::ERR_IO_PENDING; 247 return (completed || !completion_callback) ? buf_len : net::ERR_IO_PENDING;
245 } 248 }
246 249
247 int EntryImpl::WriteData(int index, int offset, net::IOBuffer* buf, int buf_len, 250 int EntryImpl::WriteData(int index, int offset, net::IOBuffer* buf, int buf_len,
248 net::CompletionCallback* completion_callback, 251 net::CompletionCallback* completion_callback,
249 bool truncate) { 252 bool truncate) {
250 DCHECK(node_.Data()->dirty); 253 DCHECK(node_.Data()->dirty);
251 if (index < 0 || index >= NUM_STREAMS) 254 if (index < 0 || index >= NUM_STREAMS)
252 return net::ERR_INVALID_ARGUMENT; 255 return net::ERR_INVALID_ARGUMENT;
253 256
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 305
303 // If we have prepared the cache as an external file, we should never use 306 // If we have prepared the cache as an external file, we should never use
304 // user_buffers_ and always write to file directly. 307 // user_buffers_ and always write to file directly.
305 if (!need_file_[index] && user_buffers_[index].get()) { 308 if (!need_file_[index] && user_buffers_[index].get()) {
306 // Complete the operation locally. 309 // Complete the operation locally.
307 if (!buf_len) 310 if (!buf_len)
308 return 0; 311 return 0;
309 312
310 DCHECK(kMaxBlockSize >= offset + buf_len); 313 DCHECK(kMaxBlockSize >= offset + buf_len);
311 memcpy(user_buffers_[index].get() + offset, buf->data(), buf_len); 314 memcpy(user_buffers_[index].get() + offset, buf->data(), buf_len);
312 stats.AddTime(Time::Now() - start); 315 if (backend_->cache_type() == net::DISK_CACHE)
316 stats.AddTime(Time::Now() - start);
313 return buf_len; 317 return buf_len;
314 } 318 }
315 319
316 Addr address(entry_.Data()->data_addr[index]); 320 Addr address(entry_.Data()->data_addr[index]);
317 File* file = GetBackingFile(address, index); 321 File* file = GetBackingFile(address, index);
318 if (!file) 322 if (!file)
319 return net::ERR_FAILED; 323 return net::ERR_FAILED;
320 324
321 size_t file_offset = offset; 325 size_t file_offset = offset;
322 if (address.is_block_file()) { 326 if (address.is_block_file()) {
(...skipping 15 matching lines...) Expand all
338 if (!file->Write(buf->data(), buf_len, file_offset, io_callback, 342 if (!file->Write(buf->data(), buf_len, file_offset, io_callback,
339 &completed)) { 343 &completed)) {
340 if (io_callback) 344 if (io_callback)
341 io_callback->Discard(); 345 io_callback->Discard();
342 return net::ERR_FAILED; 346 return net::ERR_FAILED;
343 } 347 }
344 348
345 if (io_callback && completed) 349 if (io_callback && completed)
346 io_callback->Discard(); 350 io_callback->Discard();
347 351
348 stats.AddTime(Time::Now() - start); 352 if (backend_->cache_type() == net::DISK_CACHE)
353 stats.AddTime(Time::Now() - start);
349 return (completed || !completion_callback) ? buf_len : net::ERR_IO_PENDING; 354 return (completed || !completion_callback) ? buf_len : net::ERR_IO_PENDING;
350 } 355 }
351 356
352 base::PlatformFile EntryImpl::UseExternalFile(int index) { 357 base::PlatformFile EntryImpl::UseExternalFile(int index) {
353 DCHECK(index >= 0 && index < NUM_STREAMS); 358 DCHECK(index >= 0 && index < NUM_STREAMS);
354 359
355 Addr address(entry_.Data()->data_addr[index]); 360 Addr address(entry_.Data()->data_addr[index]);
356 361
357 // We will not prepare the cache file since the entry is already initialized, 362 // We will not prepare the cache file since the entry is already initialized,
358 // just return the platform file backing the cache. 363 // just return the platform file backing the cache.
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
451 node_.Data()->dirty = backend_->GetCurrentEntryId(); 456 node_.Data()->dirty = backend_->GetCurrentEntryId();
452 node_.Store(); 457 node_.Store();
453 } 458 }
454 doomed_ = true; 459 doomed_ = true;
455 } 460 }
456 461
457 void EntryImpl::DeleteEntryData(bool everything) { 462 void EntryImpl::DeleteEntryData(bool everything) {
458 DCHECK(doomed_ || !everything); 463 DCHECK(doomed_ || !everything);
459 464
460 if (GetDataSize(0)) 465 if (GetDataSize(0))
461 UMA_HISTOGRAM_COUNTS("DiskCache.DeleteHeader", GetDataSize(0)); 466 CACHE_UMA(COUNTS, "DeleteHeader", 0, GetDataSize(0));
462 if (GetDataSize(1)) 467 if (GetDataSize(1))
463 UMA_HISTOGRAM_COUNTS("DiskCache.DeleteData", GetDataSize(1)); 468 CACHE_UMA(COUNTS, "DeleteData", 0, GetDataSize(1));
464 for (int index = 0; index < NUM_STREAMS; index++) { 469 for (int index = 0; index < NUM_STREAMS; index++) {
465 Addr address(entry_.Data()->data_addr[index]); 470 Addr address(entry_.Data()->data_addr[index]);
466 if (address.is_initialized()) { 471 if (address.is_initialized()) {
467 DeleteData(address, index); 472 DeleteData(address, index);
468 backend_->ModifyStorageSize(entry_.Data()->data_size[index] - 473 backend_->ModifyStorageSize(entry_.Data()->data_size[index] -
469 unreported_size_[index], 0); 474 unreported_size_[index], 0);
470 entry_.Data()->data_addr[index] = 0; 475 entry_.Data()->data_addr[index] = 0;
471 entry_.Data()->data_size[index] = 0; 476 entry_.Data()->data_size[index] = 0;
472 } 477 }
473 } 478 }
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
610 } 615 }
611 616
612 void EntryImpl::DeleteData(Addr address, int index) { 617 void EntryImpl::DeleteData(Addr address, int index) {
613 if (!address.is_initialized()) 618 if (!address.is_initialized())
614 return; 619 return;
615 if (address.is_separate_file()) { 620 if (address.is_separate_file()) {
616 if (files_[index]) 621 if (files_[index])
617 files_[index] = NULL; // Releases the object. 622 files_[index] = NULL; // Releases the object.
618 623
619 if (!DeleteCacheFile(backend_->GetFileName(address))) { 624 if (!DeleteCacheFile(backend_->GetFileName(address))) {
620 UMA_HISTOGRAM_COUNTS("DiskCache.DeleteFailed", 1); 625 CACHE_UMA(COUNTS, "DeleteFailed", 0, 1);
621 LOG(ERROR) << "Failed to delete " << backend_->GetFileName(address) << 626 LOG(ERROR) << "Failed to delete " << backend_->GetFileName(address) <<
622 " from the cache."; 627 " from the cache.";
623 } 628 }
624 } else { 629 } else {
625 backend_->DeleteBlock(address, true); 630 backend_->DeleteBlock(address, true);
626 } 631 }
627 } 632 }
628 633
629 void EntryImpl::UpdateRank(bool modified) { 634 void EntryImpl::UpdateRank(bool modified) {
630 if (!doomed_) { 635 if (!doomed_) {
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
848 Trace("%s 0x%p 0x%x 0x%x", msg, reinterpret_cast<void*>(this), 853 Trace("%s 0x%p 0x%x 0x%x", msg, reinterpret_cast<void*>(this),
849 entry_.address().value(), node_.address().value()); 854 entry_.address().value(), node_.address().value());
850 855
851 Trace(" data: 0x%x 0x%x 0x%x", entry_.Data()->data_addr[0], 856 Trace(" data: 0x%x 0x%x 0x%x", entry_.Data()->data_addr[0],
852 entry_.Data()->data_addr[1], entry_.Data()->long_key); 857 entry_.Data()->data_addr[1], entry_.Data()->long_key);
853 858
854 Trace(" doomed: %d 0x%p 0x%x", doomed_, pointer, dirty); 859 Trace(" doomed: %d 0x%p 0x%x", doomed_, pointer, dirty);
855 } 860 }
856 861
857 } // namespace disk_cache 862 } // namespace disk_cache
OLDNEW
« no previous file with comments | « net/disk_cache/backend_impl.cc ('k') | net/disk_cache/eviction.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698