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

Unified Diff: net/socket/client_socket_pool_base.cc

Issue 1898133002: Add reprioritization to socket pools. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Incorporated comments. Created 3 years, 10 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/socket/client_socket_pool_base.h ('k') | net/socket/client_socket_pool_base_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/socket/client_socket_pool_base.cc
diff --git a/net/socket/client_socket_pool_base.cc b/net/socket/client_socket_pool_base.cc
index c5427ccf7a621906788859ab7d4bb647d90539ed..30cea26f005becafbcc8158d4747cc0de834262d 100644
--- a/net/socket/client_socket_pool_base.cc
+++ b/net/socket/client_socket_pool_base.cc
@@ -305,7 +305,7 @@ void ClientSocketPoolBaseHelper::RemoveHigherLayeredPool(
int ClientSocketPoolBaseHelper::RequestSocket(
const std::string& group_name,
- std::unique_ptr<const Request> request) {
+ std::unique_ptr<Request> request) {
CHECK(!request->callback().is_null());
CHECK(request->handle());
@@ -562,6 +562,20 @@ void ClientSocketPoolBaseHelper::LogBoundConnectJobToRequest(
connect_job_source.ToEventParametersCallback());
}
+void ClientSocketPoolBaseHelper::SetPriority(const std::string& group_name,
+ ClientSocketHandle* handle,
+ RequestPriority priority) {
+ GroupMap::iterator group_it = group_map_.find(group_name);
+ if (group_it == group_map_.end()) {
+ DCHECK(base::ContainsKey(pending_callback_map_, handle));
+ // The Request has already completed and been destroyed; nothing to
+ // reprioritize.
+ return;
+ }
+
+ group_it->second->SetPriority(handle, priority);
+}
+
void ClientSocketPoolBaseHelper::CancelRequest(
const std::string& group_name, ClientSocketHandle* handle) {
PendingCallbackMap::iterator callback_it = pending_callback_map_.find(handle);
@@ -582,8 +596,7 @@ void ClientSocketPoolBaseHelper::CancelRequest(
Group* group = GetOrCreateGroup(group_name);
// Search pending_requests for matching handle.
- std::unique_ptr<const Request> request =
- group->FindAndRemovePendingRequest(handle);
+ std::unique_ptr<Request> request = group->FindAndRemovePendingRequest(handle);
if (request) {
request->net_log().AddEvent(NetLogEventType::CANCELLED);
request->net_log().EndEvent(NetLogEventType::SOCKET_POOL);
@@ -967,7 +980,7 @@ void ClientSocketPoolBaseHelper::OnConnectJobComplete(
if (result == OK) {
DCHECK(socket.get());
RemoveConnectJob(job, group);
- std::unique_ptr<const Request> request = group->PopNextPendingRequest();
+ std::unique_ptr<Request> request = group->PopNextPendingRequest();
if (request) {
LogBoundConnectJobToRequest(job_log.source(), *request);
HandOutSocket(std::move(socket), ClientSocketHandle::UNUSED,
@@ -984,7 +997,7 @@ void ClientSocketPoolBaseHelper::OnConnectJobComplete(
// If we got a socket, it must contain error information so pass that
// up so that the caller can retrieve it.
bool handed_out_socket = false;
- std::unique_ptr<const Request> request = group->PopNextPendingRequest();
+ std::unique_ptr<Request> request = group->PopNextPendingRequest();
if (request) {
LogBoundConnectJobToRequest(job_log.source(), *request);
job->GetAdditionalErrorState(request->handle());
@@ -1053,7 +1066,7 @@ void ClientSocketPoolBaseHelper::ProcessPendingRequest(
int rv = RequestSocketInternal(group_name, *next_request);
if (rv != ERR_IO_PENDING) {
- std::unique_ptr<const Request> request = group->PopNextPendingRequest();
+ std::unique_ptr<Request> request = group->PopNextPendingRequest();
DCHECK(request);
if (group->IsEmpty())
RemoveGroup(group_name);
@@ -1140,7 +1153,7 @@ void ClientSocketPoolBaseHelper::CancelAllRequestsWithError(int error) {
Group* group = i->second;
while (true) {
- std::unique_ptr<const Request> request = group->PopNextPendingRequest();
+ std::unique_ptr<Request> request = group->PopNextPendingRequest();
if (!request)
break;
InvokeUserCallbackLater(request->handle(), request->callback(), error);
@@ -1383,7 +1396,7 @@ bool ClientSocketPoolBaseHelper::Group::HasConnectJobForHandle(
}
void ClientSocketPoolBaseHelper::Group::InsertPendingRequest(
- std::unique_ptr<const Request> request) {
+ std::unique_ptr<Request> request) {
// This value must be cached before we release |request|.
RequestPriority priority = request->priority();
if (request->respect_limits() == ClientSocketPool::RespectLimits::DISABLED) {
@@ -1397,33 +1410,61 @@ void ClientSocketPoolBaseHelper::Group::InsertPendingRequest(
}
}
-std::unique_ptr<const ClientSocketPoolBaseHelper::Request>
+std::unique_ptr<ClientSocketPoolBaseHelper::Request>
ClientSocketPoolBaseHelper::Group::PopNextPendingRequest() {
if (pending_requests_.empty())
- return std::unique_ptr<const ClientSocketPoolBaseHelper::Request>();
+ return std::unique_ptr<ClientSocketPoolBaseHelper::Request>();
return RemovePendingRequest(pending_requests_.FirstMax());
}
-std::unique_ptr<const ClientSocketPoolBaseHelper::Request>
+std::unique_ptr<ClientSocketPoolBaseHelper::Request>
ClientSocketPoolBaseHelper::Group::FindAndRemovePendingRequest(
ClientSocketHandle* handle) {
for (RequestQueue::Pointer pointer = pending_requests_.FirstMax();
!pointer.is_null();
pointer = pending_requests_.GetNextTowardsLastMin(pointer)) {
if (pointer.value()->handle() == handle) {
- std::unique_ptr<const Request> request = RemovePendingRequest(pointer);
+ DCHECK_EQ(static_cast<RequestPriority>(pointer.priority()),
+ pointer.value()->priority());
+ std::unique_ptr<Request> request = RemovePendingRequest(pointer);
return request;
}
}
- return std::unique_ptr<const ClientSocketPoolBaseHelper::Request>();
+ return std::unique_ptr<ClientSocketPoolBaseHelper::Request>();
+}
+
+void ClientSocketPoolBaseHelper::Group::SetPriority(ClientSocketHandle* handle,
+ RequestPriority priority) {
+ for (RequestQueue::Pointer pointer = pending_requests_.FirstMax();
+ !pointer.is_null();
+ pointer = pending_requests_.GetNextTowardsLastMin(pointer)) {
+ if (pointer.value()->handle() == handle) {
+ if (pointer.value()->priority() == priority)
+ return;
+
+ std::unique_ptr<Request> request = RemovePendingRequest(pointer);
+
+ // Requests that ignore limits much be created and remain at the highest
+ // priority, and should not be reprioritized.
+ DCHECK_EQ(request->respect_limits(),
+ ClientSocketPool::RespectLimits::ENABLED);
+
+ request->set_priority(priority);
+ InsertPendingRequest(std::move(request));
+ return;
+ }
+ }
+
+ // This function must be called with a valid ClientSocketHandle.
+ NOTREACHED();
}
-std::unique_ptr<const ClientSocketPoolBaseHelper::Request>
+std::unique_ptr<ClientSocketPoolBaseHelper::Request>
ClientSocketPoolBaseHelper::Group::RemovePendingRequest(
const RequestQueue::Pointer& pointer) {
// TODO(eroman): Temporary for debugging http://crbug.com/467797.
CHECK(!pointer.is_null());
- std::unique_ptr<const Request> request(pointer.value());
+ std::unique_ptr<Request> request(pointer.value());
pending_requests_.Erase(pointer);
// If there are no more requests, kill the backup timer.
if (pending_requests_.empty())
« no previous file with comments | « net/socket/client_socket_pool_base.h ('k') | net/socket/client_socket_pool_base_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698