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

Side by Side Diff: net/base/file_stream_posix.cc

Issue 11030044: Merge 159454 - Flush at the end of local file writing in FileWriter API. (Closed) Base URL: svn://svn.chromium.org/chrome/branches/1271/src/
Patch Set: Created 8 years, 2 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/base/file_stream_posix.h ('k') | net/base/file_stream_win.h » ('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) 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 // For 64-bit file access (off_t = off64_t, lseek64, etc). 5 // For 64-bit file access (off_t = off64_t, lseek64, etc).
6 #define _FILE_OFFSET_BITS 64 6 #define _FILE_OFFSET_BITS 64
7 7
8 #include "net/base/file_stream.h" 8 #include "net/base/file_stream.h"
9 9
10 #include <sys/types.h> 10 #include <sys/types.h>
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
224 const net::BoundNetLog& bound_net_log) { 224 const net::BoundNetLog& bound_net_log) {
225 base::ThreadRestrictions::AssertIOAllowed(); 225 base::ThreadRestrictions::AssertIOAllowed();
226 ssize_t res = HANDLE_EINTR(fsync(file)); 226 ssize_t res = HANDLE_EINTR(fsync(file));
227 if (res == -1) { 227 if (res == -1) {
228 res = RecordAndMapError(errno, FILE_ERROR_SOURCE_FLUSH, record_uma, 228 res = RecordAndMapError(errno, FILE_ERROR_SOURCE_FLUSH, record_uma,
229 bound_net_log); 229 bound_net_log);
230 } 230 }
231 return res; 231 return res;
232 } 232 }
233 233
234 // Flushes a file using FlushFile() and signals the completion.
235 void FlushFileAndSignal(base::PlatformFile file,
236 int* result,
237 bool record_uma,
238 base::WaitableEvent* on_io_complete,
239 const net::BoundNetLog& bound_net_log) {
240 *result = FlushFile(file, record_uma, bound_net_log);
241 on_io_complete->Signal();
242 }
243
234 // Called when Read(), Write() or Seek() is completed. 244 // Called when Read(), Write() or Seek() is completed.
235 // |result| contains the result or a network error code. 245 // |result| contains the result or a network error code.
236 template <typename R> 246 template <typename R>
237 void OnIOComplete(const base::WeakPtr<FileStreamPosix>& stream, 247 void OnIOComplete(const base::WeakPtr<FileStreamPosix>& stream,
238 const base::Callback<void(R)>& callback, 248 const base::Callback<void(R)>& callback,
239 R* result) { 249 R* result) {
240 if (!stream.get()) 250 if (!stream.get())
241 return; 251 return;
242 252
243 // Reset this before Run() as Run() may issue a new async operation. 253 // Reset this before Run() as Run() may issue a new async operation.
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 int result = ftruncate(file_, bytes); 591 int result = ftruncate(file_, bytes);
582 if (result == 0) 592 if (result == 0)
583 return seek_position; 593 return seek_position;
584 594
585 return RecordAndMapError(errno, 595 return RecordAndMapError(errno,
586 FILE_ERROR_SOURCE_SET_EOF, 596 FILE_ERROR_SOURCE_SET_EOF,
587 record_uma_, 597 record_uma_,
588 bound_net_log_); 598 bound_net_log_);
589 } 599 }
590 600
591 int FileStreamPosix::Flush() { 601 int FileStreamPosix::Flush(const CompletionCallback& callback) {
602 if (!IsOpen())
603 return ERR_UNEXPECTED;
604
605 // Make sure we're async and we have no other in-flight async operations.
606 DCHECK(open_flags_ & base::PLATFORM_FILE_ASYNC);
607 DCHECK(!weak_ptr_factory_.HasWeakPtrs());
608 DCHECK(!on_io_complete_.get());
609
610 on_io_complete_.reset(new base::WaitableEvent(
611 false /* manual_reset */, false /* initially_signaled */));
612
613 int* result = new int(OK);
614 const bool posted = base::WorkerPool::PostTaskAndReply(
615 FROM_HERE,
616 base::Bind(&FlushFileAndSignal, file_, result,
617 record_uma_, on_io_complete_.get(), bound_net_log_),
618 base::Bind(&OnIOComplete<int>,
619 weak_ptr_factory_.GetWeakPtr(),
620 callback, base::Owned(result)),
621 true /* task is slow */);
622 DCHECK(posted);
623 return ERR_IO_PENDING;
624 }
625
626 int FileStreamPosix::FlushSync() {
592 if (!IsOpen()) 627 if (!IsOpen())
593 return ERR_UNEXPECTED; 628 return ERR_UNEXPECTED;
594 629
595 return FlushFile(file_, record_uma_, bound_net_log_); 630 return FlushFile(file_, record_uma_, bound_net_log_);
596 } 631 }
597 632
598 void FileStreamPosix::EnableErrorStatistics() { 633 void FileStreamPosix::EnableErrorStatistics() {
599 record_uma_ = true; 634 record_uma_ = true;
600 } 635 }
601 636
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
639 void FileStreamPosix::WaitForIOCompletion() { 674 void FileStreamPosix::WaitForIOCompletion() {
640 // http://crbug.com/115067 675 // http://crbug.com/115067
641 base::ThreadRestrictions::ScopedAllowWait allow_wait; 676 base::ThreadRestrictions::ScopedAllowWait allow_wait;
642 if (on_io_complete_.get()) { 677 if (on_io_complete_.get()) {
643 on_io_complete_->Wait(); 678 on_io_complete_->Wait();
644 on_io_complete_.reset(); 679 on_io_complete_.reset();
645 } 680 }
646 } 681 }
647 682
648 } // namespace net 683 } // namespace net
OLDNEW
« no previous file with comments | « net/base/file_stream_posix.h ('k') | net/base/file_stream_win.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698