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

Unified Diff: net/spdy/spdy_stream.cc

Issue 13990005: [SPDY] Replace SpdyIOBuffer with new SpdyBuffer class (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 8 months 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 side-by-side diff with in-line comments
Download patch
Index: net/spdy/spdy_stream.cc
diff --git a/net/spdy/spdy_stream.cc b/net/spdy/spdy_stream.cc
index 69d9cfa40ab3ebba98cc603eb08b05913fe7d8ec..50afda1994524ddec7959f0d0eaf42e3271ca2ba 100644
--- a/net/spdy/spdy_stream.cc
+++ b/net/spdy/spdy_stream.cc
@@ -12,7 +12,7 @@
#include "base/message_loop.h"
#include "base/stringprintf.h"
#include "base/values.h"
-#include "net/spdy/spdy_frame_producer.h"
+#include "net/spdy/spdy_buffer_producer.h"
#include "net/spdy/spdy_http_utils.h"
#include "net/spdy/spdy_session.h"
@@ -54,22 +54,23 @@ bool ContainsUpperAscii(const std::string& str) {
} // namespace
// A wrapper around a stream that calls into ProduceSynStreamFrame().
-class SpdyStream::SynStreamFrameProducer : public SpdyFrameProducer {
+class SpdyStream::SynStreamBufferProducer : public SpdyBufferProducer {
public:
- SynStreamFrameProducer(const base::WeakPtr<SpdyStream>& stream)
+ SynStreamBufferProducer(const base::WeakPtr<SpdyStream>& stream)
: stream_(stream) {
DCHECK(stream_);
}
- virtual ~SynStreamFrameProducer() {}
+ virtual ~SynStreamBufferProducer() {}
- virtual scoped_ptr<SpdyFrame> ProduceFrame() OVERRIDE {
+ virtual scoped_ptr<SpdyBuffer> ProduceBuffer() OVERRIDE {
if (!stream_) {
NOTREACHED();
- return scoped_ptr<SpdyFrame>();
+ return scoped_ptr<SpdyBuffer>();
}
DCHECK_GT(stream_->stream_id(), 0u);
- return stream_->ProduceSynStreamFrame();
+ return scoped_ptr<SpdyBuffer>(
+ new SpdyBuffer(stream_->ProduceSynStreamFrame()));
}
private:
@@ -78,9 +79,9 @@ class SpdyStream::SynStreamFrameProducer : public SpdyFrameProducer {
// A wrapper around a stream that calls into ProduceHeaderFrame() with
// a given header block.
-class SpdyStream::HeaderFrameProducer : public SpdyFrameProducer {
+class SpdyStream::HeaderBufferProducer : public SpdyBufferProducer {
public:
- HeaderFrameProducer(const base::WeakPtr<SpdyStream>& stream,
+ HeaderBufferProducer(const base::WeakPtr<SpdyStream>& stream,
scoped_ptr<SpdyHeaderBlock> headers)
: stream_(stream),
headers_(headers.Pass()) {
@@ -88,15 +89,16 @@ class SpdyStream::HeaderFrameProducer : public SpdyFrameProducer {
DCHECK(headers_);
}
- virtual ~HeaderFrameProducer() {}
+ virtual ~HeaderBufferProducer() {}
- virtual scoped_ptr<SpdyFrame> ProduceFrame() OVERRIDE {
+ virtual scoped_ptr<SpdyBuffer> ProduceBuffer() OVERRIDE {
if (!stream_) {
NOTREACHED();
- return scoped_ptr<SpdyFrame>();
+ return scoped_ptr<SpdyBuffer>();
}
DCHECK_GT(stream_->stream_id(), 0u);
- return stream_->ProduceHeaderFrame(headers_.Pass());
+ return scoped_ptr<SpdyBuffer>(
+ new SpdyBuffer(stream_->ProduceHeaderFrame(headers_.Pass())));
}
private:
@@ -175,17 +177,17 @@ void SpdyStream::PushedStreamReplayData() {
return;
}
- std::vector<scoped_refptr<IOBufferWithSize> > buffers;
- buffers.swap(pending_buffers_);
+ std::vector<SpdyBuffer*> buffers;
+ pending_buffers_.release(&buffers);
for (size_t i = 0; i < buffers.size(); ++i) {
// It is always possible that a callback to the delegate results in
// the delegate no longer being available.
if (!delegate_)
break;
if (buffers[i]) {
- delegate_->OnDataReceived(buffers[i]->data(), buffers[i]->size());
+ delegate_->OnDataReceived(scoped_ptr<SpdyBuffer>(buffers[i]));
} else {
- delegate_->OnDataReceived(NULL, 0);
+ delegate_->OnDataReceived(scoped_ptr<SpdyBuffer>());
session_->CloseStream(stream_id_, net::OK);
// Note: |this| may be deleted after calling CloseStream.
DCHECK_EQ(buffers.size() - 1, i);
@@ -450,9 +452,8 @@ int SpdyStream::OnHeaders(const SpdyHeaderBlock& headers) {
return rv;
}
-void SpdyStream::OnDataReceived(const char* data, size_t length) {
+void SpdyStream::OnDataReceived(scoped_ptr<SpdyBuffer> buffer) {
DCHECK(session_->IsStreamActive(stream_id_));
- DCHECK_LT(length, 1u << 24);
// If we don't have a response, then the SYN_REPLY did not come through.
// We cannot pass data up to the caller unless the reply headers have been
// received.
@@ -465,10 +466,8 @@ void SpdyStream::OnDataReceived(const char* data, size_t length) {
if (!delegate_ || continue_buffering_data_) {
// It should be valid for this to happen in the server push case.
// We'll return received data when delegate gets attached to the stream.
- if (length > 0) {
- IOBufferWithSize* buf = new IOBufferWithSize(length);
- memcpy(buf->data(), data, length);
- pending_buffers_.push_back(make_scoped_refptr(buf));
+ if (buffer) {
+ pending_buffers_.push_back(buffer.release());
} else {
pending_buffers_.push_back(NULL);
metrics_.StopStream();
@@ -480,23 +479,26 @@ void SpdyStream::OnDataReceived(const char* data, size_t length) {
CHECK(!closed());
- // A zero-length read means that the stream is being closed.
- if (length == 0) {
+ if (!buffer) {
metrics_.StopStream();
session_->CloseStream(stream_id_, net::OK);
// Note: |this| may be deleted after calling CloseStream.
return;
}
- if (session_->flow_control_state() >= SpdySession::FLOW_CONTROL_STREAM)
- DecreaseRecvWindowSize(static_cast<int32>(length));
+ if (buffer) {
Ryan Hamilton 2013/04/16 18:44:25 Looks like you return on line 486 if !buffer, so n
akalin 2013/04/16 23:01:46 Done.
+ size_t length = buffer->GetRemainingSize();
+ DCHECK_LE(length, session_->GetDataFrameMaximumPayload());
+ if (session_->flow_control_state() >= SpdySession::FLOW_CONTROL_STREAM)
+ DecreaseRecvWindowSize(static_cast<int32>(length));
- // Track our bandwidth.
- metrics_.RecordBytes(length);
- recv_bytes_ += length;
+ // Track our bandwidth.
+ metrics_.RecordBytes(length);
+ recv_bytes_ += length;
+ }
recv_last_byte_time_ = base::TimeTicks::Now();
- if (delegate_->OnDataReceived(data, length) != net::OK) {
+ if (delegate_->OnDataReceived(buffer.Pass()) != net::OK) {
// |delegate_| rejected the data.
LogStreamError(ERR_SPDY_PROTOCOL_ERROR, "Delegate rejected the data");
session_->CloseStream(stream_id_, ERR_SPDY_PROTOCOL_ERROR);
@@ -580,8 +582,8 @@ void SpdyStream::QueueHeaders(scoped_ptr<SpdyHeaderBlock> headers) {
session_->EnqueueStreamWrite(
this, HEADERS,
- scoped_ptr<SpdyFrameProducer>(
- new HeaderFrameProducer(
+ scoped_ptr<SpdyBufferProducer>(
+ new HeaderBufferProducer(
weak_ptr_factory_.GetWeakPtr(), headers.Pass())));
}
@@ -594,15 +596,16 @@ void SpdyStream::QueueStreamData(IOBuffer* data,
CHECK_GT(stream_id_, 0u);
CHECK(!cancelled());
- scoped_ptr<SpdyFrame> data_frame(session_->CreateDataFrame(
+ scoped_ptr<SpdyBuffer> data_buffer(session_->CreateDataBuffer(
stream_id_, data, length, flags));
- if (!data_frame)
+ // We'll get called again by PossiblyResumeIfSendStalled().
+ if (!data_buffer)
return;
session_->EnqueueStreamWrite(
this, DATA,
- scoped_ptr<SpdyFrameProducer>(
- new SimpleFrameProducer(data_frame.Pass())));
+ scoped_ptr<SpdyBufferProducer>(
+ new SimpleBufferProducer(data_buffer.Pass())));
}
bool SpdyStream::GetSSLInfo(SSLInfo* ssl_info,
@@ -784,7 +787,9 @@ int SpdyStream::DoSendDomainBoundCert() {
// the state machine appropriately.
session_->EnqueueStreamWrite(
this, CREDENTIAL,
- scoped_ptr<SpdyFrameProducer>(new SimpleFrameProducer(frame.Pass())));
+ scoped_ptr<SpdyBufferProducer>(
+ new SimpleBufferProducer(
+ scoped_ptr<SpdyBuffer>(new SpdyBuffer(frame.Pass())))));
return ERR_IO_PENDING;
}
@@ -800,8 +805,8 @@ int SpdyStream::DoSendHeaders() {
session_->EnqueueStreamWrite(
this, SYN_STREAM,
- scoped_ptr<SpdyFrameProducer>(
- new SynStreamFrameProducer(weak_ptr_factory_.GetWeakPtr())));
+ scoped_ptr<SpdyBufferProducer>(
+ new SynStreamBufferProducer(weak_ptr_factory_.GetWeakPtr())));
return ERR_IO_PENDING;
}

Powered by Google App Engine
This is Rietveld 408576698