Index: net/base/file_stream_posix.cc |
diff --git a/net/base/file_stream_posix.cc b/net/base/file_stream_posix.cc |
index 0cbd0bdc794a9922829825772779b08d0ff1da0a..5613fe3a11ec79cbb3f9f7bff7f503e439968cdc 100644 |
--- a/net/base/file_stream_posix.cc |
+++ b/net/base/file_stream_posix.cc |
@@ -231,6 +231,16 @@ int FlushFile(base::PlatformFile file, |
return res; |
} |
+// Flushes a file using FlushFile() and signals the completion. |
+void FlushFileAndSignal(base::PlatformFile file, |
+ int* result, |
+ bool record_uma, |
+ base::WaitableEvent* on_io_complete, |
+ const net::BoundNetLog& bound_net_log) { |
+ *result = FlushFile(file, record_uma, bound_net_log); |
+ on_io_complete->Signal(); |
+} |
+ |
// Called when Read(), Write() or Seek() is completed. |
// |result| contains the result or a network error code. |
template <typename R> |
@@ -588,7 +598,32 @@ int64 FileStreamPosix::Truncate(int64 bytes) { |
bound_net_log_); |
} |
-int FileStreamPosix::Flush() { |
+int FileStreamPosix::Flush(const CompletionCallback& callback) { |
+ if (!IsOpen()) |
+ return ERR_UNEXPECTED; |
+ |
+ // Make sure we're async and we have no other in-flight async operations. |
+ DCHECK(open_flags_ & base::PLATFORM_FILE_ASYNC); |
+ DCHECK(!weak_ptr_factory_.HasWeakPtrs()); |
+ DCHECK(!on_io_complete_.get()); |
+ |
+ on_io_complete_.reset(new base::WaitableEvent( |
+ false /* manual_reset */, false /* initially_signaled */)); |
+ |
+ int* result = new int(OK); |
+ const bool posted = base::WorkerPool::PostTaskAndReply( |
+ FROM_HERE, |
+ base::Bind(&FlushFileAndSignal, file_, result, |
+ record_uma_, on_io_complete_.get(), bound_net_log_), |
+ base::Bind(&OnIOComplete<int>, |
+ weak_ptr_factory_.GetWeakPtr(), |
+ callback, base::Owned(result)), |
+ true /* task is slow */); |
+ DCHECK(posted); |
+ return ERR_IO_PENDING; |
+} |
+ |
+int FileStreamPosix::FlushSync() { |
if (!IsOpen()) |
return ERR_UNEXPECTED; |