Chromium Code Reviews| 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 252ca294d4c76536297089003726cca5dac043d1..530fb14b4ac885c232869674897947c9c8ca0fa2 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; |
|
mmenke
2017/01/03 22:51:22
Per earlier comment, the ClientSocketHandle knows
Randy Smith (Not in Mondays)
2017/01/05 03:47:18
I'm embarrassed to say that when I first read your
|
| + } |
| + |
| + 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); |
| @@ -947,7 +960,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, |
| @@ -964,7 +977,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()); |
| @@ -1033,7 +1046,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); |
| @@ -1120,7 +1133,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); |
| @@ -1363,7 +1376,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) { |
| @@ -1377,33 +1390,59 @@ 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); |
| + 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.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; |
| + } |
| + } |
|
mmenke
2017/01/03 22:51:22
This entire block is just:
std::unique_ptr<Reques
Randy Smith (Not in Mondays)
2017/01/05 03:47:18
The entire reason for this code is indeed the case
Randy Smith (Not in Mondays)
2017/01/13 23:05:44
Ping?
mmenke
2017/01/17 18:56:31
Sorry, I was thinking the early return was a break
Randy Smith (Not in Mondays)
2017/01/17 19:50:36
So I'm quite happy to do #3; I changed it to this
Charlie Harrison
2017/01/17 20:04:39
I am OK with #3 as long as it is documented clearl
mmenke
2017/01/17 20:11:28
Could also do a DLOG(WARNING), though if DLOG's ar
|
| + |
| + // 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()) |