summaryrefslogtreecommitdiffstats
path: root/net/base/file_stream_posix.cc
diff options
context:
space:
mode:
Diffstat (limited to 'net/base/file_stream_posix.cc')
-rw-r--r--net/base/file_stream_posix.cc37
1 files changed, 36 insertions, 1 deletions
diff --git a/net/base/file_stream_posix.cc b/net/base/file_stream_posix.cc
index 0cbd0bd..5613fe3 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;