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

Side by Side 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: Fix gyp error 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef NET_SPDY_SPDY_SESSION_H_ 5 #ifndef NET_SPDY_SPDY_SESSION_H_
6 #define NET_SPDY_SPDY_SESSION_H_ 6 #define NET_SPDY_SPDY_SESSION_H_
7 7
8 #include <deque> 8 #include <deque>
9 #include <list>
10 #include <map> 9 #include <map>
11 #include <queue>
12 #include <set> 10 #include <set>
13 #include <string> 11 #include <string>
14 12
15 #include "base/basictypes.h" 13 #include "base/basictypes.h"
16 #include "base/gtest_prod_util.h" 14 #include "base/gtest_prod_util.h"
17 #include "base/memory/ref_counted.h" 15 #include "base/memory/ref_counted.h"
16 #include "base/memory/scoped_ptr.h"
18 #include "base/memory/weak_ptr.h" 17 #include "base/memory/weak_ptr.h"
19 #include "base/time.h" 18 #include "base/time.h"
20 #include "net/base/io_buffer.h" 19 #include "net/base/io_buffer.h"
21 #include "net/base/load_states.h" 20 #include "net/base/load_states.h"
22 #include "net/base/net_errors.h" 21 #include "net/base/net_errors.h"
22 #include "net/base/net_export.h"
23 #include "net/base/request_priority.h" 23 #include "net/base/request_priority.h"
24 #include "net/socket/client_socket_handle.h" 24 #include "net/socket/client_socket_handle.h"
25 #include "net/socket/ssl_client_socket.h" 25 #include "net/socket/ssl_client_socket.h"
26 #include "net/socket/stream_socket.h" 26 #include "net/socket/stream_socket.h"
27 #include "net/spdy/buffered_spdy_framer.h" 27 #include "net/spdy/buffered_spdy_framer.h"
28 #include "net/spdy/spdy_credential_state.h" 28 #include "net/spdy/spdy_credential_state.h"
29 #include "net/spdy/spdy_header_block.h" 29 #include "net/spdy/spdy_header_block.h"
30 #include "net/spdy/spdy_io_buffer.h" 30 #include "net/spdy/spdy_io_buffer.h"
31 #include "net/spdy/spdy_protocol.h" 31 #include "net/spdy/spdy_protocol.h"
32 #include "net/spdy/spdy_session_pool.h" 32 #include "net/spdy/spdy_session_pool.h"
33 #include "net/spdy/spdy_write_queue.h"
33 #include "net/ssl/ssl_client_cert_type.h" 34 #include "net/ssl/ssl_client_cert_type.h"
34 #include "net/ssl/ssl_config_service.h" 35 #include "net/ssl/ssl_config_service.h"
35 36
36 namespace net { 37 namespace net {
37 38
38 // This is somewhat arbitrary and not really fixed, but it will always work 39 // This is somewhat arbitrary and not really fixed, but it will always work
39 // reasonably with ethernet. Chop the world into 2-packet chunks. This is 40 // reasonably with ethernet. Chop the world into 2-packet chunks. This is
40 // somewhat arbitrary, but is reasonably small and ensures that we elicit 41 // somewhat arbitrary, but is reasonably small and ensures that we elicit
41 // ACKs quickly from TCP (because TCP tries to only ACK every other packet). 42 // ACKs quickly from TCP (because TCP tries to only ACK every other packet).
42 const int kMss = 1430; 43 const int kMss = 1430;
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 // TODO(akalin): Use base::TickClock when it becomes available. 171 // TODO(akalin): Use base::TickClock when it becomes available.
171 typedef base::TimeTicks (*TimeFunc)(void); 172 typedef base::TimeTicks (*TimeFunc)(void);
172 173
173 // How we handle flow control (version-dependent). 174 // How we handle flow control (version-dependent).
174 enum FlowControlState { 175 enum FlowControlState {
175 FLOW_CONTROL_NONE, 176 FLOW_CONTROL_NONE,
176 FLOW_CONTROL_STREAM, 177 FLOW_CONTROL_STREAM,
177 FLOW_CONTROL_STREAM_AND_SESSION 178 FLOW_CONTROL_STREAM_AND_SESSION
178 }; 179 };
179 180
180 // Defines an interface for producing SpdyIOBuffers.
181 class NET_EXPORT_PRIVATE SpdyIOBufferProducer {
182 public:
183 SpdyIOBufferProducer() {}
184
185 // Returns a newly created SpdyIOBuffer, owned by the caller, or NULL
186 // if not buffer is ready to be produced.
187 virtual SpdyIOBuffer* ProduceNextBuffer(SpdySession* session) = 0;
188
189 virtual RequestPriority GetPriority() const = 0;
190
191 virtual ~SpdyIOBufferProducer() {}
192
193 protected:
194 // Activates |spdy_stream| in |spdy_session|.
195 static void ActivateStream(SpdySession* spdy_session,
196 SpdyStream* spdy_stream);
197
198 static SpdyIOBuffer* CreateIOBuffer(SpdyFrame* frame,
199 RequestPriority priority,
200 SpdyStream* spdy_stream);
201 };
202
203 // Create a new SpdySession. 181 // Create a new SpdySession.
204 // |host_port_proxy_pair| is the host/port that this session connects to, and 182 // |host_port_proxy_pair| is the host/port that this session connects to, and
205 // the proxy configuration settings that it's using. 183 // the proxy configuration settings that it's using.
206 // |spdy_session_pool| is the SpdySessionPool that owns us. Its lifetime must 184 // |spdy_session_pool| is the SpdySessionPool that owns us. Its lifetime must
207 // strictly be greater than |this|. 185 // strictly be greater than |this|.
208 // |session| is the HttpNetworkSession. |net_log| is the NetLog that we log 186 // |session| is the HttpNetworkSession. |net_log| is the NetLog that we log
209 // network events to. 187 // network events to.
210 SpdySession(const HostPortProxyPair& host_port_proxy_pair, 188 SpdySession(const HostPortProxyPair& host_port_proxy_pair,
211 SpdySessionPool* spdy_session_pool, 189 SpdySessionPool* spdy_session_pool,
212 HttpServerProperties* http_server_properties, 190 HttpServerProperties* http_server_properties,
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
255 // For SSL-based sessions, verifies that the server certificate in use by 233 // For SSL-based sessions, verifies that the server certificate in use by
256 // this session provides authentication for the domain and no client 234 // this session provides authentication for the domain and no client
257 // certificate or channel ID was sent to the original server during the SSL 235 // certificate or channel ID was sent to the original server during the SSL
258 // handshake. NOTE: This function can have false negatives on some 236 // handshake. NOTE: This function can have false negatives on some
259 // platforms. 237 // platforms.
260 // TODO(wtc): rename this function and the Net.SpdyIPPoolDomainMatch 238 // TODO(wtc): rename this function and the Net.SpdyIPPoolDomainMatch
261 // histogram because this function does more than verifying domain 239 // histogram because this function does more than verifying domain
262 // authentication now. 240 // authentication now.
263 bool VerifyDomainAuthentication(const std::string& domain); 241 bool VerifyDomainAuthentication(const std::string& domain);
264 242
265 // Records that |stream| has a write available from |producer|. 243 // Pushes the given producer into the write queue for
266 // |producer| will be owned by this SpdySession. 244 // |stream|. |stream| is guaranteed to be activated before the
267 void SetStreamHasWriteAvailable(SpdyStream* stream, 245 // producer is used to produce its frame.
268 SpdyIOBufferProducer* producer); 246 void EnqueueStreamWrite(SpdyStream* stream,
247 scoped_ptr<SpdyFrameProducer> producer);
269 248
270 // Send the SYN frame for |stream_id|. This also sends PING message to check 249 // Creates and returns a SYN frame for |stream_id|.
271 // the status of the connection. 250 scoped_ptr<SpdyFrame> CreateSynStream(
272 SpdyFrame* CreateSynStream(
273 SpdyStreamId stream_id, 251 SpdyStreamId stream_id,
274 RequestPriority priority, 252 RequestPriority priority,
275 uint8 credential_slot, 253 uint8 credential_slot,
276 SpdyControlFlags flags, 254 SpdyControlFlags flags,
277 const SpdyHeaderBlock& headers); 255 const SpdyHeaderBlock& headers);
278 256
279 // Write a CREDENTIAL frame to the session. 257 // Tries to create a CREDENTIAL frame. If successful, fills in
280 SpdyFrame* CreateCredentialFrame(const std::string& origin, 258 // |credential_frame| and returns OK. Returns the error (guaranteed
281 SSLClientCertType type, 259 // to not be ERR_IO_PENDING) otherwise.
282 const std::string& key, 260 int CreateCredentialFrame(const std::string& origin,
283 const std::string& cert, 261 SSLClientCertType type,
284 RequestPriority priority); 262 const std::string& key,
263 const std::string& cert,
264 RequestPriority priority,
265 scoped_ptr<SpdyFrame>* credential_frame);
285 266
286 // Write a HEADERS frame to the stream. 267 // Creates and returns a HEADERS frame.
287 SpdyFrame* CreateHeadersFrame(SpdyStreamId stream_id, 268 scoped_ptr<SpdyFrame> CreateHeadersFrame(SpdyStreamId stream_id,
288 const SpdyHeaderBlock& headers, 269 const SpdyHeaderBlock& headers,
289 SpdyControlFlags flags); 270 SpdyControlFlags flags);
290 271
291 // Write a data frame to the stream. 272 // Creates and returns a data frame. May return NULL if stalled by
292 // Used to create and queue a data frame for the given stream. 273 // flow control.
293 SpdyFrame* CreateDataFrame(SpdyStreamId stream_id, 274 scoped_ptr<SpdyFrame> CreateDataFrame(SpdyStreamId stream_id,
294 net::IOBuffer* data, int len, 275 net::IOBuffer* data, int len,
295 SpdyDataFlags flags); 276 SpdyDataFlags flags);
296 277
297 // Close a stream. 278 // Close a stream.
298 void CloseStream(SpdyStreamId stream_id, int status); 279 void CloseStream(SpdyStreamId stream_id, int status);
299 280
300 // Close a stream that has been created but is not yet active. 281 // Close a stream that has been created but is not yet active.
301 void CloseCreatedStream(SpdyStream* stream, int status); 282 void CloseCreatedStream(SpdyStream* stream, int status);
302 283
303 // Reset a stream by sending a RST_STREAM frame with given status code. 284 // Reset a stream by sending a RST_STREAM frame with given status code.
304 // Also closes the stream. Was not piggybacked to CloseStream since not 285 // Also closes the stream. Was not piggybacked to CloseStream since not
305 // all of the calls to CloseStream necessitate sending a RST_STREAM. 286 // all of the calls to CloseStream necessitate sending a RST_STREAM.
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
468 FRIEND_TEST_ALL_PREFIXES(SpdySessionSpdy3Test, SessionFlowControlEndToEnd31); 449 FRIEND_TEST_ALL_PREFIXES(SpdySessionSpdy3Test, SessionFlowControlEndToEnd31);
469 450
470 typedef std::deque<SpdyStreamRequest*> PendingStreamRequestQueue; 451 typedef std::deque<SpdyStreamRequest*> PendingStreamRequestQueue;
471 typedef std::set<SpdyStreamRequest*> PendingStreamRequestCompletionSet; 452 typedef std::set<SpdyStreamRequest*> PendingStreamRequestCompletionSet;
472 453
473 typedef std::map<int, scoped_refptr<SpdyStream> > ActiveStreamMap; 454 typedef std::map<int, scoped_refptr<SpdyStream> > ActiveStreamMap;
474 typedef std::map<std::string, 455 typedef std::map<std::string,
475 std::pair<scoped_refptr<SpdyStream>, base::TimeTicks> > PushedStreamMap; 456 std::pair<scoped_refptr<SpdyStream>, base::TimeTicks> > PushedStreamMap;
476 457
477 typedef std::set<scoped_refptr<SpdyStream> > CreatedStreamSet; 458 typedef std::set<scoped_refptr<SpdyStream> > CreatedStreamSet;
478 typedef std::map<SpdyIOBufferProducer*, SpdyStream*> StreamProducerMap;
479
480 class SpdyIOBufferProducerCompare {
481 public:
482 bool operator() (const SpdyIOBufferProducer* lhs,
483 const SpdyIOBufferProducer* rhs) const {
484 return lhs->GetPriority() < rhs->GetPriority();
485 }
486 };
487
488 typedef std::priority_queue<SpdyIOBufferProducer*,
489 std::vector<SpdyIOBufferProducer*>,
490 SpdyIOBufferProducerCompare> WriteQueue;
491 459
492 enum State { 460 enum State {
493 STATE_IDLE, 461 STATE_IDLE,
494 STATE_CONNECTING, 462 STATE_CONNECTING,
495 STATE_DO_READ, 463 STATE_DO_READ,
496 STATE_DO_READ_COMPLETE, 464 STATE_DO_READ_COMPLETE,
497 STATE_CLOSED 465 STATE_CLOSED
498 }; 466 };
499 467
500 virtual ~SpdySession(); 468 virtual ~SpdySession();
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
575 // haven't received any data in |kHungInterval| time period. 543 // haven't received any data in |kHungInterval| time period.
576 void CheckPingStatus(base::TimeTicks last_check_time); 544 void CheckPingStatus(base::TimeTicks last_check_time);
577 545
578 // Write current data to the socket. 546 // Write current data to the socket.
579 void WriteSocketLater(); 547 void WriteSocketLater();
580 void WriteSocket(); 548 void WriteSocket();
581 549
582 // Get a new stream id. 550 // Get a new stream id.
583 int GetNewStreamId(); 551 int GetNewStreamId();
584 552
585 // Queue a frame for sending. 553 // Pushes the given frame with the given priority into the write
586 // |frame| is the frame to send. 554 // queue for the session.
587 // |priority| is the priority for insertion into the queue. 555 void EnqueueSessionWrite(RequestPriority priority,
588 void QueueFrame(SpdyFrame* frame, RequestPriority priority); 556 scoped_ptr<SpdyFrame> frame);
557
558 // Puts |producer| associated with |stream| onto the write queue
559 // with the given priority.
560 void EnqueueWrite(RequestPriority priority,
561 scoped_ptr<SpdyFrameProducer> producer,
562 const scoped_refptr<SpdyStream>& stream);
589 563
590 // Track active streams in the active stream list. 564 // Track active streams in the active stream list.
591 void ActivateStream(SpdyStream* stream); 565 void ActivateStream(SpdyStream* stream);
592 void DeleteStream(SpdyStreamId id, int status); 566 void DeleteStream(SpdyStreamId id, int status);
593 567
594 // Removes this session from the session pool. 568 // Removes this session from the session pool.
595 void RemoveFromPool(); 569 void RemoveFromPool();
596 570
597 // Check if we have a pending pushed-stream for this url 571 // Check if we have a pending pushed-stream for this url
598 // Returns the stream if found (and returns it from the pending 572 // Returns the stream if found (and returns it from the pending
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
761 // them? 735 // them?
762 ActiveStreamMap active_streams_; 736 ActiveStreamMap active_streams_;
763 737
764 // Map of all the streams that have already started to be pushed by the 738 // Map of all the streams that have already started to be pushed by the
765 // server, but do not have consumers yet. 739 // server, but do not have consumers yet.
766 PushedStreamMap unclaimed_pushed_streams_; 740 PushedStreamMap unclaimed_pushed_streams_;
767 741
768 // Set of all created streams but that have not yet sent any frames. 742 // Set of all created streams but that have not yet sent any frames.
769 CreatedStreamSet created_streams_; 743 CreatedStreamSet created_streams_;
770 744
771 // As streams have data to be sent, we put them into the write queue. 745 // The write queue.
772 WriteQueue write_queue_; 746 SpdyWriteQueue write_queue_;
773
774 // Mapping from SpdyIOBufferProducers to their corresponding SpdyStream
775 // so that when a stream is destroyed, we can remove the corresponding
776 // producer from |write_queue_|.
777 StreamProducerMap stream_producers_;
778 747
779 // The packet we are currently sending. 748 // The packet we are currently sending.
780 bool write_pending_; // Will be true when a write is in progress. 749 bool write_pending_; // Will be true when a write is in progress.
781 SpdyIOBuffer in_flight_write_; // This is the write buffer in progress. 750 SpdyIOBuffer in_flight_write_; // This is the write buffer in progress.
782 751
783 // Flag if we have a pending message scheduled for WriteSocket. 752 // Flag if we have a pending message scheduled for WriteSocket.
784 bool delayed_write_pending_; 753 bool delayed_write_pending_;
785 754
786 // Flag if we're using an SSL connection for this SpdySession. 755 // Flag if we're using an SSL connection for this SpdySession.
787 bool is_secure_; 756 bool is_secure_;
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
903 // This SPDY proxy is allowed to push resources from origins that are 872 // This SPDY proxy is allowed to push resources from origins that are
904 // different from those of their associated streams. 873 // different from those of their associated streams.
905 HostPortPair trusted_spdy_proxy_; 874 HostPortPair trusted_spdy_proxy_;
906 875
907 TimeFunc time_func_; 876 TimeFunc time_func_;
908 }; 877 };
909 878
910 } // namespace net 879 } // namespace net
911 880
912 #endif // NET_SPDY_SPDY_SESSION_H_ 881 #endif // NET_SPDY_SPDY_SESSION_H_
OLDNEW
« no previous file with comments | « net/spdy/spdy_io_buffer.cc ('k') | net/spdy/spdy_session.cc » ('j') | net/spdy/spdy_session.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698