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

Side by Side 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 unified diff | 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 »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "storage/browser/blob/blob_reader.h" 5 #include "storage/browser/blob/blob_reader.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/sequenced_task_runner.h" 11 #include "base/sequenced_task_runner.h"
12 #include "base/stl_util.h" 12 #include "base/stl_util.h"
13 #include "base/time/time.h" 13 #include "base/time/time.h"
14 #include "base/trace_event/trace_event.h" 14 #include "base/trace_event/trace_event.h"
15 #include "net/base/io_buffer.h" 15 #include "net/base/io_buffer.h"
16 #include "net/base/net_errors.h"
17 #include "net/disk_cache/disk_cache.h" 16 #include "net/disk_cache/disk_cache.h"
18 #include "storage/browser/blob/blob_data_handle.h" 17 #include "storage/browser/blob/blob_data_handle.h"
19 #include "storage/browser/blob/blob_data_snapshot.h" 18 #include "storage/browser/blob/blob_data_snapshot.h"
20 #include "storage/browser/fileapi/file_stream_reader.h" 19 #include "storage/browser/fileapi/file_stream_reader.h"
21 #include "storage/browser/fileapi/file_system_context.h" 20 #include "storage/browser/fileapi/file_system_context.h"
22 #include "storage/browser/fileapi/file_system_url.h" 21 #include "storage/browser/fileapi/file_system_url.h"
23 #include "storage/common/data_element.h" 22 #include "storage/common/data_element.h"
24 23
25 namespace storage { 24 namespace storage {
26 namespace { 25 namespace {
27 bool IsFileType(DataElement::Type type) { 26 bool IsFileType(DataElement::Type type) {
28 switch (type) { 27 switch (type) {
29 case DataElement::TYPE_FILE: 28 case DataElement::TYPE_FILE:
30 case DataElement::TYPE_FILE_FILESYSTEM: 29 case DataElement::TYPE_FILE_FILESYSTEM:
31 return true; 30 return true;
32 default: 31 default:
33 return false; 32 return false;
34 } 33 }
35 } 34 }
36 } // namespace 35 } // namespace
37 36
38 BlobReader::FileStreamReaderProvider::~FileStreamReaderProvider() {} 37 BlobReader::FileStreamReaderProvider::~FileStreamReaderProvider() {}
39 38
40 BlobReader::BlobReader( 39 BlobReader::BlobReader(
41 const BlobDataHandle* blob_handle, 40 const BlobDataHandle* blob_handle,
42 scoped_ptr<FileStreamReaderProvider> file_stream_provider, 41 scoped_ptr<FileStreamReaderProvider> file_stream_provider,
43 base::SequencedTaskRunner* file_task_runner) 42 base::SequencedTaskRunner* file_task_runner)
44 : file_stream_provider_(file_stream_provider.Pass()), 43 : file_stream_provider_(file_stream_provider.Pass()),
45 file_task_runner_(file_task_runner), 44 file_task_runner_(file_task_runner),
46 net_error_(net::OK),
47 weak_factory_(this) { 45 weak_factory_(this) {
48 if (blob_handle) { 46 if (blob_handle) {
49 blob_data_ = blob_handle->CreateSnapshot().Pass(); 47 blob_data_ = blob_handle->CreateSnapshot().Pass();
50 } 48 }
51 } 49 }
52 50
53 BlobReader::~BlobReader() { 51 BlobReader::~BlobReader() {
54 STLDeleteValues(&index_to_reader_);
55 } 52 }
56 53
57 BlobReader::Status BlobReader::CalculateSize( 54 BlobReader::Status BlobReader::CalculateSize(
58 const net::CompletionCallback& done) { 55 const net::CompletionCallback& done) {
59 DCHECK(!total_size_calculated_); 56 DCHECK(!total_size_calculated_);
60 DCHECK(size_callback_.is_null()); 57 DCHECK(size_callback_.is_null());
61 if (!blob_data_.get()) { 58 if (!blob_data_.get()) {
62 return ReportError(net::ERR_FILE_NOT_FOUND); 59 return ReportError(net::ERR_FILE_NOT_FOUND);
63 } 60 }
64 61
62 reader_used_ = true;
65 net_error_ = net::OK; 63 net_error_ = net::OK;
66 total_size_ = 0; 64 total_size_ = 0;
67 const auto& items = blob_data_->items(); 65 const auto& items = blob_data_->items();
68 item_length_list_.resize(items.size()); 66 item_length_list_.resize(items.size());
69 pending_get_file_info_count_ = 0; 67 pending_get_file_info_count_ = 0;
70 for (size_t i = 0; i < items.size(); ++i) { 68 for (size_t i = 0; i < items.size(); ++i) {
71 const BlobDataItem& item = *items.at(i); 69 const BlobDataItem& item = *items.at(i);
72 if (IsFileType(item.type())) { 70 if (IsFileType(item.type())) {
73 ++pending_get_file_info_count_; 71 ++pending_get_file_info_count_;
74 storage::FileStreamReader* const reader = GetOrCreateFileReaderAtIndex(i); 72 storage::FileStreamReader* const reader = GetOrCreateFileReaderAtIndex(i);
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 178
181 Status status = ReadLoop(bytes_read); 179 Status status = ReadLoop(bytes_read);
182 if (status == Status::IO_PENDING) 180 if (status == Status::IO_PENDING)
183 read_callback_ = done; 181 read_callback_ = done;
184 return status; 182 return status;
185 } 183 }
186 184
187 void BlobReader::Kill() { 185 void BlobReader::Kill() {
188 DeleteCurrentFileReader(); 186 DeleteCurrentFileReader();
189 weak_factory_.InvalidateWeakPtrs(); 187 weak_factory_.InvalidateWeakPtrs();
188 read_buf_ = nullptr;
189 io_pending_ = false;
190 }
191
192 void BlobReader::Reset() {
193 weak_factory_.InvalidateWeakPtrs();
194 io_pending_ = false;
195 reader_used_ = false;
196 total_size_calculated_ = false;
197 current_item_index_ = 0;
198 current_item_offset_ = false;
199 // 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
200 size_callback_.Reset();
201 read_callback_.Reset();
202 read_buf_ = nullptr;
190 } 203 }
191 204
192 bool BlobReader::IsInMemory() const { 205 bool BlobReader::IsInMemory() const {
193 if (!blob_data_.get()) { 206 if (!blob_data_.get()) {
194 return true; 207 return true;
195 } 208 }
196 for (const auto& item : blob_data_->items()) { 209 for (const auto& item : blob_data_->items()) {
197 if (item->type() != DataElement::TYPE_BYTES) { 210 if (item->type() != DataElement::TYPE_BYTES) {
198 return false; 211 return false;
199 } 212 }
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after
498 } 511 }
499 512
500 FileStreamReader* BlobReader::GetOrCreateFileReaderAtIndex(size_t index) { 513 FileStreamReader* BlobReader::GetOrCreateFileReaderAtIndex(size_t index) {
501 const auto& items = blob_data_->items(); 514 const auto& items = blob_data_->items();
502 DCHECK_LT(index, items.size()); 515 DCHECK_LT(index, items.size());
503 const BlobDataItem& item = *items.at(index); 516 const BlobDataItem& item = *items.at(index);
504 if (!IsFileType(item.type())) 517 if (!IsFileType(item.type()))
505 return nullptr; 518 return nullptr;
506 auto it = index_to_reader_.find(index); 519 auto it = index_to_reader_.find(index);
507 if (it != index_to_reader_.end()) { 520 if (it != index_to_reader_.end()) {
508 DCHECK(it->second); 521 DCHECK(it->second.get());
509 return it->second; 522 return it->second.get();
510 } 523 }
511 scoped_ptr<FileStreamReader> reader = CreateFileStreamReader(item, 0); 524 scoped_ptr<FileStreamReader> reader = CreateFileStreamReader(item, 0);
512 FileStreamReader* ret_value = reader.get(); 525 FileStreamReader* ret_value = reader.get();
513 if (!ret_value) 526 if (!ret_value)
514 return nullptr; 527 return nullptr;
515 index_to_reader_[index] = reader.release(); 528 index_to_reader_[index] = std::move(reader);
516 return ret_value; 529 return ret_value;
517 } 530 }
518 531
519 scoped_ptr<FileStreamReader> BlobReader::CreateFileStreamReader( 532 scoped_ptr<FileStreamReader> BlobReader::CreateFileStreamReader(
520 const BlobDataItem& item, 533 const BlobDataItem& item,
521 uint64_t additional_offset) { 534 uint64_t additional_offset) {
522 DCHECK(IsFileType(item.type())); 535 DCHECK(IsFileType(item.type()));
523 536
524 switch (item.type()) { 537 switch (item.type()) {
525 case DataElement::TYPE_FILE: 538 case DataElement::TYPE_FILE:
(...skipping 16 matching lines...) Expand all
542 case DataElement::TYPE_BYTES_DESCRIPTION: 555 case DataElement::TYPE_BYTES_DESCRIPTION:
543 case DataElement::TYPE_DISK_CACHE_ENTRY: 556 case DataElement::TYPE_DISK_CACHE_ENTRY:
544 case DataElement::TYPE_UNKNOWN: 557 case DataElement::TYPE_UNKNOWN:
545 break; 558 break;
546 } 559 }
547 560
548 NOTREACHED(); 561 NOTREACHED();
549 return nullptr; 562 return nullptr;
550 } 563 }
551 564
552 void BlobReader::SetFileReaderAtIndex(size_t index, 565 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.
553 scoped_ptr<FileStreamReader> reader) { 566 scoped_ptr<FileStreamReader> reader) {
554 auto found = index_to_reader_.find(current_item_index_); 567 if (!reader.get()) {
555 if (found != index_to_reader_.end()) { 568 index_to_reader_.erase(index);
556 if (found->second) { 569 return;
557 delete found->second;
558 }
559 if (!reader.get()) {
560 index_to_reader_.erase(found);
561 return;
562 }
563 found->second = reader.release();
564 } else if (reader.get()) {
565 index_to_reader_[current_item_index_] = reader.release();
566 } 570 }
571 index_to_reader_[current_item_index_] = std::move(reader);
567 } 572 }
568 573
569 } // namespace storage 574 } // namespace storage
OLDNEW
« 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