Index: chrome/browser/chromeos/file_system_provider/fileapi/file_stream_reader.cc |
diff --git a/chrome/browser/chromeos/file_system_provider/fileapi/file_stream_reader.cc b/chrome/browser/chromeos/file_system_provider/fileapi/file_stream_reader.cc |
index 3f9a935cb064e2ac66b86b55fb11a981cdff96bf..0a5e557c6f49fec669602a681659373c1d4a76b2 100644 |
--- a/chrome/browser/chromeos/file_system_provider/fileapi/file_stream_reader.cc |
+++ b/chrome/browser/chromeos/file_system_provider/fileapi/file_stream_reader.cc |
@@ -44,6 +44,7 @@ class FileStreamReader::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()) { |
@@ -67,6 +68,8 @@ class FileStreamReader::OperationRunner |
// Must be called on 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. |
@@ -84,6 +87,7 @@ class FileStreamReader::OperationRunner |
int length, |
const ProvidedFileSystemInterface::ReadChunkReceivedCallback& callback) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ DCHECK(abort_callback_.is_null()); |
// If the file system got unmounted, then abort the reading operation. |
if (!file_system_.get()) { |
@@ -109,6 +113,7 @@ class FileStreamReader::OperationRunner |
void GetMetadataOnUIThread( |
const ProvidedFileSystemInterface::GetMetadataCallback& callback) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ DCHECK(abort_callback_.is_null()); |
// If the file system got unmounted, then abort the get length operation. |
if (!file_system_.get()) { |
@@ -130,22 +135,14 @@ class FileStreamReader::OperationRunner |
} |
// Aborts the most recent operation (if exists), and calls the callback. |
- void AbortOnUIThread(const storage::AsyncFileUtil::StatusCallback& callback) { |
+ 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: |
@@ -160,6 +157,7 @@ class FileStreamReader::OperationRunner |
int file_handle, |
base::File::Error result) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ abort_callback_ = AbortCallback(); |
if (result == base::File::FILE_OK) |
file_handle_ = file_handle; |
@@ -174,6 +172,8 @@ class FileStreamReader::OperationRunner |
scoped_ptr<EntryMetadata> metadata, |
base::File::Error result) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ abort_callback_ = AbortCallback(); |
+ |
BrowserThread::PostTask( |
BrowserThread::IO, |
FROM_HERE, |
@@ -188,21 +188,15 @@ class FileStreamReader::OperationRunner |
bool has_more, |
base::File::Error result) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ if (!has_more) |
+ abort_callback_ = AbortCallback(); |
+ |
BrowserThread::PostTask( |
BrowserThread::IO, |
FROM_HERE, |
base::Bind(chunk_received_callback, chunk_length, has_more, 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); |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, base::Bind(callback, result)); |
- } |
- |
AbortCallback abort_callback_; |
base::WeakPtr<ProvidedFileSystemInterface> file_system_; |
base::FilePath file_path_; |
@@ -227,11 +221,9 @@ FileStreamReader::FileStreamReader(storage::FileSystemContext* context, |
FileStreamReader::~FileStreamReader() { |
// FileStreamReader doesn't have a Cancel() method like in FileStreamWriter. |
// Therefore, aborting is done from the destructor. |
- BrowserThread::PostTask(BrowserThread::UI, |
- FROM_HERE, |
- base::Bind(&OperationRunner::AbortOnUIThread, |
- runner_, |
- base::Bind(&EmptyStatusCallback))); |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, |
+ base::Bind(&OperationRunner::AbortOnUIThread, runner_)); |
BrowserThread::PostTask( |
BrowserThread::UI, |