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 62372a1b9a10f5bec77fac160f55d2f5d8aae25f..faa272d53bfed8def6110a8f1ecaae3921affdb0 100644 |
| --- a/net/socket/client_socket_pool_base.cc |
| +++ b/net/socket/client_socket_pool_base.cc |
| @@ -279,7 +279,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()); |
| @@ -527,6 +527,25 @@ 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(ContainsKey(pending_callback_map_, handle)); |
| + // The Request has already completed and been destroyed; nothing to |
| + // reprioritize. |
| + return; |
| + } |
| + |
| + std::unique_ptr<Request> request = |
| + group_it->second->FindAndRemovePendingRequest(handle); |
| + DCHECK(request); |
| + DCHECK(!request->ignore_limits()); |
|
mmenke
2016/05/09 18:41:03
Think this is worth a comment.
Randy Smith (Not in Mondays)
2017/01/03 21:09:08
Done.
|
| + request->set_priority(priority); |
| + group_it->second->InsertPendingRequest(std::move(request)); |
| +} |
| + |
| void ClientSocketPoolBaseHelper::CancelRequest( |
| const std::string& group_name, ClientSocketHandle* handle) { |
| PendingCallbackMap::iterator callback_it = pending_callback_map_.find(handle); |
| @@ -547,8 +566,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(NetLog::TYPE_CANCELLED); |
| request->net_log().EndEvent(NetLog::TYPE_SOCKET_POOL); |
| @@ -904,7 +922,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, |
| @@ -921,7 +939,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()); |
| @@ -990,7 +1008,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); |
| @@ -1066,7 +1084,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); |
| @@ -1304,7 +1322,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) { |
| @@ -1318,33 +1336,33 @@ 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>(); |
| } |
| -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()) |