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

Unified Diff: net/http/http_pipelined_connection_impl.h

Issue 8515020: Refactor state machines in HttpPipelinedConnectionImpl. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add more checks and comments Created 9 years, 1 month 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 | « no previous file | net/http/http_pipelined_connection_impl.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/http/http_pipelined_connection_impl.h
diff --git a/net/http/http_pipelined_connection_impl.h b/net/http/http_pipelined_connection_impl.h
index d77f9aeef75ce7b3d9d127249f7bf36d55766c8c..6a7f3859f8102f809edbe52a7de4ba6c1c2ad225 100644
--- a/net/http/http_pipelined_connection_impl.h
+++ b/net/http/http_pipelined_connection_impl.h
@@ -11,6 +11,7 @@
#include <string>
#include "base/basictypes.h"
+#include "base/location.h"
#include "base/memory/linked_ptr.h"
#include "base/task.h"
#include "net/base/completion_callback.h"
@@ -125,26 +126,31 @@ class NET_EXPORT_PRIVATE HttpPipelinedConnectionImpl
STREAM_READ_PENDING,
STREAM_ACTIVE,
STREAM_CLOSED,
+ STREAM_READ_EVICTED,
STREAM_UNUSED,
};
enum SendRequestState {
- SEND_STATE_NEXT_REQUEST,
+ SEND_STATE_START_IMMEDIATELY,
+ SEND_STATE_START_NEXT_DEFERRED_REQUEST,
+ SEND_STATE_SEND_ACTIVE_REQUEST,
SEND_STATE_COMPLETE,
+ SEND_STATE_EVICT_PENDING_REQUESTS,
SEND_STATE_NONE,
- SEND_STATE_UNUSABLE,
};
enum ReadHeadersState {
- READ_STATE_NEXT_HEADERS,
- READ_STATE_COMPLETE,
+ READ_STATE_START_IMMEDIATELY,
+ READ_STATE_START_NEXT_DEFERRED_READ,
+ READ_STATE_READ_HEADERS,
+ READ_STATE_READ_HEADERS_COMPLETE,
READ_STATE_WAITING_FOR_CLOSE,
READ_STATE_STREAM_CLOSED,
READ_STATE_NONE,
- READ_STATE_UNUSABLE,
+ READ_STATE_EVICT_PENDING_READS,
};
- struct DeferredSendRequest {
- DeferredSendRequest();
- ~DeferredSendRequest();
+ struct PendingSendRequest {
+ PendingSendRequest();
+ ~PendingSendRequest();
int pipeline_id;
std::string request_line;
@@ -180,10 +186,17 @@ class NET_EXPORT_PRIVATE HttpPipelinedConnectionImpl
// Called when an asynchronous Send() completes.
void OnSendIOCallback(int result);
- // Sends the next deferred request. This may be called immediately after
- // SendRequest(), or it may be in a new task after a prior send completes in
- // DoSendComplete().
- int DoSendNextRequest(int result);
+ // Activates the only request in |pending_send_request_queue_|. This should
+ // only be called via SendRequest() when the send loop is idle.
+ int DoStartRequestImmediately(int result);
+
+ // Activates the first request in |pending_send_request_queue_| that hasn't
+ // been closed, if any. This is called via DoSendComplete() after a prior
+ // request complets.
+ int DoStartNextDeferredRequest(int result);
+
+ // Sends the active request.
+ int DoSendActiveRequest(int result);
// Notifies the user that the send has completed. This may be called directly
// after SendRequest() for a synchronous request, or it may be called in
@@ -203,22 +216,30 @@ class NET_EXPORT_PRIVATE HttpPipelinedConnectionImpl
// Called when the pending asynchronous ReadResponseHeaders() completes.
void OnReadIOCallback(int result);
- // Determines if the next response in the pipeline is ready to be read.
- // If it's ready, then we call ReadResponseHeaders() on the underlying parser.
- // HttpPipelinedSocket indicates its readiness by calling
- // ReadResponseHeaders(). This function may be called immediately after
- // ReadResponseHeaders(), or it may be called in a new task after a previous
- // HttpPipelinedSocket finishes its work.
- int DoReadNextHeaders(int result);
+ // Invokes DoStartNextDeferredRead() if the read loop is idle. This is called
+ // via a task queued when the previous |active_read_id_| closes its stream
+ // after a succesful response.
+ void StartNextDeferredRead();
+
+ // Activates the next read request immediately. This is called via
+ // ReadResponseHeaders() if that stream is at the front of |request_order_|
+ // and the read loop is idle.
+ int DoStartReadImmediately(int result);
+
+ // Activates the next read request in |request_order_| if it's ready to go.
+ // This is called via StartNextDeferredRead().
+ int DoStartNextDeferredRead(int result);
+
+ // Calls ReadResponseHeaders() on the active request's parser.
+ int DoReadHeaders(int result);
// Notifies the user that reading the headers has completed. This may happen
// directly after DoReadNextHeaders() if the response is already available.
// Otherwise, it is called in response to OnReadIOCallback().
int DoReadHeadersComplete(int result);
- // This is a holding state. It does not do anything, except exit the
- // DoReadHeadersLoop(). It is called after DoReadHeadersComplete().
- int DoReadWaitingForClose(int result);
+ // Halts the read loop until Close() is called by the active stream.
+ int DoReadWaitForClose(int result);
// Cleans up the state associated with the active request. Invokes
// DoReadNextHeaders() in a new task to start the next response. This is
@@ -230,12 +251,18 @@ class NET_EXPORT_PRIVATE HttpPipelinedConnectionImpl
// HttpPipelinedSockets indicates the connection was suddenly closed.
int DoEvictPendingReadHeaders(int result);
- // Invokes the user's callback in response to SendRequest() or
+ // Posts a task to fire the user's callback in response to SendRequest() or
// ReadResponseHeaders() completing on an underlying parser. This might be
// invoked in response to our own IO callbacks, or it may be invoked if the
// underlying parser completes SendRequest() or ReadResponseHeaders()
// synchronously, but we've already returned ERR_IO_PENDING to the user's
// SendRequest() or ReadResponseHeaders() call into us.
+ void QueueUserCallback(int pipeline_id,
+ OldCompletionCallback* callback,
+ int rv,
+ const tracked_objects::Location& from_here);
+
+ // Invokes the callback queued in QueueUserCallback().
void FireUserCallback(int pipeline_id, int result);
Delegate* delegate_;
@@ -255,14 +282,16 @@ class NET_EXPORT_PRIVATE HttpPipelinedConnectionImpl
std::queue<int> request_order_;
- std::queue<DeferredSendRequest> deferred_request_queue_;
+ std::queue<PendingSendRequest*> pending_send_request_queue_;
+ scoped_ptr<PendingSendRequest> active_send_request_;
SendRequestState send_next_state_;
+ bool send_still_on_call_stack_;
OldCompletionCallbackImpl<HttpPipelinedConnectionImpl> send_io_callback_;
- OldCompletionCallback* send_user_callback_;
ReadHeadersState read_next_state_;
+ int active_read_id_;
+ bool read_still_on_call_stack_;
OldCompletionCallbackImpl<HttpPipelinedConnectionImpl> read_io_callback_;
- OldCompletionCallback* read_user_callback_;
DISALLOW_COPY_AND_ASSIGN(HttpPipelinedConnectionImpl);
};
« no previous file with comments | « no previous file | net/http/http_pipelined_connection_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698