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

Unified Diff: storage/browser/blob/blob_reader.cc

Issue 1513783005: [Blob] Fix for resetting reader. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years 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
« no previous file with comments | « storage/browser/blob/blob_reader.h ('k') | storage/browser/blob/upload_blob_element_reader.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: storage/browser/blob/blob_reader.cc
diff --git a/storage/browser/blob/blob_reader.cc b/storage/browser/blob/blob_reader.cc
index 9c6375d5c7d3b2a782f4554068333d8f81bca628..12f2c4577e89492e8a3b12e5df384c9c8a07678b 100644
--- a/storage/browser/blob/blob_reader.cc
+++ b/storage/browser/blob/blob_reader.cc
@@ -13,7 +13,6 @@
#include "base/time/time.h"
#include "base/trace_event/trace_event.h"
#include "net/base/io_buffer.h"
-#include "net/base/net_errors.h"
#include "net/disk_cache/disk_cache.h"
#include "storage/browser/blob/blob_data_handle.h"
#include "storage/browser/blob/blob_data_snapshot.h"
@@ -43,7 +42,6 @@ BlobReader::BlobReader(
base::SequencedTaskRunner* file_task_runner)
: file_stream_provider_(file_stream_provider.Pass()),
file_task_runner_(file_task_runner),
- net_error_(net::OK),
weak_factory_(this) {
if (blob_handle) {
blob_data_ = blob_handle->CreateSnapshot().Pass();
@@ -51,7 +49,6 @@ BlobReader::BlobReader(
}
BlobReader::~BlobReader() {
- STLDeleteValues(&index_to_reader_);
}
BlobReader::Status BlobReader::CalculateSize(
@@ -62,6 +59,7 @@ BlobReader::Status BlobReader::CalculateSize(
return ReportError(net::ERR_FILE_NOT_FOUND);
}
+ reader_used_ = true;
net_error_ = net::OK;
total_size_ = 0;
const auto& items = blob_data_->items();
@@ -187,6 +185,21 @@ BlobReader::Status BlobReader::Read(net::IOBuffer* buffer,
void BlobReader::Kill() {
DeleteCurrentFileReader();
weak_factory_.InvalidateWeakPtrs();
+ read_buf_ = nullptr;
+ io_pending_ = false;
+}
+
+void BlobReader::Reset() {
+ weak_factory_.InvalidateWeakPtrs();
+ io_pending_ = false;
+ reader_used_ = false;
+ total_size_calculated_ = false;
+ current_item_index_ = 0;
+ current_item_offset_ = false;
+ // We keep the map of file readers to be efficient.
michaeln 2015/12/11 00:22:18 i think the readers maintain state like the curren
michaeln 2015/12/11 00:48:16 It's real easy to miss resetting a particular memb
dmurph 2015/12/11 01:32:04 If we do that, then we'll need to make the old one
+ size_callback_.Reset();
+ read_callback_.Reset();
+ read_buf_ = nullptr;
}
bool BlobReader::IsInMemory() const {
@@ -505,14 +518,14 @@ FileStreamReader* BlobReader::GetOrCreateFileReaderAtIndex(size_t index) {
return nullptr;
auto it = index_to_reader_.find(index);
if (it != index_to_reader_.end()) {
- DCHECK(it->second);
- return it->second;
+ DCHECK(it->second.get());
+ return it->second.get();
}
scoped_ptr<FileStreamReader> reader = CreateFileStreamReader(item, 0);
FileStreamReader* ret_value = reader.get();
if (!ret_value)
return nullptr;
- index_to_reader_[index] = reader.release();
+ index_to_reader_[index] = std::move(reader);
return ret_value;
}
@@ -551,19 +564,11 @@ scoped_ptr<FileStreamReader> BlobReader::CreateFileStreamReader(
void BlobReader::SetFileReaderAtIndex(size_t index,
michaeln 2015/12/11 00:48:16 The old impl completely ignored |index|, the rewri
dmurph 2015/12/11 01:32:04 Old was incorrect then.
scoped_ptr<FileStreamReader> reader) {
- auto found = index_to_reader_.find(current_item_index_);
- if (found != index_to_reader_.end()) {
- if (found->second) {
- delete found->second;
- }
- if (!reader.get()) {
- index_to_reader_.erase(found);
- return;
- }
- found->second = reader.release();
- } else if (reader.get()) {
- index_to_reader_[current_item_index_] = reader.release();
+ if (!reader.get()) {
+ index_to_reader_.erase(index);
+ return;
}
+ index_to_reader_[current_item_index_] = std::move(reader);
}
} // namespace storage
« no previous file with comments | « storage/browser/blob/blob_reader.h ('k') | storage/browser/blob/upload_blob_element_reader.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698