Chromium Code Reviews| Index: content/browser/streams/stream.cc |
| diff --git a/content/browser/streams/stream.cc b/content/browser/streams/stream.cc |
| index f5abe0276e8a8ff85264637524b4b06811466e9a..8d96b962e85e9d33f476fbde2a0e16e9e81170d6 100644 |
| --- a/content/browser/streams/stream.cc |
| +++ b/content/browser/streams/stream.cc |
| @@ -27,6 +27,7 @@ Stream::Stream(StreamRegistry* registry, |
| can_add_data_(true), |
| url_(url), |
| data_length_(0), |
| + last_total_buffered_bytes_(0), |
| registry_(registry), |
| read_observer_(NULL), |
| write_observer_(write_observer), |
| @@ -68,18 +69,36 @@ void Stream::RemoveWriteObserver(StreamWriteObserver* observer) { |
| } |
| void Stream::AddData(scoped_refptr<net::IOBuffer> buffer, size_t size) { |
| + if (!writer_.get()) |
| + return; |
| + |
| + size_t new_size = writer_->TotalBufferedBytes() + size; |
|
kinuko
2013/08/14 09:32:23
ditto. Could this overflow?
tyoshino (SeeGerritForStatus)
2013/08/15 04:15:33
Added overflow check.
|
| + if (!registry_->CanIncreaseMemoryUsage( |
| + url(), last_total_buffered_bytes_, new_size)) { |
| + // 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(); |
| + can_add_data_ = false; |
| + registry_->UnregisterStream(url()); |
| + return; |
| + } |
| can_add_data_ = writer_->Write(buffer, size); |
| + last_total_buffered_bytes_ = new_size; |
| } |
| void Stream::AddData(const char* data, size_t size) { |
| 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( |
| @@ -92,6 +111,11 @@ Stream::StreamState Stream::ReadRawData(net::IOBuffer* buf, |
| int* bytes_read) { |
| *bytes_read = 0; |
| if (!data_.get()) { |
| + // TODO(tyoshino): Add STREAM_ABORTED type to tell the reader that this |
| + // stream is aborted. |
| + if (!reader_.get()) |
| + return STREAM_EMPTY; |
| + |
| data_length_ = 0; |
| data_bytes_read_ = 0; |
| ByteStreamReader::StreamState state = reader_->Read(&data_, &data_length_); |