Commit 6157fa65 authored by Victor Costan's avatar Victor Costan Committed by Commit Bot

Blobs: Add sequence checkers to storage::MojoBlobReader.

Change-Id: Iae148260df76be6b37e22ea4a95bdbd81e0e35b7
Reviewed-on: https://chromium-review.googlesource.com/1176971
Commit-Queue: Daniel Murphy <dmurph@chromium.org>
Reviewed-by: default avatarDaniel Murphy <dmurph@chromium.org>
Cr-Commit-Position: refs/heads/master@{#583804}
parent 2489ab5f
...@@ -39,11 +39,14 @@ MojoBlobReader::MojoBlobReader(const BlobDataHandle* handle, ...@@ -39,11 +39,14 @@ MojoBlobReader::MojoBlobReader(const BlobDataHandle* handle,
} }
MojoBlobReader::~MojoBlobReader() { MojoBlobReader::~MojoBlobReader() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
TRACE_EVENT_ASYNC_END1("Blob", "BlobReader", this, "bytes_written", TRACE_EVENT_ASYNC_END1("Blob", "BlobReader", this, "bytes_written",
total_written_bytes_); total_written_bytes_);
} }
void MojoBlobReader::Start() { void MojoBlobReader::Start() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (blob_reader_->net_error()) { if (blob_reader_->net_error()) {
NotifyCompletedAndDeleteIfNeeded(blob_reader_->net_error()); NotifyCompletedAndDeleteIfNeeded(blob_reader_->net_error());
return; return;
...@@ -69,6 +72,8 @@ void MojoBlobReader::Start() { ...@@ -69,6 +72,8 @@ void MojoBlobReader::Start() {
} }
void MojoBlobReader::NotifyCompletedAndDeleteIfNeeded(int result) { void MojoBlobReader::NotifyCompletedAndDeleteIfNeeded(int result) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
blob_reader_ = nullptr; blob_reader_ = nullptr;
if (!notified_completed_) { if (!notified_completed_) {
delegate_->OnComplete(static_cast<net::Error>(result), delegate_->OnComplete(static_cast<net::Error>(result),
...@@ -82,6 +87,8 @@ void MojoBlobReader::NotifyCompletedAndDeleteIfNeeded(int result) { ...@@ -82,6 +87,8 @@ void MojoBlobReader::NotifyCompletedAndDeleteIfNeeded(int result) {
} }
void MojoBlobReader::DidCalculateSize(int result) { void MojoBlobReader::DidCalculateSize(int result) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (result != net::OK) { if (result != net::OK) {
TRACE_EVENT_ASYNC_END1("Blob", "BlobReader::CountSize", this, "result", TRACE_EVENT_ASYNC_END1("Blob", "BlobReader::CountSize", this, "result",
"error"); "error");
...@@ -126,6 +133,8 @@ void MojoBlobReader::DidCalculateSize(int result) { ...@@ -126,6 +133,8 @@ void MojoBlobReader::DidCalculateSize(int result) {
} }
void MojoBlobReader::DidReadSideData(BlobReader::Status status) { void MojoBlobReader::DidReadSideData(BlobReader::Status status) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (status != BlobReader::Status::DONE) { if (status != BlobReader::Status::DONE) {
NotifyCompletedAndDeleteIfNeeded(blob_reader_->net_error()); NotifyCompletedAndDeleteIfNeeded(blob_reader_->net_error());
return; return;
...@@ -135,6 +144,8 @@ void MojoBlobReader::DidReadSideData(BlobReader::Status status) { ...@@ -135,6 +144,8 @@ void MojoBlobReader::DidReadSideData(BlobReader::Status status) {
} }
void MojoBlobReader::StartReading() { void MojoBlobReader::StartReading() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
response_body_stream_ = delegate_->PassDataPipe(); response_body_stream_ = delegate_->PassDataPipe();
peer_closed_handle_watcher_.Watch( peer_closed_handle_watcher_.Watch(
response_body_stream_.get(), MOJO_HANDLE_SIGNAL_PEER_CLOSED, response_body_stream_.get(), MOJO_HANDLE_SIGNAL_PEER_CLOSED,
...@@ -152,6 +163,7 @@ void MojoBlobReader::StartReading() { ...@@ -152,6 +163,7 @@ void MojoBlobReader::StartReading() {
} }
void MojoBlobReader::ReadMore() { void MojoBlobReader::ReadMore() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(!pending_write_.get()); DCHECK(!pending_write_.get());
uint32_t num_bytes; uint32_t num_bytes;
...@@ -192,6 +204,8 @@ void MojoBlobReader::ReadMore() { ...@@ -192,6 +204,8 @@ void MojoBlobReader::ReadMore() {
} }
void MojoBlobReader::DidRead(bool completed_synchronously, int num_bytes) { void MojoBlobReader::DidRead(bool completed_synchronously, int num_bytes) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (num_bytes < 0) { if (num_bytes < 0) {
TRACE_EVENT_ASYNC_END2("Blob", "BlobReader::ReadMore", this, "result", TRACE_EVENT_ASYNC_END2("Blob", "BlobReader::ReadMore", this, "result",
"error", "net_error", num_bytes); "error", "net_error", num_bytes);
...@@ -223,12 +237,16 @@ void MojoBlobReader::DidRead(bool completed_synchronously, int num_bytes) { ...@@ -223,12 +237,16 @@ void MojoBlobReader::DidRead(bool completed_synchronously, int num_bytes) {
} }
void MojoBlobReader::OnResponseBodyStreamClosed(MojoResult result) { void MojoBlobReader::OnResponseBodyStreamClosed(MojoResult result) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
response_body_stream_.reset(); response_body_stream_.reset();
pending_write_ = nullptr; pending_write_ = nullptr;
NotifyCompletedAndDeleteIfNeeded(net::ERR_ABORTED); NotifyCompletedAndDeleteIfNeeded(net::ERR_ABORTED);
} }
void MojoBlobReader::OnResponseBodyStreamReady(MojoResult result) { void MojoBlobReader::OnResponseBodyStreamReady(MojoResult result) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (result == MOJO_RESULT_FAILED_PRECONDITION) { if (result == MOJO_RESULT_FAILED_PRECONDITION) {
OnResponseBodyStreamClosed(MOJO_RESULT_OK); OnResponseBodyStreamClosed(MOJO_RESULT_OK);
return; return;
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <memory> #include <memory>
#include "base/memory/ref_counted.h" #include "base/memory/ref_counted.h"
#include "base/sequence_checker.h"
#include "mojo/public/cpp/system/data_pipe.h" #include "mojo/public/cpp/system/data_pipe.h"
#include "mojo/public/cpp/system/simple_watcher.h" #include "mojo/public/cpp/system/simple_watcher.h"
#include "net/base/net_errors.h" #include "net/base/net_errors.h"
...@@ -38,7 +39,7 @@ class STORAGE_EXPORT MojoBlobReader { ...@@ -38,7 +39,7 @@ class STORAGE_EXPORT MojoBlobReader {
public: public:
enum RequestSideData { REQUEST_SIDE_DATA, DONT_REQUEST_SIDE_DATA }; enum RequestSideData { REQUEST_SIDE_DATA, DONT_REQUEST_SIDE_DATA };
virtual ~Delegate() {} virtual ~Delegate() = default;
// Called when the blob being read has been fully constructed and its size // Called when the blob being read has been fully constructed and its size
// is known. |total_size| is the total size of the blob, while // is known. |total_size| is the total size of the blob, while
...@@ -99,7 +100,7 @@ class STORAGE_EXPORT MojoBlobReader { ...@@ -99,7 +100,7 @@ class STORAGE_EXPORT MojoBlobReader {
void OnResponseBodyStreamClosed(MojoResult result); void OnResponseBodyStreamClosed(MojoResult result);
void OnResponseBodyStreamReady(MojoResult result); void OnResponseBodyStreamReady(MojoResult result);
std::unique_ptr<Delegate> delegate_; const std::unique_ptr<Delegate> delegate_;
// The range of the blob that should be read. Could be unbounded if the entire // The range of the blob that should be read. Could be unbounded if the entire
// blob is being read. // blob is being read.
...@@ -130,6 +131,8 @@ class STORAGE_EXPORT MojoBlobReader { ...@@ -130,6 +131,8 @@ class STORAGE_EXPORT MojoBlobReader {
// sure OnComplete isn't called more than once. // sure OnComplete isn't called more than once.
bool notified_completed_ = false; bool notified_completed_ = false;
SEQUENCE_CHECKER(sequence_checker_);
base::WeakPtrFactory<MojoBlobReader> weak_factory_; base::WeakPtrFactory<MojoBlobReader> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(MojoBlobReader); DISALLOW_COPY_AND_ASSIGN(MojoBlobReader);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment