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

Unified Diff: net/spdy/spdy_session.h

Issue 13009012: [SPDY] Refactor SpdySession's write queue (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 9 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
« no previous file with comments | « net/spdy/spdy_io_buffer.cc ('k') | net/spdy/spdy_session.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/spdy/spdy_session.h
diff --git a/net/spdy/spdy_session.h b/net/spdy/spdy_session.h
index 0d52b905bbac1406a05e0f660f82576170cb8cdc..4757bf991b5dba4fc79220972716c46b5170a736 100644
--- a/net/spdy/spdy_session.h
+++ b/net/spdy/spdy_session.h
@@ -6,20 +6,20 @@
#define NET_SPDY_SPDY_SESSION_H_
#include <deque>
-#include <list>
#include <map>
-#include <queue>
#include <set>
#include <string>
#include "base/basictypes.h"
#include "base/gtest_prod_util.h"
#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/time.h"
#include "net/base/io_buffer.h"
#include "net/base/load_states.h"
#include "net/base/net_errors.h"
+#include "net/base/net_export.h"
#include "net/base/request_priority.h"
#include "net/socket/client_socket_handle.h"
#include "net/socket/ssl_client_socket.h"
@@ -164,6 +164,19 @@ class NET_EXPORT_PRIVATE SpdyStreamRequest {
DISALLOW_COPY_AND_ASSIGN(SpdyStreamRequest);
};
+// The interface for something which provides a SpdyFrame for writing.
+class NET_EXPORT_PRIVATE SpdyFrameProducer {
+public:
+ // Returns the SpdyStream associated with the frame to be produced,
+ // or NULL if the frame is associated with the session itself.
+ virtual SpdyStream* GetStream() = 0;
Ryan Hamilton 2013/03/24 15:22:54 See this comment on the CL which landed SpdyIOBuff
akalin 2013/03/24 18:24:14 Hmm I looked at the comment but willchan didn't st
willchan no longer on Chromium 2013/03/24 18:58:22 Layering. This is at the frame level, which is low
+
+ // Produces the frame to be written. Will be called at most once.
+ virtual scoped_ptr<SpdyFrame> ProduceFrame() = 0;
+
+ virtual ~SpdyFrameProducer() {}
+};
+
class NET_EXPORT SpdySession : public base::RefCounted<SpdySession>,
public BufferedSpdyFramerVisitorInterface {
public:
@@ -177,29 +190,6 @@ class NET_EXPORT SpdySession : public base::RefCounted<SpdySession>,
FLOW_CONTROL_STREAM_AND_SESSION
};
- // Defines an interface for producing SpdyIOBuffers.
- class NET_EXPORT_PRIVATE SpdyIOBufferProducer {
- public:
- SpdyIOBufferProducer() {}
-
- // Returns a newly created SpdyIOBuffer, owned by the caller, or NULL
- // if not buffer is ready to be produced.
- virtual SpdyIOBuffer* ProduceNextBuffer(SpdySession* session) = 0;
-
- virtual RequestPriority GetPriority() const = 0;
-
- virtual ~SpdyIOBufferProducer() {}
-
- protected:
- // Activates |spdy_stream| in |spdy_session|.
- static void ActivateStream(SpdySession* spdy_session,
- SpdyStream* spdy_stream);
-
- static SpdyIOBuffer* CreateIOBuffer(SpdyFrame* frame,
- RequestPriority priority,
- SpdyStream* spdy_stream);
- };
-
// Create a new SpdySession.
// |host_port_proxy_pair| is the host/port that this session connects to, and
// the proxy configuration settings that it's using.
@@ -263,9 +253,8 @@ class NET_EXPORT SpdySession : public base::RefCounted<SpdySession>,
bool VerifyDomainAuthentication(const std::string& domain);
// Records that |stream| has a write available from |producer|.
- // |producer| will be owned by this SpdySession.
void SetStreamHasWriteAvailable(SpdyStream* stream,
- SpdyIOBufferProducer* producer);
+ scoped_ptr<SpdyFrameProducer> producer);
// Send the SYN frame for |stream_id|. This also sends PING message to check
// the status of the connection.
@@ -475,19 +464,6 @@ class NET_EXPORT SpdySession : public base::RefCounted<SpdySession>,
std::pair<scoped_refptr<SpdyStream>, base::TimeTicks> > PushedStreamMap;
typedef std::set<scoped_refptr<SpdyStream> > CreatedStreamSet;
- typedef std::map<SpdyIOBufferProducer*, SpdyStream*> StreamProducerMap;
-
- class SpdyIOBufferProducerCompare {
- public:
- bool operator() (const SpdyIOBufferProducer* lhs,
- const SpdyIOBufferProducer* rhs) const {
- return lhs->GetPriority() < rhs->GetPriority();
- }
- };
-
- typedef std::priority_queue<SpdyIOBufferProducer*,
- std::vector<SpdyIOBufferProducer*>,
- SpdyIOBufferProducerCompare> WriteQueue;
enum State {
STATE_IDLE,
@@ -582,10 +558,28 @@ class NET_EXPORT SpdySession : public base::RefCounted<SpdySession>,
// Get a new stream id.
int GetNewStreamId();
- // Queue a frame for sending.
+ // Delegates to QueueFrameProducerForWriting to put the given frame
+ // associated with the session on the write queue.
+ //
// |frame| is the frame to send.
// |priority| is the priority for insertion into the queue.
- void QueueFrame(SpdyFrame* frame, RequestPriority priority);
+ void QueueSessionFrameForWriting(scoped_ptr<SpdyFrame> frame,
+ RequestPriority priority);
+
+ // Puts |producer| onto the write queue with the given priority.
+ void QueueFrameProducerForWriting(scoped_ptr<SpdyFrameProducer> producer,
+ RequestPriority priority);
+
+ // Pops the next frame producer to send from the write queue, or
+ // NULL if there isn't one.
+ scoped_ptr<SpdyFrameProducer> PopNextFrameProducerToWrite();
+
+ // Remove all frame producers associated with the given stream from
+ // the write queue.
+ void RemoveStreamFromWriteQueue(const scoped_refptr<SpdyStream>& stream);
+
+ // Remove everything from the write queue.
+ void ClearWriteQueue();
// Track active streams in the active stream list.
void ActivateStream(SpdyStream* stream);
@@ -768,13 +762,8 @@ class NET_EXPORT SpdySession : public base::RefCounted<SpdySession>,
// Set of all created streams but that have not yet sent any frames.
CreatedStreamSet created_streams_;
- // As streams have data to be sent, we put them into the write queue.
- WriteQueue write_queue_;
-
- // Mapping from SpdyIOBufferProducers to their corresponding SpdyStream
- // so that when a stream is destroyed, we can remove the corresponding
- // producer from |write_queue_|.
- StreamProducerMap stream_producers_;
+ // A FIFO queue of data to be sent, binned by priority.
+ std::deque<SpdyFrameProducer*> write_queue_[NUM_PRIORITIES];
// The packet we are currently sending.
bool write_pending_; // Will be true when a write is in progress.
« no previous file with comments | « net/spdy/spdy_io_buffer.cc ('k') | net/spdy/spdy_session.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698