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

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

Issue 2841034: Disk cache: Switch the disk cache to use the cache_thread.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Fix tsan issues Created 10 years, 5 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
Property Changes:
Deleted: svn:mergeinfo
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/file.h" 5 #include "net/disk_cache/file.h"
6 6
7 #include <fcntl.h> 7 #include <fcntl.h>
8 8
9 #include <set> 9 #include <set>
10 10
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 186
187 // --------------------------------------------------------------------------- 187 // ---------------------------------------------------------------------------
188 188
189 void InFlightIO::PostRead(disk_cache::File *file, void* buf, size_t buf_len, 189 void InFlightIO::PostRead(disk_cache::File *file, void* buf, size_t buf_len,
190 size_t offset, disk_cache::FileIOCallback *callback) { 190 size_t offset, disk_cache::FileIOCallback *callback) {
191 scoped_refptr<BackgroundIO> operation = 191 scoped_refptr<BackgroundIO> operation =
192 new BackgroundIO(file, buf, buf_len, offset, callback, this); 192 new BackgroundIO(file, buf, buf_len, offset, callback, this);
193 io_list_.insert(operation.get()); 193 io_list_.insert(operation.get());
194 file->AddRef(); // Balanced on InvokeCallback() 194 file->AddRef(); // Balanced on InvokeCallback()
195 195
196 if (!callback_thread_)
197 callback_thread_ = MessageLoop::current();
198
196 WorkerPool::PostTask(FROM_HERE, 199 WorkerPool::PostTask(FROM_HERE,
197 NewRunnableMethod(operation.get(), &BackgroundIO::Read), 200 NewRunnableMethod(operation.get(), &BackgroundIO::Read),
198 true); 201 true);
199 } 202 }
200 203
201 void InFlightIO::PostWrite(disk_cache::File* file, const void* buf, 204 void InFlightIO::PostWrite(disk_cache::File* file, const void* buf,
202 size_t buf_len, size_t offset, 205 size_t buf_len, size_t offset,
203 disk_cache::FileIOCallback* callback, 206 disk_cache::FileIOCallback* callback,
204 bool delete_buffer) { 207 bool delete_buffer) {
205 scoped_refptr<BackgroundIO> operation = 208 scoped_refptr<BackgroundIO> operation =
206 new BackgroundIO(file, buf, buf_len, offset, callback, this); 209 new BackgroundIO(file, buf, buf_len, offset, callback, this);
207 io_list_.insert(operation.get()); 210 io_list_.insert(operation.get());
208 file->AddRef(); // Balanced on InvokeCallback() 211 file->AddRef(); // Balanced on InvokeCallback()
209 212
213 if (!callback_thread_)
214 callback_thread_ = MessageLoop::current();
215
210 WorkerPool::PostTask(FROM_HERE, 216 WorkerPool::PostTask(FROM_HERE,
211 NewRunnableMethod(operation.get(), &BackgroundIO::Write, 217 NewRunnableMethod(operation.get(), &BackgroundIO::Write,
212 delete_buffer), 218 delete_buffer),
213 true); 219 true);
214 } 220 }
215 221
216 void InFlightIO::WaitForPendingIO() { 222 void InFlightIO::WaitForPendingIO() {
217 while (!io_list_.empty()) { 223 while (!io_list_.empty()) {
218 // Block the current thread until all pending IO completes. 224 // Block the current thread until all pending IO completes.
219 IOList::iterator it = io_list_.begin(); 225 IOList::iterator it = io_list_.begin();
220 InvokeCallback(*it, true); 226 InvokeCallback(*it, true);
221 } 227 }
228 // Unit tests can use different threads.
229 callback_thread_ = NULL;
222 } 230 }
223 231
224 // Runs on a worker thread. 232 // Runs on a worker thread.
225 void InFlightIO::OnIOComplete(BackgroundIO* operation) { 233 void InFlightIO::OnIOComplete(BackgroundIO* operation) {
226 callback_thread_->PostTask(FROM_HERE, 234 callback_thread_->PostTask(FROM_HERE,
227 NewRunnableMethod(operation, 235 NewRunnableMethod(operation,
228 &BackgroundIO::OnIOSignalled)); 236 &BackgroundIO::OnIOSignalled));
229 operation->io_completed()->Signal(); 237 operation->io_completed()->Signal();
230 } 238 }
231 239
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 } 373 }
366 374
367 size_t File::GetLength() { 375 size_t File::GetLength() {
368 DCHECK(init_); 376 DCHECK(init_);
369 size_t ret = lseek(platform_file_, 0, SEEK_END); 377 size_t ret = lseek(platform_file_, 0, SEEK_END);
370 return ret; 378 return ret;
371 } 379 }
372 380
373 // Static. 381 // Static.
374 void File::WaitForPendingIO(int* num_pending_io) { 382 void File::WaitForPendingIO(int* num_pending_io) {
375 if (*num_pending_io) 383 // We may be running unit tests so we should allow InFlightIO to reset the
376 Singleton<InFlightIO>::get()->WaitForPendingIO(); 384 // message loop.
385 Singleton<InFlightIO>::get()->WaitForPendingIO();
377 } 386 }
378 387
379 } // namespace disk_cache 388 } // namespace disk_cache
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698