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

Side by Side Diff: net/disk_cache/blockfile/file_win.cc

Issue 266243004: Clang format slam. Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 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) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/blockfile/file.h" 5 #include "net/disk_cache/blockfile/file.h"
6 6
7 #include "base/files/file_path.h" 7 #include "base/files/file_path.h"
8 #include "base/lazy_instance.h" 8 #include "base/lazy_instance.h"
9 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
10 #include "net/base/net_errors.h" 10 #include "net/base/net_errors.h"
11 #include "net/disk_cache/disk_cache.h" 11 #include "net/disk_cache/disk_cache.h"
12 12
13 namespace { 13 namespace {
14 14
15 // Structure used for asynchronous operations. 15 // Structure used for asynchronous operations.
16 struct MyOverlapped { 16 struct MyOverlapped {
17 MyOverlapped(disk_cache::File* file, size_t offset, 17 MyOverlapped(disk_cache::File* file,
18 size_t offset,
18 disk_cache::FileIOCallback* callback); 19 disk_cache::FileIOCallback* callback);
19 ~MyOverlapped() {} 20 ~MyOverlapped() {}
20 OVERLAPPED* overlapped() { 21 OVERLAPPED* overlapped() { return &context_.overlapped; }
21 return &context_.overlapped;
22 }
23 22
24 base::MessageLoopForIO::IOContext context_; 23 base::MessageLoopForIO::IOContext context_;
25 scoped_refptr<disk_cache::File> file_; 24 scoped_refptr<disk_cache::File> file_;
26 disk_cache::FileIOCallback* callback_; 25 disk_cache::FileIOCallback* callback_;
27 }; 26 };
28 27
29 COMPILE_ASSERT(!offsetof(MyOverlapped, context_), starts_with_overlapped); 28 COMPILE_ASSERT(!offsetof(MyOverlapped, context_), starts_with_overlapped);
30 29
31 // Helper class to handle the IO completion notifications from the message loop. 30 // Helper class to handle the IO completion notifications from the message loop.
32 class CompletionHandler : public base::MessageLoopForIO::IOHandler { 31 class CompletionHandler : public base::MessageLoopForIO::IOHandler {
(...skipping 16 matching lines...) Expand all
49 actual_bytes = static_cast<DWORD>(net::ERR_CACHE_READ_FAILURE); 48 actual_bytes = static_cast<DWORD>(net::ERR_CACHE_READ_FAILURE);
50 NOTREACHED(); 49 NOTREACHED();
51 } 50 }
52 51
53 if (data->callback_) 52 if (data->callback_)
54 data->callback_->OnFileIOComplete(static_cast<int>(actual_bytes)); 53 data->callback_->OnFileIOComplete(static_cast<int>(actual_bytes));
55 54
56 delete data; 55 delete data;
57 } 56 }
58 57
59 MyOverlapped::MyOverlapped(disk_cache::File* file, size_t offset, 58 MyOverlapped::MyOverlapped(disk_cache::File* file,
59 size_t offset,
60 disk_cache::FileIOCallback* callback) { 60 disk_cache::FileIOCallback* callback) {
61 memset(this, 0, sizeof(*this)); 61 memset(this, 0, sizeof(*this));
62 context_.handler = g_completion_handler.Pointer(); 62 context_.handler = g_completion_handler.Pointer();
63 context_.overlapped.Offset = static_cast<DWORD>(offset); 63 context_.overlapped.Offset = static_cast<DWORD>(offset);
64 file_ = file; 64 file_ = file;
65 callback_ = callback; 65 callback_ = callback;
66 } 66 }
67 67
68 } // namespace 68 } // namespace
69 69
70 namespace disk_cache { 70 namespace disk_cache {
71 71
72 File::File(base::File file) 72 File::File(base::File file)
73 : init_(true), 73 : init_(true), mixed_(true), sync_base_file_(file.Pass()) {
74 mixed_(true),
75 sync_base_file_(file.Pass()) {
76 } 74 }
77 75
78 bool File::Init(const base::FilePath& name) { 76 bool File::Init(const base::FilePath& name) {
79 DCHECK(!init_); 77 DCHECK(!init_);
80 if (init_) 78 if (init_)
81 return false; 79 return false;
82 80
83 DWORD sharing = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE; 81 DWORD sharing = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE;
84 DWORD access = GENERIC_READ | GENERIC_WRITE | DELETE; 82 DWORD access = GENERIC_READ | GENERIC_WRITE | DELETE;
85 base_file_ = 83 base_file_ = base::File(CreateFile(name.value().c_str(),
86 base::File(CreateFile(name.value().c_str(), access, sharing, NULL, 84 access,
87 OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL)); 85 sharing,
86 NULL,
87 OPEN_EXISTING,
88 FILE_FLAG_OVERLAPPED,
89 NULL));
88 90
89 if (!base_file_.IsValid()) 91 if (!base_file_.IsValid())
90 return false; 92 return false;
91 93
92 base::MessageLoopForIO::current()->RegisterIOHandler( 94 base::MessageLoopForIO::current()->RegisterIOHandler(
93 base_file_.GetPlatformFile(), g_completion_handler.Pointer()); 95 base_file_.GetPlatformFile(), g_completion_handler.Pointer());
94 96
95 init_ = true; 97 init_ = true;
96 sync_base_file_ = 98 sync_base_file_ = base::File(CreateFile(
97 base::File(CreateFile(name.value().c_str(), access, sharing, NULL, 99 name.value().c_str(), access, sharing, NULL, OPEN_EXISTING, 0, NULL));
98 OPEN_EXISTING, 0, NULL));
99 100
100 if (!sync_base_file_.IsValid()) 101 if (!sync_base_file_.IsValid())
101 return false; 102 return false;
102 103
103 return true; 104 return true;
104 } 105 }
105 106
106 bool File::IsValid() const { 107 bool File::IsValid() const {
107 if (!init_) 108 if (!init_)
108 return false; 109 return false;
109 return base_file_.IsValid() || sync_base_file_.IsValid(); 110 return base_file_.IsValid() || sync_base_file_.IsValid();
110 } 111 }
111 112
112 bool File::Read(void* buffer, size_t buffer_len, size_t offset) { 113 bool File::Read(void* buffer, size_t buffer_len, size_t offset) {
113 DCHECK(init_); 114 DCHECK(init_);
114 if (buffer_len > ULONG_MAX || offset > LONG_MAX) 115 if (buffer_len > ULONG_MAX || offset > LONG_MAX)
115 return false; 116 return false;
116 117
117 int ret = sync_base_file_.Read(offset, static_cast<char*>(buffer), 118 int ret =
118 buffer_len); 119 sync_base_file_.Read(offset, static_cast<char*>(buffer), buffer_len);
119 return static_cast<int>(buffer_len) == ret; 120 return static_cast<int>(buffer_len) == ret;
120 } 121 }
121 122
122 bool File::Write(const void* buffer, size_t buffer_len, size_t offset) { 123 bool File::Write(const void* buffer, size_t buffer_len, size_t offset) {
123 DCHECK(init_); 124 DCHECK(init_);
124 if (buffer_len > ULONG_MAX || offset > ULONG_MAX) 125 if (buffer_len > ULONG_MAX || offset > ULONG_MAX)
125 return false; 126 return false;
126 127
127 int ret = sync_base_file_.Write(offset, static_cast<const char*>(buffer), 128 int ret = sync_base_file_.Write(
128 buffer_len); 129 offset, static_cast<const char*>(buffer), buffer_len);
129 return static_cast<int>(buffer_len) == ret; 130 return static_cast<int>(buffer_len) == ret;
130 } 131 }
131 132
132 // We have to increase the ref counter of the file before performing the IO to 133 // We have to increase the ref counter of the file before performing the IO to
133 // prevent the completion to happen with an invalid handle (if the file is 134 // prevent the completion to happen with an invalid handle (if the file is
134 // closed while the IO is in flight). 135 // closed while the IO is in flight).
135 bool File::Read(void* buffer, size_t buffer_len, size_t offset, 136 bool File::Read(void* buffer,
136 FileIOCallback* callback, bool* completed) { 137 size_t buffer_len,
138 size_t offset,
139 FileIOCallback* callback,
140 bool* completed) {
137 DCHECK(init_); 141 DCHECK(init_);
138 if (!callback) { 142 if (!callback) {
139 if (completed) 143 if (completed)
140 *completed = true; 144 *completed = true;
141 return Read(buffer, buffer_len, offset); 145 return Read(buffer, buffer_len, offset);
142 } 146 }
143 147
144 if (buffer_len > ULONG_MAX || offset > ULONG_MAX) 148 if (buffer_len > ULONG_MAX || offset > ULONG_MAX)
145 return false; 149 return false;
146 150
147 MyOverlapped* data = new MyOverlapped(this, offset, callback); 151 MyOverlapped* data = new MyOverlapped(this, offset, callback);
148 DWORD size = static_cast<DWORD>(buffer_len); 152 DWORD size = static_cast<DWORD>(buffer_len);
149 153
150 DWORD actual; 154 DWORD actual;
151 if (!ReadFile(base_file_.GetPlatformFile(), buffer, size, &actual, 155 if (!ReadFile(base_file_.GetPlatformFile(),
156 buffer,
157 size,
158 &actual,
152 data->overlapped())) { 159 data->overlapped())) {
153 *completed = false; 160 *completed = false;
154 if (GetLastError() == ERROR_IO_PENDING) 161 if (GetLastError() == ERROR_IO_PENDING)
155 return true; 162 return true;
156 delete data; 163 delete data;
157 return false; 164 return false;
158 } 165 }
159 166
160 // The operation completed already. We'll be called back anyway. 167 // The operation completed already. We'll be called back anyway.
161 *completed = (actual == size); 168 *completed = (actual == size);
162 DCHECK_EQ(size, actual); 169 DCHECK_EQ(size, actual);
163 data->callback_ = NULL; 170 data->callback_ = NULL;
164 data->file_ = NULL; // There is no reason to hold on to this anymore. 171 data->file_ = NULL; // There is no reason to hold on to this anymore.
165 return *completed; 172 return *completed;
166 } 173 }
167 174
168 bool File::Write(const void* buffer, size_t buffer_len, size_t offset, 175 bool File::Write(const void* buffer,
169 FileIOCallback* callback, bool* completed) { 176 size_t buffer_len,
177 size_t offset,
178 FileIOCallback* callback,
179 bool* completed) {
170 DCHECK(init_); 180 DCHECK(init_);
171 if (!callback) { 181 if (!callback) {
172 if (completed) 182 if (completed)
173 *completed = true; 183 *completed = true;
174 return Write(buffer, buffer_len, offset); 184 return Write(buffer, buffer_len, offset);
175 } 185 }
176 186
177 return AsyncWrite(buffer, buffer_len, offset, callback, completed); 187 return AsyncWrite(buffer, buffer_len, offset, callback, completed);
178 } 188 }
179 189
180 File::~File() { 190 File::~File() {
181 } 191 }
182 192
183 base::PlatformFile File::platform_file() const { 193 base::PlatformFile File::platform_file() const {
184 DCHECK(init_); 194 DCHECK(init_);
185 return base_file_.IsValid() ? base_file_.GetPlatformFile() : 195 return base_file_.IsValid() ? base_file_.GetPlatformFile()
186 sync_base_file_.GetPlatformFile(); 196 : sync_base_file_.GetPlatformFile();
187 } 197 }
188 198
189 bool File::AsyncWrite(const void* buffer, size_t buffer_len, size_t offset, 199 bool File::AsyncWrite(const void* buffer,
190 FileIOCallback* callback, bool* completed) { 200 size_t buffer_len,
201 size_t offset,
202 FileIOCallback* callback,
203 bool* completed) {
191 DCHECK(init_); 204 DCHECK(init_);
192 DCHECK(callback); 205 DCHECK(callback);
193 DCHECK(completed); 206 DCHECK(completed);
194 if (buffer_len > ULONG_MAX || offset > ULONG_MAX) 207 if (buffer_len > ULONG_MAX || offset > ULONG_MAX)
195 return false; 208 return false;
196 209
197 MyOverlapped* data = new MyOverlapped(this, offset, callback); 210 MyOverlapped* data = new MyOverlapped(this, offset, callback);
198 DWORD size = static_cast<DWORD>(buffer_len); 211 DWORD size = static_cast<DWORD>(buffer_len);
199 212
200 DWORD actual; 213 DWORD actual;
201 if (!WriteFile(base_file_.GetPlatformFile(), buffer, size, &actual, 214 if (!WriteFile(base_file_.GetPlatformFile(),
215 buffer,
216 size,
217 &actual,
202 data->overlapped())) { 218 data->overlapped())) {
203 *completed = false; 219 *completed = false;
204 if (GetLastError() == ERROR_IO_PENDING) 220 if (GetLastError() == ERROR_IO_PENDING)
205 return true; 221 return true;
206 delete data; 222 delete data;
207 return false; 223 return false;
208 } 224 }
209 225
210 // The operation completed already. We'll be called back anyway. 226 // The operation completed already. We'll be called back anyway.
211 *completed = (actual == size); 227 *completed = (actual == size);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 base::MessageLoopForIO::IOHandler* handler = g_completion_handler.Pointer(); 264 base::MessageLoopForIO::IOHandler* handler = g_completion_handler.Pointer();
249 base::MessageLoopForIO::current()->WaitForIOCompletion(100, handler); 265 base::MessageLoopForIO::current()->WaitForIOCompletion(100, handler);
250 } 266 }
251 } 267 }
252 268
253 // Static. 269 // Static.
254 void File::DropPendingIO() { 270 void File::DropPendingIO() {
255 } 271 }
256 272
257 } // namespace disk_cache 273 } // namespace disk_cache
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698