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

Side by Side Diff: components/offline_pages/background/request_picker.cc

Issue 2262423002: Use a vector of smart pointers for callback return type. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: CR feedback per BauerB Created 4 years, 3 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/offline_pages/background/request_picker.h" 5 #include "components/offline_pages/background/request_picker.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "components/offline_pages/background/save_page_request.h" 9 #include "components/offline_pages/background/save_page_request.h"
10 10
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 current_conditions_.reset(new DeviceConditions(*device_conditions)); 43 current_conditions_.reset(new DeviceConditions(*device_conditions));
44 // Get all requests from queue (there is no filtering mechanism). 44 // Get all requests from queue (there is no filtering mechanism).
45 queue_->GetRequests(base::Bind(&RequestPicker::GetRequestResultCallback, 45 queue_->GetRequests(base::Bind(&RequestPicker::GetRequestResultCallback,
46 weak_ptr_factory_.GetWeakPtr())); 46 weak_ptr_factory_.GetWeakPtr()));
47 } 47 }
48 48
49 // When we get contents from the queue, use them to pick the next 49 // When we get contents from the queue, use them to pick the next
50 // request to operate on (if any). 50 // request to operate on (if any).
51 void RequestPicker::GetRequestResultCallback( 51 void RequestPicker::GetRequestResultCallback(
52 RequestQueue::GetRequestsResult, 52 RequestQueue::GetRequestsResult,
53 const std::vector<SavePageRequest>& requests) { 53 std::vector<std::unique_ptr<SavePageRequest>> requests) {
54 // If there is nothing to do, return right away. 54 // If there is nothing to do, return right away.
55 if (requests.size() == 0) { 55 if (requests.size() == 0) {
56 not_picked_callback_.Run(false); 56 not_picked_callback_.Run(false);
57 return; 57 return;
58 } 58 }
59 59
60 // Get the expired requests to be removed from the queue, and the valid ones 60 // Get the expired requests to be removed from the queue, and the valid ones
61 // from which to pick the next request. 61 // from which to pick the next request.
62 std::vector<SavePageRequest> valid_requests; 62 std::vector<std::unique_ptr<SavePageRequest>> valid_requests;
63 std::vector<SavePageRequest> expired_requests; 63 std::vector<std::unique_ptr<SavePageRequest>> expired_requests;
64 SplitRequests(requests, valid_requests, expired_requests); 64 SplitRequests(std::move(requests), &valid_requests, &expired_requests);
65 std::vector<int64_t> expired_request_ids; 65 std::vector<int64_t> expired_request_ids;
66 for (auto request : expired_requests) 66 std::vector<std::unique_ptr<SavePageRequest>>::iterator request;
Bernhard Bauer 2016/09/08 09:01:57 Here you could also use the C++-11-style loop.
Pete Williamson 2016/09/08 17:27:00 Done.
67 expired_request_ids.push_back(request.request_id()); 67 for (request = expired_requests.begin(); request != expired_requests.end();
68 ++request)
69 expired_request_ids.push_back(request->get()->request_id());
68 70
69 queue_->RemoveRequests(expired_request_ids, 71 queue_->RemoveRequests(expired_request_ids,
70 base::Bind(&RequestPicker::OnRequestExpired, 72 base::Bind(&RequestPicker::OnRequestExpired,
71 weak_ptr_factory_.GetWeakPtr())); 73 weak_ptr_factory_.GetWeakPtr()));
72 74
73 // Pick the most deserving request for our conditions. 75 // Pick the most deserving request for our conditions.
74 const SavePageRequest* picked_request = nullptr; 76 const SavePageRequest* picked_request = nullptr;
75 77
76 RequestCompareFunction comparator = nullptr; 78 RequestCompareFunction comparator = nullptr;
77 79
78 // Choose which comparison function to use based on policy. 80 // Choose which comparison function to use based on policy.
79 if (policy_->RetryCountIsMoreImportantThanRecency()) 81 if (policy_->RetryCountIsMoreImportantThanRecency())
80 comparator = &RequestPicker::RetryCountFirstCompareFunction; 82 comparator = &RequestPicker::RetryCountFirstCompareFunction;
81 else 83 else
82 comparator = &RequestPicker::RecencyFirstCompareFunction; 84 comparator = &RequestPicker::RecencyFirstCompareFunction;
83 85
84 // Iterate once through the requests, keeping track of best candidate. 86 // Iterate once through the requests, keeping track of best candidate.
85 bool non_user_requested_tasks_remaining = false; 87 bool non_user_requested_tasks_remaining = false;
86 for (unsigned i = 0; i < valid_requests.size(); ++i) { 88 for (unsigned i = 0; i < valid_requests.size(); ++i) {
87 if (!valid_requests[i].user_requested()) 89 if (!valid_requests[i]->user_requested())
88 non_user_requested_tasks_remaining = true; 90 non_user_requested_tasks_remaining = true;
89 if (!RequestConditionsSatisfied(valid_requests[i])) 91 if (!RequestConditionsSatisfied(valid_requests[i].get()))
90 continue; 92 continue;
91 if (IsNewRequestBetter(picked_request, &(valid_requests[i]), comparator)) 93 if (IsNewRequestBetter(picked_request, valid_requests[i].get(), comparator))
92 picked_request = &(valid_requests[i]); 94 picked_request = valid_requests[i].get();
93 } 95 }
94 96
95 // If we have a best request to try next, get the request coodinator to 97 // If we have a best request to try next, get the request coodinator to
96 // start it. Otherwise return that we have no candidates. 98 // start it. Otherwise return that we have no candidates.
97 if (picked_request != nullptr) { 99 if (picked_request != nullptr) {
98 picked_callback_.Run(*picked_request); 100 picked_callback_.Run(*picked_request);
99 } else { 101 } else {
100 not_picked_callback_.Run(non_user_requested_tasks_remaining); 102 not_picked_callback_.Run(non_user_requested_tasks_remaining);
101 } 103 }
102 } 104 }
103 105
104 // Filter out requests that don't meet the current conditions. For instance, if 106 // Filter out requests that don't meet the current conditions. For instance, if
105 // this is a predictive request, and we are not on WiFi, it should be ignored 107 // this is a predictive request, and we are not on WiFi, it should be ignored
106 // this round. 108 // this round.
107 bool RequestPicker::RequestConditionsSatisfied(const SavePageRequest& request) { 109 bool RequestPicker::RequestConditionsSatisfied(const SavePageRequest* request) {
108 // If the user did not request the page directly, make sure we are connected 110 // If the user did not request the page directly, make sure we are connected
109 // to power and have WiFi and sufficient battery remaining before we take this 111 // to power and have WiFi and sufficient battery remaining before we take this
110 // request. 112 // request.
111 113
112 if (!current_conditions_->IsPowerConnected() && 114 if (!current_conditions_->IsPowerConnected() &&
113 policy_->PowerRequired(request.user_requested())) { 115 policy_->PowerRequired(request->user_requested())) {
114 return false; 116 return false;
115 } 117 }
116 118
117 if (current_conditions_->GetNetConnectionType() != 119 if (current_conditions_->GetNetConnectionType() !=
118 net::NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI && 120 net::NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI &&
119 policy_->UnmeteredNetworkRequired(request.user_requested())) { 121 policy_->UnmeteredNetworkRequired(request->user_requested())) {
120 return false; 122 return false;
121 } 123 }
122 124
123 if (current_conditions_->GetBatteryPercentage() < 125 if (current_conditions_->GetBatteryPercentage() <
124 policy_->BatteryPercentageRequired(request.user_requested())) { 126 policy_->BatteryPercentageRequired(request->user_requested())) {
125 return false; 127 return false;
126 } 128 }
127 129
128 // If we have already started this page the max number of times, it is not 130 // If we have already started this page the max number of times, it is not
129 // eligible to try again. 131 // eligible to try again.
130 // TODO(petewil): We should have code to remove the page from the 132 // TODO(petewil): We should have code to remove the page from the
131 // queue after the last retry. 133 // queue after the last retry.
132 if (request.started_attempt_count() >= policy_->GetMaxStartedTries()) 134 if (request->started_attempt_count() >= policy_->GetMaxStartedTries())
133 return false; 135 return false;
134 136
135 // If we have already completed trying this page the max number of times, it 137 // If we have already completed trying this page the max number of times, it
136 // is not eligible to try again. 138 // is not eligible to try again.
137 // TODO(petewil): We should have code to remove the page from the 139 // TODO(petewil): We should have code to remove the page from the
138 // queue after the last retry. 140 // queue after the last retry.
139 if (request.completed_attempt_count() >= policy_->GetMaxCompletedTries()) 141 if (request->completed_attempt_count() >= policy_->GetMaxCompletedTries())
140 return false; 142 return false;
141 143
142 // If the request is paused, do not consider it. 144 // If the request is paused, do not consider it.
143 if (request.request_state() == SavePageRequest::RequestState::PAUSED) 145 if (request->request_state() == SavePageRequest::RequestState::PAUSED)
144 return false; 146 return false;
145 147
146 // If the request is expired, do not consider it. 148 // If the request is expired, do not consider it.
147 // TODO(petewil): We need to remove this from the queue. 149 // TODO(petewil): We need to remove this from the queue.
148 base::TimeDelta requestAge = base::Time::Now() - request.creation_time(); 150 base::TimeDelta requestAge = base::Time::Now() - request->creation_time();
149 if (requestAge > 151 if (requestAge >
150 base::TimeDelta::FromSeconds( 152 base::TimeDelta::FromSeconds(
151 policy_->GetRequestExpirationTimeInSeconds())) 153 policy_->GetRequestExpirationTimeInSeconds()))
152 return false; 154 return false;
153 155
154 // If this request is not active yet, return false. 156 // If this request is not active yet, return false.
155 // TODO(petewil): If the only reason we return nothing to do is that we have 157 // TODO(petewil): If the only reason we return nothing to do is that we have
156 // inactive requests, we still want to try again later after their activation 158 // inactive requests, we still want to try again later after their activation
157 // time elapses, we shouldn't take ourselves completely off the scheduler. 159 // time elapses, we shouldn't take ourselves completely off the scheduler.
158 if (request.activation_time() > base::Time::Now()) 160 if (request->activation_time() > base::Time::Now())
159 return false; 161 return false;
160 162
161 return true; 163 return true;
162 } 164 }
163 165
164 // Look at policies to decide which requests to prefer. 166 // Look at policies to decide which requests to prefer.
165 bool RequestPicker::IsNewRequestBetter(const SavePageRequest* oldRequest, 167 bool RequestPicker::IsNewRequestBetter(const SavePageRequest* oldRequest,
166 const SavePageRequest* newRequest, 168 const SavePageRequest* newRequest,
167 RequestCompareFunction comparator) { 169 RequestCompareFunction comparator) {
168 170
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
234 base::TimeDelta difference = left->creation_time() - right->creation_time(); 236 base::TimeDelta difference = left->creation_time() - right->creation_time();
235 int result = signum(difference.InMilliseconds()); 237 int result = signum(difference.InMilliseconds());
236 238
237 // Flip the direction of comparison if policy prefers fewer retries. 239 // Flip the direction of comparison if policy prefers fewer retries.
238 if (earlier_requests_better_) 240 if (earlier_requests_better_)
239 result *= -1; 241 result *= -1;
240 242
241 return result; 243 return result;
242 } 244 }
243 245
244 // Split all requests into expired ones and still valid ones.
245 void RequestPicker::SplitRequests( 246 void RequestPicker::SplitRequests(
246 const std::vector<SavePageRequest>& requests, 247 std::vector<std::unique_ptr<SavePageRequest>> requests,
247 std::vector<SavePageRequest>& valid_requests, 248 std::vector<std::unique_ptr<SavePageRequest>>* valid_requests,
248 std::vector<SavePageRequest>& expired_requests) { 249 std::vector<std::unique_ptr<SavePageRequest>>* expired_requests) {
249 for (SavePageRequest request : requests) { 250 std::vector<std::unique_ptr<SavePageRequest>>::iterator request;
250 if (base::Time::Now() - request.creation_time() >= 251 for (request = requests.begin(); request != requests.end(); ++request) {
252 if (base::Time::Now() - request->get()->creation_time() >=
Bernhard Bauer 2016/09/08 09:01:57 And here as well (which would also remove one leve
Pete Williamson 2016/09/08 17:27:00 Done.
251 base::TimeDelta::FromSeconds(kRequestExpirationTimeInSeconds)) { 253 base::TimeDelta::FromSeconds(kRequestExpirationTimeInSeconds)) {
252 expired_requests.push_back(request); 254 expired_requests->push_back(std::move(*request));
253 } else { 255 } else {
254 valid_requests.push_back(request); 256 valid_requests->push_back(std::move(*request));
255 } 257 }
256 } 258 }
257 } 259 }
258 260
259 // Callback used after expired requests are deleted from the queue and notifies 261 // Callback used after expired requests are deleted from the queue and notifies
260 // the coordinator. 262 // the coordinator.
261 void RequestPicker::OnRequestExpired( 263 void RequestPicker::OnRequestExpired(
262 const RequestQueue::UpdateMultipleRequestResults& results, 264 const RequestQueue::UpdateMultipleRequestResults& results,
263 const std::vector<SavePageRequest>& requests) { 265 const std::vector<std::unique_ptr<SavePageRequest>> requests) {
264 for (auto request : requests) 266 std::vector<std::unique_ptr<SavePageRequest>>::const_iterator request;
267 for (request = requests.begin(); request != requests.end(); ++request)
265 notifier_->NotifyCompleted( 268 notifier_->NotifyCompleted(
266 request, RequestCoordinator::BackgroundSavePageResult::EXPIRED); 269 *(request->get()),
270 RequestCoordinator::BackgroundSavePageResult::EXPIRED);
267 } 271 }
268 272
269 } // namespace offline_pages 273 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698