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

Unified Diff: chrome/browser/chromeos/file_system_provider/fileapi/file_stream_writer.cc

Issue 845083005: [fsp] Simplify aborting logic. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed a comment. Created 5 years, 11 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/file_system_provider/fileapi/file_stream_writer.cc
diff --git a/chrome/browser/chromeos/file_system_provider/fileapi/file_stream_writer.cc b/chrome/browser/chromeos/file_system_provider/fileapi/file_stream_writer.cc
index 227ddaa604acb96d04e584fe9424b16b07ef3afe..51997f8af205b0346de5247dbe1a818a674b44a4 100644
--- a/chrome/browser/chromeos/file_system_provider/fileapi/file_stream_writer.cc
+++ b/chrome/browser/chromeos/file_system_provider/fileapi/file_stream_writer.cc
@@ -38,6 +38,7 @@ class FileStreamWriter::OperationRunner
const storage::FileSystemURL& url,
const storage::AsyncFileUtil::StatusCallback& callback) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ DCHECK(abort_callback_.is_null());
util::FileSystemURLParser parser(url);
if (!parser.Parse()) {
@@ -60,6 +61,8 @@ class FileStreamWriter::OperationRunner
// UI thread.
void CloseFileOnUIThread() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ DCHECK(abort_callback_.is_null());
+
if (file_system_.get() && file_handle_ != -1) {
// Closing a file must not be aborted, since we could end up on files
// which are never closed.
@@ -75,6 +78,7 @@ class FileStreamWriter::OperationRunner
int length,
const storage::AsyncFileUtil::StatusCallback& callback) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ DCHECK(abort_callback_.is_null());
// If the file system got unmounted, then abort the writing operation.
if (!file_system_.get()) {
@@ -94,23 +98,15 @@ class FileStreamWriter::OperationRunner
&OperationRunner::OnWriteFileCompletedOnUIThread, this, callback));
}
- // Aborts the most recent operation (if exists), and calls the callback.
- void AbortOnUIThread(const storage::AsyncFileUtil::StatusCallback& callback) {
+ // Aborts the most recent operation (if exists).
+ void AbortOnUIThread() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
- if (abort_callback_.is_null()) {
- // No operation to be cancelled. At most a callback call, which will be
- // discarded.
- BrowserThread::PostTask(BrowserThread::IO,
- FROM_HERE,
- base::Bind(callback, base::File::FILE_OK));
+ if (abort_callback_.is_null())
return;
- }
const AbortCallback last_abort_callback = abort_callback_;
abort_callback_ = AbortCallback();
- last_abort_callback.Run(base::Bind(
- &OperationRunner::OnAbortCompletedOnUIThread, this, callback));
+ last_abort_callback.Run();
}
private:
@@ -126,6 +122,7 @@ class FileStreamWriter::OperationRunner
base::File::Error result) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ abort_callback_ = AbortCallback();
if (result == base::File::FILE_OK)
file_handle_ = file_handle;
@@ -138,15 +135,8 @@ class FileStreamWriter::OperationRunner
const storage::AsyncFileUtil::StatusCallback& callback,
base::File::Error result) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
- BrowserThread::PostTask(
- BrowserThread::IO, FROM_HERE, base::Bind(callback, result));
- }
- // Forwards a response of aborting an operation to the IO thread.
- void OnAbortCompletedOnUIThread(
- const storage::AsyncFileUtil::StatusCallback& callback,
- base::File::Error result) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ abort_callback_ = AbortCallback();
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE, base::Bind(callback, result));
}
@@ -252,6 +242,7 @@ int FileStreamWriter::Write(net::IOBuffer* buffer,
callback));
break;
+ case EXECUTING:
case FAILED:
NOTREACHED();
break;
@@ -263,18 +254,22 @@ int FileStreamWriter::Write(net::IOBuffer* buffer,
int FileStreamWriter::Cancel(const net::CompletionCallback& callback) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ if (state_ != INITIALIZING && state_ != EXECUTING)
+ return net::ERR_UNEXPECTED;
+
+ // Abort and Optimistically return an OK result code, as the aborting
+ // operation is always forced and can't be cancelled.
BrowserThread::PostTask(
- BrowserThread::UI,
- FROM_HERE,
- base::Bind(&OperationRunner::AbortOnUIThread,
- runner_,
- base::Bind(&FileStreamWriter::OnAbortCompleted,
- weak_ptr_factory_.GetWeakPtr(),
- callback)));
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(&OperationRunner::AbortOnUIThread, runner_));
+ base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+ base::Bind(callback, net::OK));
+
return net::ERR_IO_PENDING;
}
int FileStreamWriter::Flush(const net::CompletionCallback& callback) {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
base::Bind(callback, state_ == INITIALIZED ? net::OK : net::ERR_FAILED));
@@ -287,7 +282,8 @@ void FileStreamWriter::OnWriteFileCompleted(
const net::CompletionCallback& callback,
base::File::Error result) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
- DCHECK_EQ(INITIALIZED, state_);
+ DCHECK_EQ(EXECUTING, state_);
+ state_ = INITIALIZED;
if (result != base::File::FILE_OK) {
state_ = FAILED;
@@ -307,22 +303,13 @@ void FileStreamWriter::OnWriteCompleted(net::CompletionCallback callback,
"file_system_provider", "FileStreamWriter::Write", this);
}
-void FileStreamWriter::OnAbortCompleted(const net::CompletionCallback& callback,
- base::File::Error result) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
- if (result != base::File::FILE_OK)
- state_ = FAILED;
-
- callback.Run(net::FileErrorToNetError(result));
-}
-
void FileStreamWriter::WriteAfterInitialized(
scoped_refptr<net::IOBuffer> buffer,
int buffer_length,
const net::CompletionCallback& callback) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
DCHECK_EQ(INITIALIZED, state_);
+ state_ = EXECUTING;
BrowserThread::PostTask(
BrowserThread::UI,

Powered by Google App Engine
This is Rietveld 408576698