summaryrefslogtreecommitdiffstats
path: root/chromium/content/browser/streams/stream.cc
diff options
context:
space:
mode:
authorAndras Becsi <andras.becsi@digia.com>2013-12-11 21:33:03 +0100
committerAndras Becsi <andras.becsi@digia.com>2013-12-13 12:34:07 +0100
commitf2a33ff9cbc6d19943f1c7fbddd1f23d23975577 (patch)
tree0586a32aa390ade8557dfd6b4897f43a07449578 /chromium/content/browser/streams/stream.cc
parent5362912cdb5eea702b68ebe23702468d17c3017a (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.cc59
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