OLD | NEW |
1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2009 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" |
(...skipping 843 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
854 // TODO(rvargas): figure out if it's worth to re-enable posting operations. | 854 // TODO(rvargas): figure out if it's worth to re-enable posting operations. |
855 // Right now it is only used from GrowUserBuffer, not the destructor, and | 855 // Right now it is only used from GrowUserBuffer, not the destructor, and |
856 // it is not accounted for from the point of view of the total number of | 856 // it is not accounted for from the point of view of the total number of |
857 // pending operations of the cache. It is also racing with the actual write | 857 // pending operations of the cache. It is also racing with the actual write |
858 // on the GrowUserBuffer path because there is no code to exclude the range | 858 // on the GrowUserBuffer path because there is no code to exclude the range |
859 // that is going to be written. | 859 // that is going to be written. |
860 async = false; | 860 async = false; |
861 if (async) { | 861 if (async) { |
862 if (!file->PostWrite(user_buffers_[index].get(), len, offset)) | 862 if (!file->PostWrite(user_buffers_[index].get(), len, offset)) |
863 return false; | 863 return false; |
| 864 // The buffer is deleted from the PostWrite operation. |
| 865 ignore_result(user_buffers_[index].release()); |
864 } else { | 866 } else { |
865 if (!file->Write(user_buffers_[index].get(), len, offset, NULL, NULL)) | 867 if (!file->Write(user_buffers_[index].get(), len, offset, NULL, NULL)) |
866 return false; | 868 return false; |
867 user_buffers_[index].reset(NULL); | 869 user_buffers_[index].reset(NULL); |
868 } | 870 } |
869 | 871 |
870 // The buffer is deleted from the PostWrite operation. | |
871 user_buffers_[index].release(); | |
872 | |
873 return true; | 872 return true; |
874 } | 873 } |
875 | 874 |
876 int EntryImpl::InitSparseData() { | 875 int EntryImpl::InitSparseData() { |
877 if (sparse_.get()) | 876 if (sparse_.get()) |
878 return net::OK; | 877 return net::OK; |
879 | 878 |
880 sparse_.reset(new SparseControl(this)); | 879 sparse_.reset(new SparseControl(this)); |
881 int result = sparse_->Init(); | 880 int result = sparse_->Init(); |
882 if (net::OK != result) | 881 if (net::OK != result) |
883 sparse_.reset(); | 882 sparse_.reset(); |
884 return result; | 883 return result; |
885 } | 884 } |
886 | 885 |
887 void EntryImpl::SetEntryFlags(uint32 flags) { | 886 void EntryImpl::SetEntryFlags(uint32 flags) { |
888 entry_.Data()->flags |= flags; | 887 entry_.Data()->flags |= flags; |
889 entry_.set_modified(); | 888 entry_.set_modified(); |
890 } | 889 } |
891 | 890 |
892 uint32 EntryImpl::GetEntryFlags() { | 891 uint32 EntryImpl::GetEntryFlags() { |
893 return entry_.Data()->flags; | 892 return entry_.Data()->flags; |
894 } | 893 } |
895 | 894 |
896 void EntryImpl::GetData(int index, char** buffer, Addr* address) { | 895 void EntryImpl::GetData(int index, char** buffer, Addr* address) { |
897 if (user_buffers_[index].get()) { | 896 if (user_buffers_[index].get()) { |
898 // The data is already in memory, just copy it an we're done. | 897 // The data is already in memory, just copy it and we're done. |
899 int data_len = entry_.Data()->data_size[index]; | 898 int data_len = entry_.Data()->data_size[index]; |
900 DCHECK(data_len <= kMaxBlockSize); | 899 DCHECK(data_len <= kMaxBlockSize); |
901 *buffer = new char[data_len]; | 900 *buffer = new char[data_len]; |
902 memcpy(*buffer, user_buffers_[index].get(), data_len); | 901 memcpy(*buffer, user_buffers_[index].get(), data_len); |
903 return; | 902 return; |
904 } | 903 } |
905 | 904 |
906 // Bad news: we'd have to read the info from disk so instead we'll just tell | 905 // Bad news: we'd have to read the info from disk so instead we'll just tell |
907 // the caller where to read from. | 906 // the caller where to read from. |
908 *buffer = NULL; | 907 *buffer = NULL; |
(...skipping 16 matching lines...) Expand all Loading... |
925 Trace("%s 0x%p 0x%x 0x%x", msg, reinterpret_cast<void*>(this), | 924 Trace("%s 0x%p 0x%x 0x%x", msg, reinterpret_cast<void*>(this), |
926 entry_.address().value(), node_.address().value()); | 925 entry_.address().value(), node_.address().value()); |
927 | 926 |
928 Trace(" data: 0x%x 0x%x 0x%x", entry_.Data()->data_addr[0], | 927 Trace(" data: 0x%x 0x%x 0x%x", entry_.Data()->data_addr[0], |
929 entry_.Data()->data_addr[1], entry_.Data()->long_key); | 928 entry_.Data()->data_addr[1], entry_.Data()->long_key); |
930 | 929 |
931 Trace(" doomed: %d 0x%x", doomed_, dirty); | 930 Trace(" doomed: %d 0x%x", doomed_, dirty); |
932 } | 931 } |
933 | 932 |
934 } // namespace disk_cache | 933 } // namespace disk_cache |
OLD | NEW |