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

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 use-after-free (crbug.com/230259) 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/spdy/spdy_io_buffer.cc ('k') | net/spdy/spdy_session.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/next_proto.h" 25 #include "net/socket/next_proto.h"
26 #include "net/socket/ssl_client_socket.h" 26 #include "net/socket/ssl_client_socket.h"
27 #include "net/socket/stream_socket.h" 27 #include "net/socket/stream_socket.h"
28 #include "net/spdy/buffered_spdy_framer.h" 28 #include "net/spdy/buffered_spdy_framer.h"
29 #include "net/spdy/spdy_credential_state.h" 29 #include "net/spdy/spdy_credential_state.h"
30 #include "net/spdy/spdy_header_block.h" 30 #include "net/spdy/spdy_header_block.h"
31 #include "net/spdy/spdy_io_buffer.h" 31 #include "net/spdy/spdy_io_buffer.h"
32 #include "net/spdy/spdy_protocol.h" 32 #include "net/spdy/spdy_protocol.h"
33 #include "net/spdy/spdy_session_pool.h" 33 #include "net/spdy/spdy_session_pool.h"
34 #include "net/spdy/spdy_write_queue.h"
34 #include "net/ssl/ssl_client_cert_type.h" 35 #include "net/ssl/ssl_client_cert_type.h"
35 #include "net/ssl/ssl_config_service.h" 36 #include "net/ssl/ssl_config_service.h"
36 37
37 namespace net { 38 namespace net {
38 39
39 // This is somewhat arbitrary and not really fixed, but it will always work 40 // This is somewhat arbitrary and not really fixed, but it will always work
40 // reasonably with ethernet. Chop the world into 2-packet chunks. This is 41 // reasonably with ethernet. Chop the world into 2-packet chunks. This is
41 // somewhat arbitrary, but is reasonably small and ensures that we elicit 42 // somewhat arbitrary, but is reasonably small and ensures that we elicit
42 // ACKs quickly from TCP (because TCP tries to only ACK every other packet). 43 // ACKs quickly from TCP (because TCP tries to only ACK every other packet).
43 const int kMss = 1430; 44 const int kMss = 1430;
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 // TODO(akalin): Use base::TickClock when it becomes available. 168 // TODO(akalin): Use base::TickClock when it becomes available.
168 typedef base::TimeTicks (*TimeFunc)(void); 169 typedef base::TimeTicks (*TimeFunc)(void);
169 170
170 // How we handle flow control (version-dependent). 171 // How we handle flow control (version-dependent).
171 enum FlowControlState { 172 enum FlowControlState {
172 FLOW_CONTROL_NONE, 173 FLOW_CONTROL_NONE,
173 FLOW_CONTROL_STREAM, 174 FLOW_CONTROL_STREAM,
174 FLOW_CONTROL_STREAM_AND_SESSION 175 FLOW_CONTROL_STREAM_AND_SESSION
175 }; 176 };
176 177
177 // Defines an interface for producing SpdyIOBuffers.
178 class NET_EXPORT_PRIVATE SpdyIOBufferProducer {
179 public:
180 SpdyIOBufferProducer() {}
181
182 // Returns a newly created SpdyIOBuffer, owned by the caller, or NULL
183 // if not buffer is ready to be produced.
184 virtual SpdyIOBuffer* ProduceNextBuffer(SpdySession* session) = 0;
185
186 virtual RequestPriority GetPriority() const = 0;
187
188 virtual ~SpdyIOBufferProducer() {}
189
190 protected:
191 // Activates |spdy_stream| in |spdy_session|.
192 static void ActivateStream(SpdySession* spdy_session,
193 SpdyStream* spdy_stream);
194
195 static SpdyIOBuffer* CreateIOBuffer(SpdyFrame* frame,
196 RequestPriority priority,
197 SpdyStream* spdy_stream);
198 };
199
200 // Create a new SpdySession. 178 // Create a new SpdySession.
201 // |host_port_proxy_pair| is the host/port that this session connects to, and 179 // |host_port_proxy_pair| is the host/port that this session connects to, and
202 // the proxy configuration settings that it's using. 180 // the proxy configuration settings that it's using.
203 // |spdy_session_pool| is the SpdySessionPool that owns us. Its lifetime must 181 // |spdy_session_pool| is the SpdySessionPool that owns us. Its lifetime must
204 // strictly be greater than |this|. 182 // strictly be greater than |this|.
205 // |session| is the HttpNetworkSession. |net_log| is the NetLog that we log 183 // |session| is the HttpNetworkSession. |net_log| is the NetLog that we log
206 // network events to. 184 // network events to.
207 SpdySession(const HostPortProxyPair& host_port_proxy_pair, 185 SpdySession(const HostPortProxyPair& host_port_proxy_pair,
208 SpdySessionPool* spdy_session_pool, 186 SpdySessionPool* spdy_session_pool,
209 HttpServerProperties* http_server_properties, 187 HttpServerProperties* http_server_properties,
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 // For SSL-based sessions, verifies that the server certificate in use by 230 // For SSL-based sessions, verifies that the server certificate in use by
253 // this session provides authentication for the domain and no client 231 // this session provides authentication for the domain and no client
254 // certificate or channel ID was sent to the original server during the SSL 232 // certificate or channel ID was sent to the original server during the SSL
255 // handshake. NOTE: This function can have false negatives on some 233 // handshake. NOTE: This function can have false negatives on some
256 // platforms. 234 // platforms.
257 // TODO(wtc): rename this function and the Net.SpdyIPPoolDomainMatch 235 // TODO(wtc): rename this function and the Net.SpdyIPPoolDomainMatch
258 // histogram because this function does more than verifying domain 236 // histogram because this function does more than verifying domain
259 // authentication now. 237 // authentication now.
260 bool VerifyDomainAuthentication(const std::string& domain); 238 bool VerifyDomainAuthentication(const std::string& domain);
261 239
262 // Records that |stream| has a write available from |producer|. 240 // Pushes the given producer into the write queue for
263 // |producer| will be owned by this SpdySession. 241 // |stream|. |stream| is guaranteed to be activated before the
264 void SetStreamHasWriteAvailable(SpdyStream* stream, 242 // producer is used to produce its frame.
265 SpdyIOBufferProducer* producer); 243 void EnqueueStreamWrite(SpdyStream* stream,
244 scoped_ptr<SpdyFrameProducer> producer);
266 245
267 // Send the SYN frame for |stream_id|. This also sends PING message to check 246 // Creates and returns a SYN frame for |stream_id|.
268 // the status of the connection. 247 scoped_ptr<SpdyFrame> CreateSynStream(
269 SpdyFrame* CreateSynStream(
270 SpdyStreamId stream_id, 248 SpdyStreamId stream_id,
271 RequestPriority priority, 249 RequestPriority priority,
272 uint8 credential_slot, 250 uint8 credential_slot,
273 SpdyControlFlags flags, 251 SpdyControlFlags flags,
274 const SpdyHeaderBlock& headers); 252 const SpdyHeaderBlock& headers);
275 253
276 // Write a CREDENTIAL frame to the session. 254 // Tries to create a CREDENTIAL frame. If successful, fills in
277 SpdyFrame* CreateCredentialFrame(const std::string& origin, 255 // |credential_frame| and returns OK. Returns the error (guaranteed
278 SSLClientCertType type, 256 // to not be ERR_IO_PENDING) otherwise.
279 const std::string& key, 257 int CreateCredentialFrame(const std::string& origin,
280 const std::string& cert, 258 SSLClientCertType type,
281 RequestPriority priority); 259 const std::string& key,
260 const std::string& cert,
261 RequestPriority priority,
262 scoped_ptr<SpdyFrame>* credential_frame);
282 263
283 // Write a HEADERS frame to the stream. 264 // Creates and returns a HEADERS frame.
284 SpdyFrame* CreateHeadersFrame(SpdyStreamId stream_id, 265 scoped_ptr<SpdyFrame> CreateHeadersFrame(SpdyStreamId stream_id,
285 const SpdyHeaderBlock& headers, 266 const SpdyHeaderBlock& headers,
286 SpdyControlFlags flags); 267 SpdyControlFlags flags);
287 268
288 // Write a data frame to the stream. 269 // Creates and returns a data frame. May return NULL if stalled by
289 // Used to create and queue a data frame for the given stream. 270 // flow control.
290 SpdyFrame* CreateDataFrame(SpdyStreamId stream_id, 271 scoped_ptr<SpdyFrame> CreateDataFrame(SpdyStreamId stream_id,
291 net::IOBuffer* data, int len, 272 net::IOBuffer* data,
292 SpdyDataFlags flags); 273 int len,
274 SpdyDataFlags flags);
293 275
294 // Close a stream. 276 // Close a stream.
295 void CloseStream(SpdyStreamId stream_id, int status); 277 void CloseStream(SpdyStreamId stream_id, int status);
296 278
297 // Close a stream that has been created but is not yet active. 279 // Close a stream that has been created but is not yet active.
298 void CloseCreatedStream(SpdyStream* stream, int status); 280 void CloseCreatedStream(SpdyStream* stream, int status);
299 281
300 // Reset a stream by sending a RST_STREAM frame with given status code. 282 // Reset a stream by sending a RST_STREAM frame with given status code.
301 // Also closes the stream. Was not piggybacked to CloseStream since not 283 // Also closes the stream. Was not piggybacked to CloseStream since not
302 // all of the calls to CloseStream necessitate sending a RST_STREAM. 284 // all of the calls to CloseStream necessitate sending a RST_STREAM.
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
466 FRIEND_TEST_ALL_PREFIXES(SpdySessionSpdy3Test, SessionFlowControlEndToEnd31); 448 FRIEND_TEST_ALL_PREFIXES(SpdySessionSpdy3Test, SessionFlowControlEndToEnd31);
467 449
468 typedef std::deque<SpdyStreamRequest*> PendingStreamRequestQueue; 450 typedef std::deque<SpdyStreamRequest*> PendingStreamRequestQueue;
469 typedef std::set<SpdyStreamRequest*> PendingStreamRequestCompletionSet; 451 typedef std::set<SpdyStreamRequest*> PendingStreamRequestCompletionSet;
470 452
471 typedef std::map<int, scoped_refptr<SpdyStream> > ActiveStreamMap; 453 typedef std::map<int, scoped_refptr<SpdyStream> > ActiveStreamMap;
472 typedef std::map<std::string, 454 typedef std::map<std::string,
473 std::pair<scoped_refptr<SpdyStream>, base::TimeTicks> > PushedStreamMap; 455 std::pair<scoped_refptr<SpdyStream>, base::TimeTicks> > PushedStreamMap;
474 456
475 typedef std::set<scoped_refptr<SpdyStream> > CreatedStreamSet; 457 typedef std::set<scoped_refptr<SpdyStream> > CreatedStreamSet;
476 typedef std::map<SpdyIOBufferProducer*, SpdyStream*> StreamProducerMap;
477
478 class SpdyIOBufferProducerCompare {
479 public:
480 bool operator() (const SpdyIOBufferProducer* lhs,
481 const SpdyIOBufferProducer* rhs) const {
482 return lhs->GetPriority() < rhs->GetPriority();
483 }
484 };
485
486 typedef std::priority_queue<SpdyIOBufferProducer*,
487 std::vector<SpdyIOBufferProducer*>,
488 SpdyIOBufferProducerCompare> WriteQueue;
489 458
490 enum State { 459 enum State {
491 IDLE, 460 IDLE,
492 CONNECTING, 461 CONNECTING,
493 CONNECTED, 462 CONNECTED,
494 CLOSED 463 CLOSED
495 }; 464 };
496 465
497 virtual ~SpdySession(); 466 virtual ~SpdySession();
498 467
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
561 // Returns OK on success, or an error on failure. 530 // Returns OK on success, or an error on failure.
562 net::Error ReadSocket(); 531 net::Error ReadSocket();
563 532
564 // Write current data to the socket. 533 // Write current data to the socket.
565 void WriteSocketLater(); 534 void WriteSocketLater();
566 void WriteSocket(); 535 void WriteSocket();
567 536
568 // Get a new stream id. 537 // Get a new stream id.
569 int GetNewStreamId(); 538 int GetNewStreamId();
570 539
571 // Queue a frame for sending. 540 // Pushes the given frame with the given priority into the write
572 // |frame| is the frame to send. 541 // queue for the session.
573 // |priority| is the priority for insertion into the queue. 542 void EnqueueSessionWrite(RequestPriority priority,
574 void QueueFrame(SpdyFrame* frame, RequestPriority priority); 543 scoped_ptr<SpdyFrame> frame);
544
545 // Puts |producer| associated with |stream| onto the write queue
546 // with the given priority.
547 void EnqueueWrite(RequestPriority priority,
548 scoped_ptr<SpdyFrameProducer> producer,
549 const scoped_refptr<SpdyStream>& stream);
575 550
576 // Track active streams in the active stream list. 551 // Track active streams in the active stream list.
577 void ActivateStream(SpdyStream* stream); 552 void ActivateStream(SpdyStream* stream);
578 void DeleteStream(SpdyStreamId id, int status); 553 void DeleteStream(SpdyStreamId id, int status);
579 554
580 // Removes this session from the session pool. 555 // Removes this session from the session pool.
581 void RemoveFromPool(); 556 void RemoveFromPool();
582 557
583 // Check if we have a pending pushed-stream for this url 558 // Check if we have a pending pushed-stream for this url
584 // Returns the stream if found (and returns it from the pending 559 // Returns the stream if found (and returns it from the pending
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
748 // them? 723 // them?
749 ActiveStreamMap active_streams_; 724 ActiveStreamMap active_streams_;
750 725
751 // Map of all the streams that have already started to be pushed by the 726 // Map of all the streams that have already started to be pushed by the
752 // server, but do not have consumers yet. 727 // server, but do not have consumers yet.
753 PushedStreamMap unclaimed_pushed_streams_; 728 PushedStreamMap unclaimed_pushed_streams_;
754 729
755 // Set of all created streams but that have not yet sent any frames. 730 // Set of all created streams but that have not yet sent any frames.
756 CreatedStreamSet created_streams_; 731 CreatedStreamSet created_streams_;
757 732
758 // As streams have data to be sent, we put them into the write queue. 733 // The write queue.
759 WriteQueue write_queue_; 734 SpdyWriteQueue write_queue_;
760
761 // Mapping from SpdyIOBufferProducers to their corresponding SpdyStream
762 // so that when a stream is destroyed, we can remove the corresponding
763 // producer from |write_queue_|.
764 StreamProducerMap stream_producers_;
765 735
766 // The packet we are currently sending. 736 // The packet we are currently sending.
767 bool write_pending_; // Will be true when a write is in progress. 737 bool write_pending_; // Will be true when a write is in progress.
768 SpdyIOBuffer in_flight_write_; // This is the write buffer in progress. 738 SpdyIOBuffer in_flight_write_; // This is the write buffer in progress.
769 739
770 // Flag if we have a pending message scheduled for WriteSocket. 740 // Flag if we have a pending message scheduled for WriteSocket.
771 bool delayed_write_pending_; 741 bool delayed_write_pending_;
772 742
773 // Flag if we're using an SSL connection for this SpdySession. 743 // Flag if we're using an SSL connection for this SpdySession.
774 bool is_secure_; 744 bool is_secure_;
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
882 // This SPDY proxy is allowed to push resources from origins that are 852 // This SPDY proxy is allowed to push resources from origins that are
883 // different from those of their associated streams. 853 // different from those of their associated streams.
884 HostPortPair trusted_spdy_proxy_; 854 HostPortPair trusted_spdy_proxy_;
885 855
886 TimeFunc time_func_; 856 TimeFunc time_func_;
887 }; 857 };
888 858
889 } // namespace net 859 } // namespace net
890 860
891 #endif // NET_SPDY_SPDY_SESSION_H_ 861 #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') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698