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

Side by Side Diff: net/disk_cache/simple/simple_synchronous_entry.cc

Issue 12226095: Make synchronous methods on disk_cache::SimpleEntryImpl() reentrant. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 10 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
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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/simple/simple_synchronous_entry.h" 5 #include "net/disk_cache/simple/simple_synchronous_entry.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cstring> 8 #include <cstring>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
11 #include "base/file_util.h" 11 #include "base/file_util.h"
12 #include "base/hash.h" 12 #include "base/hash.h"
13 #include "base/location.h" 13 #include "base/location.h"
14 #include "base/message_loop_proxy.h" 14 #include "base/message_loop_proxy.h"
15 #include "base/sha1.h" 15 #include "base/sha1.h"
16 #include "base/stringprintf.h" 16 #include "base/stringprintf.h"
17 #include "base/task_runner.h" 17 #include "base/task_runner.h"
18 #include "net/base/io_buffer.h" 18 #include "net/base/io_buffer.h"
19 #include "net/base/net_errors.h" 19 #include "net/base/net_errors.h"
20 #include "net/disk_cache/simple/simple_disk_format.h"
21 20
22 using base::ClosePlatformFile; 21 using base::ClosePlatformFile;
23 using base::GetPlatformFileInfo; 22 using base::GetPlatformFileInfo;
24 using base::PlatformFileError; 23 using base::PlatformFileError;
25 using base::PlatformFileInfo; 24 using base::PlatformFileInfo;
26 using base::PLATFORM_FILE_CREATE_ALWAYS; 25 using base::PLATFORM_FILE_CREATE_ALWAYS;
27 using base::PLATFORM_FILE_OK; 26 using base::PLATFORM_FILE_OK;
28 using base::PLATFORM_FILE_OPEN; 27 using base::PLATFORM_FILE_OPEN;
29 using base::PLATFORM_FILE_READ; 28 using base::PLATFORM_FILE_READ;
30 using base::PLATFORM_FILE_WRITE; 29 using base::PLATFORM_FILE_WRITE;
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 base::Bind(callback, sync_entry, 94 base::Bind(callback, sync_entry,
96 sync_entry ? net::OK : net::ERR_FAILED)); 95 sync_entry ? net::OK : net::ERR_FAILED));
97 } 96 }
98 97
99 // static 98 // static
100 void SimpleSynchronousEntry::DoomEntry( 99 void SimpleSynchronousEntry::DoomEntry(
101 const FilePath& path, 100 const FilePath& path,
102 const std::string& key, 101 const std::string& key,
103 scoped_refptr<TaskRunner> callback_runner, 102 scoped_refptr<TaskRunner> callback_runner,
104 const net::CompletionCallback& callback) { 103 const net::CompletionCallback& callback) {
105 for (int i = 0; i < kIndexCount; ++i) { 104 for (int i = 0; i < kSimpleEntryFileCount; ++i) {
106 bool delete_result = 105 bool delete_result =
107 file_util::Delete(path.AppendASCII(GetFilenameForKeyAndIndex(key, i)), 106 file_util::Delete(path.AppendASCII(GetFilenameForKeyAndIndex(key, i)),
108 false); 107 false);
109 DCHECK(delete_result); 108 DCHECK(delete_result);
110 } 109 }
111 if (!callback.is_null()) 110 if (!callback.is_null())
112 callback_runner->PostTask(FROM_HERE, base::Bind(callback, net::OK)); 111 callback_runner->PostTask(FROM_HERE, base::Bind(callback, net::OK));
113 } 112 }
114 113
115 void SimpleSynchronousEntry::DoomAndClose() { 114 void SimpleSynchronousEntry::DoomAndClose() {
116 scoped_refptr<TaskRunner> callback_runner = callback_runner_; 115 scoped_refptr<TaskRunner> callback_runner = callback_runner_;
117 FilePath path = path_; 116 FilePath path = path_;
118 std::string key = key_; 117 std::string key = key_;
119 118
120 Close(); 119 Close();
121 // |this| is now deleted. 120 // |this| is now deleted.
122 121
123 DoomEntry(path, key, callback_runner, net::CompletionCallback()); 122 DoomEntry(path, key, callback_runner, net::CompletionCallback());
124 } 123 }
125 124
126 void SimpleSynchronousEntry::Close() { 125 void SimpleSynchronousEntry::Close() {
127 for (int i = 0; i < kIndexCount; ++i) { 126 for (int i = 0; i < kSimpleEntryFileCount; ++i) {
128 bool result = ClosePlatformFile(files_[i]); 127 bool result = ClosePlatformFile(files_[i]);
129 DCHECK(result); 128 DCHECK(result);
130 } 129 }
131 delete this; 130 delete this;
132 } 131 }
133 132
134 void SimpleSynchronousEntry::ReadData( 133 void SimpleSynchronousEntry::ReadData(
135 int index, 134 int index,
136 int offset, 135 int offset,
137 net::IOBuffer* buf, 136 net::IOBuffer* buf,
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 const std::string& key) : callback_runner_(callback_runner), 200 const std::string& key) : callback_runner_(callback_runner),
202 path_(path), 201 path_(path),
203 key_(key), 202 key_(key),
204 initialized_(false) { 203 initialized_(false) {
205 } 204 }
206 205
207 SimpleSynchronousEntry::~SimpleSynchronousEntry() { 206 SimpleSynchronousEntry::~SimpleSynchronousEntry() {
208 } 207 }
209 208
210 bool SimpleSynchronousEntry::OpenOrCreateFiles(bool create) { 209 bool SimpleSynchronousEntry::OpenOrCreateFiles(bool create) {
211 for (int i = 0; i < kIndexCount; ++i) { 210 for (int i = 0; i < kSimpleEntryFileCount; ++i) {
212 FilePath filename = path_.AppendASCII(GetFilenameForKeyAndIndex(key_, i)); 211 FilePath filename = path_.AppendASCII(GetFilenameForKeyAndIndex(key_, i));
213 int flags = PLATFORM_FILE_READ | PLATFORM_FILE_WRITE; 212 int flags = PLATFORM_FILE_READ | PLATFORM_FILE_WRITE;
214 if (create) 213 if (create)
215 flags |= PLATFORM_FILE_CREATE_ALWAYS; 214 flags |= PLATFORM_FILE_CREATE_ALWAYS;
216 else 215 else
217 flags |= PLATFORM_FILE_OPEN; 216 flags |= PLATFORM_FILE_OPEN;
218 PlatformFileError error; 217 PlatformFileError error;
219 files_[i] = CreatePlatformFile(filename, flags, NULL, &error); 218 files_[i] = CreatePlatformFile(filename, flags, NULL, &error);
220 if (error != PLATFORM_FILE_OK) { 219 if (error != PLATFORM_FILE_OK) {
221 while (--i >= 0) { 220 while (--i >= 0) {
222 bool did_close = ClosePlatformFile(files_[i]); 221 bool did_close = ClosePlatformFile(files_[i]);
223 DCHECK(did_close); 222 DCHECK(did_close);
224 } 223 }
225 return false; 224 return false;
226 } 225 }
227 } 226 }
228 227
229 for (int i = 0; i < kIndexCount; ++i) { 228 for (int i = 0; i < kSimpleEntryFileCount; ++i) {
230 PlatformFileInfo file_info; 229 PlatformFileInfo file_info;
231 CHECK(GetPlatformFileInfo(files_[i], &file_info)); 230 CHECK(GetPlatformFileInfo(files_[i], &file_info));
232 last_used_ = std::max(last_used_, file_info.last_accessed); 231 last_used_ = std::max(last_used_, file_info.last_accessed);
233 last_modified_ = std::max(last_modified_, file_info.last_modified); 232 last_modified_ = std::max(last_modified_, file_info.last_modified);
234 data_size_[i] = DataSizeFromKeyAndFileSize(key_.size(), file_info.size); 233 data_size_[i] = DataSizeFromKeyAndFileSize(key_.size(), file_info.size);
235 } 234 }
236 235
237 return true; 236 return true;
238 } 237 }
239 238
240 bool SimpleSynchronousEntry::InitializeForOpen() { 239 bool SimpleSynchronousEntry::InitializeForOpen() {
241 DCHECK(!initialized_); 240 DCHECK(!initialized_);
242 if (!OpenOrCreateFiles(false)) 241 if (!OpenOrCreateFiles(false))
243 return false; 242 return false;
244 243
245 for (int i = 0; i < kIndexCount; ++i) { 244 for (int i = 0; i < kSimpleEntryFileCount; ++i) {
246 SimpleFileHeader header; 245 SimpleFileHeader header;
247 if (ReadPlatformFile(files_[i], 0, reinterpret_cast<char*>(&header), 246 if (ReadPlatformFile(files_[i], 0, reinterpret_cast<char*>(&header),
248 sizeof(header)) != sizeof(header)) { 247 sizeof(header)) != sizeof(header)) {
249 return false; 248 return false;
250 } 249 }
251 250
252 if (header.initial_magic_number != kSimpleInitialMagicNumber) { 251 if (header.initial_magic_number != kSimpleInitialMagicNumber) {
253 // TODO(gavinp): This seems very bad; for now we log at WARNING, but we 252 // TODO(gavinp): This seems very bad; for now we log at WARNING, but we
254 // should give consideration to not saturating the log with these if that 253 // should give consideration to not saturating the log with these if that
255 // becomes a problem. 254 // becomes a problem.
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
293 return true; 292 return true;
294 } 293 }
295 294
296 bool SimpleSynchronousEntry::InitializeForCreate() { 295 bool SimpleSynchronousEntry::InitializeForCreate() {
297 DCHECK(!initialized_); 296 DCHECK(!initialized_);
298 if (!OpenOrCreateFiles(true)) { 297 if (!OpenOrCreateFiles(true)) {
299 LOG(ERROR) << "Could not create platform files for key " << key_; 298 LOG(ERROR) << "Could not create platform files for key " << key_;
300 return false; 299 return false;
301 } 300 }
302 301
303 for (int i = 0; i < kIndexCount; ++i) { 302 for (int i = 0; i < kSimpleEntryFileCount; ++i) {
304 SimpleFileHeader header; 303 SimpleFileHeader header;
305 header.initial_magic_number = kSimpleInitialMagicNumber; 304 header.initial_magic_number = kSimpleInitialMagicNumber;
306 header.version = kSimpleVersion; 305 header.version = kSimpleVersion;
307 306
308 header.key_length = key_.size(); 307 header.key_length = key_.size();
309 header.key_hash = base::Hash(key_); 308 header.key_hash = base::Hash(key_);
310 309
311 if (WritePlatformFile(files_[i], 0, reinterpret_cast<char*>(&header), 310 if (WritePlatformFile(files_[i], 0, reinterpret_cast<char*>(&header),
312 sizeof(header)) != sizeof(header)) { 311 sizeof(header)) != sizeof(header)) {
313 // TODO(gavinp): Clean up created files. 312 // TODO(gavinp): Clean up created files.
314 LOG(WARNING) << "Could not write headers to new cache entry."; 313 LOG(WARNING) << "Could not write headers to new cache entry.";
315 return false; 314 return false;
316 } 315 }
317 316
318 if (WritePlatformFile(files_[i], sizeof(header), key_.data(), 317 if (WritePlatformFile(files_[i], sizeof(header), key_.data(),
319 key_.size()) != implicit_cast<int>(key_.size())) { 318 key_.size()) != implicit_cast<int>(key_.size())) {
320 // TODO(gavinp): Clean up created files. 319 // TODO(gavinp): Clean up created files.
321 LOG(WARNING) << "Could not write keys to new cache entry."; 320 LOG(WARNING) << "Could not write keys to new cache entry.";
322 return false; 321 return false;
323 } 322 }
324 } 323 }
325 324
326 initialized_ = true; 325 initialized_ = true;
327 return true; 326 return true;
328 } 327 }
329 328
330 } // namespace disk_cache 329 } // namespace disk_cache
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698