diff options
author | Andras Becsi <andras.becsi@digia.com> | 2013-12-11 21:33:03 +0100 |
---|---|---|
committer | Andras Becsi <andras.becsi@digia.com> | 2013-12-13 12:34:07 +0100 |
commit | f2a33ff9cbc6d19943f1c7fbddd1f23d23975577 (patch) | |
tree | 0586a32aa390ade8557dfd6b4897f43a07449578 /chromium/content/browser/streams/stream.cc | |
parent | 5362912cdb5eea702b68ebe23702468d17c3017a (diff) |
Update Chromium to branch 1650 (31.0.1650.63)
Change-Id: I57d8c832eaec1eb2364e0a8e7352a6dd354db99f
Reviewed-by: Jocelyn Turcotte <jocelyn.turcotte@digia.com>
Diffstat (limited to 'chromium/content/browser/streams/stream.cc')
-rw-r--r-- | chromium/content/browser/streams/stream.cc | 59 |
1 files changed, 52 insertions, 7 deletions
diff --git a/chromium/content/browser/streams/stream.cc b/chromium/content/browser/streams/stream.cc index f5abe0276e8..5d20fe6ab64 100644 --- a/chromium/content/browser/streams/stream.cc +++ b/chromium/content/browser/streams/stream.cc @@ -23,10 +23,11 @@ namespace content { Stream::Stream(StreamRegistry* registry, StreamWriteObserver* write_observer, const GURL& url) - : data_bytes_read_(0), - can_add_data_(true), + : can_add_data_(true), url_(url), data_length_(0), + data_bytes_read_(0), + last_total_buffered_bytes_(0), registry_(registry), read_observer_(NULL), write_observer_(write_observer), @@ -67,19 +68,50 @@ void Stream::RemoveWriteObserver(StreamWriteObserver* observer) { write_observer_ = NULL; } +void Stream::Abort() { + // Clear all buffer. It's safe to clear reader_ here since the same thread + // is used for both input and output operation. + writer_.reset(); + reader_.reset(); + ClearBuffer(); + can_add_data_ = false; + registry_->UnregisterStream(url()); +} + void Stream::AddData(scoped_refptr<net::IOBuffer> buffer, size_t size) { + if (!writer_.get()) + return; + + size_t current_buffered_bytes = writer_->GetTotalBufferedBytes(); + if (!registry_->UpdateMemoryUsage(url(), current_buffered_bytes, size)) { + Abort(); + return; + } + + // Now it's guaranteed that this doesn't overflow. This must be done before + // Write() since GetTotalBufferedBytes() may return different value after + // Write() call, so if we use the new value, information in this instance and + // one in |registry_| become inconsistent. + last_total_buffered_bytes_ = current_buffered_bytes + size; + can_add_data_ = writer_->Write(buffer, size); } void Stream::AddData(const char* data, size_t size) { + if (!writer_.get()) + return; + scoped_refptr<net::IOBuffer> io_buffer(new net::IOBuffer(size)); memcpy(io_buffer->data(), data, size); - can_add_data_ = writer_->Write(io_buffer, size); + AddData(io_buffer, size); } void Stream::Finalize() { + if (!writer_.get()) + return; + writer_->Close(0); - writer_.reset(NULL); + writer_.reset(); // Continue asynchronously. base::MessageLoopProxy::current()->PostTask( @@ -90,10 +122,17 @@ void Stream::Finalize() { Stream::StreamState Stream::ReadRawData(net::IOBuffer* buf, int buf_size, int* bytes_read) { + DCHECK(buf); + DCHECK(bytes_read); + *bytes_read = 0; if (!data_.get()) { - data_length_ = 0; - data_bytes_read_ = 0; + DCHECK(!data_length_); + DCHECK(!data_bytes_read_); + + if (!reader_.get()) + return STREAM_ABORTED; + ByteStreamReader::StreamState state = reader_->Read(&data_, &data_length_); switch (state) { case ByteStreamReader::STREAM_HAS_DATA: @@ -113,7 +152,7 @@ Stream::StreamState Stream::ReadRawData(net::IOBuffer* buf, memcpy(buf->data(), data_->data() + data_bytes_read_, to_read); data_bytes_read_ += to_read; if (data_bytes_read_ >= data_length_) - data_ = NULL; + ClearBuffer(); *bytes_read = to_read; return STREAM_HAS_DATA; @@ -150,4 +189,10 @@ void Stream::OnDataAvailable() { read_observer_->OnDataAvailable(this); } +void Stream::ClearBuffer() { + data_ = NULL; + data_length_ = 0; + data_bytes_read_ = 0; +} + } // namespace content |