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

Side by Side Diff: components/invalidation/impl/registration_manager.cc

Issue 2464903003: Revert of Remove stl_util's deletion function use from components/invalidation/. (Closed)
Patch Set: Created 4 years, 1 month 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/invalidation/impl/registration_manager.h" 5 #include "components/invalidation/impl/registration_manager.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <cstddef> 10 #include <cstddef>
11 #include <iterator> 11 #include <iterator>
12 #include <string> 12 #include <string>
13 #include <utility> 13 #include <utility>
14 14
15 #include "base/memory/ptr_util.h"
16 #include "base/rand_util.h" 15 #include "base/rand_util.h"
17 #include "base/stl_util.h" 16 #include "base/stl_util.h"
18 #include "components/invalidation/public/invalidation_util.h" 17 #include "components/invalidation/public/invalidation_util.h"
19 #include "google/cacheinvalidation/include/invalidation-client.h" 18 #include "google/cacheinvalidation/include/invalidation-client.h"
20 #include "google/cacheinvalidation/include/types.h" 19 #include "google/cacheinvalidation/include/types.h"
21 20
22 namespace syncer { 21 namespace syncer {
23 22
24 RegistrationManager::PendingRegistrationInfo::PendingRegistrationInfo() {} 23 RegistrationManager::PendingRegistrationInfo::PendingRegistrationInfo() {}
25 24
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 const int RegistrationManager::kMaxRegistrationDelaySeconds = 60 * 60; 58 const int RegistrationManager::kMaxRegistrationDelaySeconds = 60 * 60;
60 59
61 RegistrationManager::RegistrationManager( 60 RegistrationManager::RegistrationManager(
62 invalidation::InvalidationClient* invalidation_client) 61 invalidation::InvalidationClient* invalidation_client)
63 : invalidation_client_(invalidation_client) { 62 : invalidation_client_(invalidation_client) {
64 DCHECK(invalidation_client_); 63 DCHECK(invalidation_client_);
65 } 64 }
66 65
67 RegistrationManager::~RegistrationManager() { 66 RegistrationManager::~RegistrationManager() {
68 DCHECK(CalledOnValidThread()); 67 DCHECK(CalledOnValidThread());
68 base::STLDeleteValues(&registration_statuses_);
69 } 69 }
70 70
71 ObjectIdSet RegistrationManager::UpdateRegisteredIds(const ObjectIdSet& ids) { 71 ObjectIdSet RegistrationManager::UpdateRegisteredIds(const ObjectIdSet& ids) {
72 DCHECK(CalledOnValidThread()); 72 DCHECK(CalledOnValidThread());
73 73
74 const ObjectIdSet& old_ids = GetRegisteredIds(); 74 const ObjectIdSet& old_ids = GetRegisteredIds();
75 const ObjectIdSet& to_register = ids; 75 const ObjectIdSet& to_register = ids;
76 ObjectIdSet to_unregister; 76 ObjectIdSet to_unregister;
77 std::set_difference(old_ids.begin(), old_ids.end(), 77 std::set_difference(old_ids.begin(), old_ids.end(),
78 ids.begin(), ids.end(), 78 ids.begin(), ids.end(),
79 std::inserter(to_unregister, to_unregister.begin()), 79 std::inserter(to_unregister, to_unregister.begin()),
80 ObjectIdLessThan()); 80 ObjectIdLessThan());
81 81
82 for (ObjectIdSet::const_iterator it = to_unregister.begin(); 82 for (ObjectIdSet::const_iterator it = to_unregister.begin();
83 it != to_unregister.end(); ++it) { 83 it != to_unregister.end(); ++it) {
84 UnregisterId(*it); 84 UnregisterId(*it);
85 } 85 }
86 86
87 for (ObjectIdSet::const_iterator it = to_register.begin(); 87 for (ObjectIdSet::const_iterator it = to_register.begin();
88 it != to_register.end(); ++it) { 88 it != to_register.end(); ++it) {
89 if (!base::ContainsKey(registration_statuses_, *it)) { 89 if (!base::ContainsKey(registration_statuses_, *it)) {
90 registration_statuses_[*it] = 90 registration_statuses_.insert(
91 base::MakeUnique<RegistrationStatus>(*it, this); 91 std::make_pair(*it, new RegistrationStatus(*it, this)));
92 } 92 }
93 if (!IsIdRegistered(*it)) { 93 if (!IsIdRegistered(*it)) {
94 TryRegisterId(*it, false /* is-retry */); 94 TryRegisterId(*it, false /* is-retry */);
95 } 95 }
96 } 96 }
97 97
98 return to_unregister; 98 return to_unregister;
99 } 99 }
100 100
101 void RegistrationManager::MarkRegistrationLost( 101 void RegistrationManager::MarkRegistrationLost(
102 const invalidation::ObjectId& id) { 102 const invalidation::ObjectId& id) {
103 DCHECK(CalledOnValidThread()); 103 DCHECK(CalledOnValidThread());
104 auto it = registration_statuses_.find(id); 104 RegistrationStatusMap::const_iterator it = registration_statuses_.find(id);
105 if (it == registration_statuses_.end()) { 105 if (it == registration_statuses_.end()) {
106 DVLOG(1) << "Attempt to mark non-existent registration for " 106 DVLOG(1) << "Attempt to mark non-existent registration for "
107 << ObjectIdToString(id) << " as lost"; 107 << ObjectIdToString(id) << " as lost";
108 return; 108 return;
109 } 109 }
110 if (!it->second->enabled) { 110 if (!it->second->enabled) {
111 return; 111 return;
112 } 112 }
113 it->second->state = invalidation::InvalidationListener::UNREGISTERED; 113 it->second->state = invalidation::InvalidationListener::UNREGISTERED;
114 bool is_retry = !it->second->last_registration_request.is_null(); 114 bool is_retry = !it->second->last_registration_request.is_null();
115 TryRegisterId(id, is_retry); 115 TryRegisterId(id, is_retry);
116 } 116 }
117 117
118 void RegistrationManager::MarkAllRegistrationsLost() { 118 void RegistrationManager::MarkAllRegistrationsLost() {
119 DCHECK(CalledOnValidThread()); 119 DCHECK(CalledOnValidThread());
120 for (auto it = registration_statuses_.begin(); 120 for (RegistrationStatusMap::const_iterator it =
121 registration_statuses_.begin();
121 it != registration_statuses_.end(); ++it) { 122 it != registration_statuses_.end(); ++it) {
122 if (IsIdRegistered(it->first)) { 123 if (IsIdRegistered(it->first)) {
123 MarkRegistrationLost(it->first); 124 MarkRegistrationLost(it->first);
124 } 125 }
125 } 126 }
126 } 127 }
127 128
128 void RegistrationManager::DisableId(const invalidation::ObjectId& id) { 129 void RegistrationManager::DisableId(const invalidation::ObjectId& id) {
129 DCHECK(CalledOnValidThread()); 130 DCHECK(CalledOnValidThread());
130 auto it = registration_statuses_.find(id); 131 RegistrationStatusMap::const_iterator it = registration_statuses_.find(id);
131 if (it == registration_statuses_.end()) { 132 if (it == registration_statuses_.end()) {
132 DVLOG(1) << "Attempt to disable non-existent registration for " 133 DVLOG(1) << "Attempt to disable non-existent registration for "
133 << ObjectIdToString(id); 134 << ObjectIdToString(id);
134 return; 135 return;
135 } 136 }
136 it->second->Disable(); 137 it->second->Disable();
137 } 138 }
138 139
139 // static 140 // static
140 double RegistrationManager::CalculateBackoff( 141 double RegistrationManager::CalculateBackoff(
(...skipping 15 matching lines...) Expand all
156 } 157 }
157 158
158 ObjectIdSet RegistrationManager::GetRegisteredIdsForTest() const { 159 ObjectIdSet RegistrationManager::GetRegisteredIdsForTest() const {
159 return GetRegisteredIds(); 160 return GetRegisteredIds();
160 } 161 }
161 162
162 RegistrationManager::PendingRegistrationMap 163 RegistrationManager::PendingRegistrationMap
163 RegistrationManager::GetPendingRegistrationsForTest() const { 164 RegistrationManager::GetPendingRegistrationsForTest() const {
164 DCHECK(CalledOnValidThread()); 165 DCHECK(CalledOnValidThread());
165 PendingRegistrationMap pending_registrations; 166 PendingRegistrationMap pending_registrations;
166 for (const auto& status_pair : registration_statuses_) { 167 for (RegistrationStatusMap::const_iterator it =
167 const invalidation::ObjectId& id = status_pair.first; 168 registration_statuses_.begin();
168 RegistrationStatus* status = status_pair.second.get(); 169 it != registration_statuses_.end(); ++it) {
170 const invalidation::ObjectId& id = it->first;
171 RegistrationStatus* status = it->second;
169 if (status->registration_timer.IsRunning()) { 172 if (status->registration_timer.IsRunning()) {
170 pending_registrations[id].last_registration_request = 173 pending_registrations[id].last_registration_request =
171 status->last_registration_request; 174 status->last_registration_request;
172 pending_registrations[id].registration_attempt = 175 pending_registrations[id].registration_attempt =
173 status->last_registration_attempt; 176 status->last_registration_attempt;
174 pending_registrations[id].delay = status->delay; 177 pending_registrations[id].delay = status->delay;
175 pending_registrations[id].actual_delay = 178 pending_registrations[id].actual_delay =
176 status->registration_timer.GetCurrentDelay(); 179 status->registration_timer.GetCurrentDelay();
177 } 180 }
178 } 181 }
179 return pending_registrations; 182 return pending_registrations;
180 } 183 }
181 184
182 void RegistrationManager::FirePendingRegistrationsForTest() { 185 void RegistrationManager::FirePendingRegistrationsForTest() {
183 DCHECK(CalledOnValidThread()); 186 DCHECK(CalledOnValidThread());
184 for (const auto& status_pair : registration_statuses_) { 187 for (RegistrationStatusMap::const_iterator it =
185 if (status_pair.second->registration_timer.IsRunning()) { 188 registration_statuses_.begin();
186 status_pair.second->DoRegister(); 189 it != registration_statuses_.end(); ++it) {
190 if (it->second->registration_timer.IsRunning()) {
191 it->second->DoRegister();
187 } 192 }
188 } 193 }
189 } 194 }
190 195
191 double RegistrationManager::GetJitter() { 196 double RegistrationManager::GetJitter() {
192 // |jitter| lies in [-1.0, 1.0), which is low-biased, but only 197 // |jitter| lies in [-1.0, 1.0), which is low-biased, but only
193 // barely. 198 // barely.
194 // 199 //
195 // TODO(akalin): Fix the bias. 200 // TODO(akalin): Fix the bias.
196 return 2.0 * base::RandDouble() - 1.0; 201 return 2.0 * base::RandDouble() - 1.0;
197 } 202 }
198 203
199 void RegistrationManager::TryRegisterId(const invalidation::ObjectId& id, 204 void RegistrationManager::TryRegisterId(const invalidation::ObjectId& id,
200 bool is_retry) { 205 bool is_retry) {
201 DCHECK(CalledOnValidThread()); 206 DCHECK(CalledOnValidThread());
202 auto it = registration_statuses_.find(id); 207 RegistrationStatusMap::const_iterator it = registration_statuses_.find(id);
203 if (it == registration_statuses_.end()) { 208 if (it == registration_statuses_.end()) {
204 NOTREACHED() << "TryRegisterId called on " << ObjectIdToString(id) 209 NOTREACHED() << "TryRegisterId called on " << ObjectIdToString(id)
205 << " which is not in the registration map"; 210 << " which is not in the registration map";
206 return; 211 return;
207 } 212 }
208 RegistrationStatus* status = it->second.get(); 213 RegistrationStatus* status = it->second;
209 if (!status->enabled) { 214 if (!status->enabled) {
210 // Disabled, so do nothing. 215 // Disabled, so do nothing.
211 return; 216 return;
212 } 217 }
213 status->last_registration_attempt = base::Time::Now(); 218 status->last_registration_attempt = base::Time::Now();
214 if (is_retry) { 219 if (is_retry) {
215 // If we're a retry, we must have tried at least once before. 220 // If we're a retry, we must have tried at least once before.
216 DCHECK(!status->last_registration_request.is_null()); 221 DCHECK(!status->last_registration_request.is_null());
217 // delay = max(0, (now - last request) + next_delay) 222 // delay = max(0, (now - last request) + next_delay)
218 status->delay = 223 status->delay =
(...skipping 27 matching lines...) Expand all
246 << ObjectIdToString(id) << " immediately"; 251 << ObjectIdToString(id) << " immediately";
247 status->delay = base::TimeDelta(); 252 status->delay = base::TimeDelta();
248 status->next_delay = base::TimeDelta(); 253 status->next_delay = base::TimeDelta();
249 status->DoRegister(); 254 status->DoRegister();
250 } 255 }
251 } 256 }
252 257
253 void RegistrationManager::DoRegisterId(const invalidation::ObjectId& id) { 258 void RegistrationManager::DoRegisterId(const invalidation::ObjectId& id) {
254 DCHECK(CalledOnValidThread()); 259 DCHECK(CalledOnValidThread());
255 invalidation_client_->Register(id); 260 invalidation_client_->Register(id);
256 auto it = registration_statuses_.find(id); 261 RegistrationStatusMap::const_iterator it = registration_statuses_.find(id);
257 if (it == registration_statuses_.end()) { 262 if (it == registration_statuses_.end()) {
258 NOTREACHED() << "DoRegisterId called on " << ObjectIdToString(id) 263 NOTREACHED() << "DoRegisterId called on " << ObjectIdToString(id)
259 << " which is not in the registration map"; 264 << " which is not in the registration map";
260 return; 265 return;
261 } 266 }
262 it->second->state = invalidation::InvalidationListener::REGISTERED; 267 it->second->state = invalidation::InvalidationListener::REGISTERED;
263 it->second->last_registration_request = base::Time::Now(); 268 it->second->last_registration_request = base::Time::Now();
264 } 269 }
265 270
266 void RegistrationManager::UnregisterId(const invalidation::ObjectId& id) { 271 void RegistrationManager::UnregisterId(const invalidation::ObjectId& id) {
267 DCHECK(CalledOnValidThread()); 272 DCHECK(CalledOnValidThread());
268 invalidation_client_->Unregister(id); 273 invalidation_client_->Unregister(id);
269 auto it = registration_statuses_.find(id); 274 RegistrationStatusMap::iterator it = registration_statuses_.find(id);
270 if (it == registration_statuses_.end()) { 275 if (it == registration_statuses_.end()) {
271 NOTREACHED() << "UnregisterId called on " << ObjectIdToString(id) 276 NOTREACHED() << "UnregisterId called on " << ObjectIdToString(id)
272 << " which is not in the registration map"; 277 << " which is not in the registration map";
273 return; 278 return;
274 } 279 }
280 delete it->second;
275 registration_statuses_.erase(it); 281 registration_statuses_.erase(it);
276 } 282 }
277 283
278 284
279 ObjectIdSet RegistrationManager::GetRegisteredIds() const { 285 ObjectIdSet RegistrationManager::GetRegisteredIds() const {
280 DCHECK(CalledOnValidThread()); 286 DCHECK(CalledOnValidThread());
281 ObjectIdSet ids; 287 ObjectIdSet ids;
282 for (const auto& status_pair : registration_statuses_) { 288 for (RegistrationStatusMap::const_iterator it =
283 if (IsIdRegistered(status_pair.first)) { 289 registration_statuses_.begin();
284 ids.insert(status_pair.first); 290 it != registration_statuses_.end(); ++it) {
291 if (IsIdRegistered(it->first)) {
292 ids.insert(it->first);
285 } 293 }
286 } 294 }
287 return ids; 295 return ids;
288 } 296 }
289 297
290 bool RegistrationManager::IsIdRegistered( 298 bool RegistrationManager::IsIdRegistered(
291 const invalidation::ObjectId& id) const { 299 const invalidation::ObjectId& id) const {
292 DCHECK(CalledOnValidThread()); 300 DCHECK(CalledOnValidThread());
293 auto it = registration_statuses_.find(id); 301 RegistrationStatusMap::const_iterator it =
302 registration_statuses_.find(id);
294 return it != registration_statuses_.end() && 303 return it != registration_statuses_.end() &&
295 it->second->state == invalidation::InvalidationListener::REGISTERED; 304 it->second->state == invalidation::InvalidationListener::REGISTERED;
296 } 305 }
297 306
298 } // namespace syncer 307 } // namespace syncer
OLDNEW
« no previous file with comments | « components/invalidation/impl/registration_manager.h ('k') | components/invalidation/impl/sync_system_resources.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698