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

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 Matt's comments. Created 4 years, 7 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
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())

Powered by Google App Engine
This is Rietveld 408576698