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

Side by Side Diff: sync/notifier/non_blocking_invalidator.cc

Issue 23754021: Invalidation trickles mega-patch (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "sync/notifier/non_blocking_invalidator.h" 5 #include "sync/notifier/non_blocking_invalidator.h"
6 6
7 #include <cstddef> 7 #include <cstddef>
8 8
9 #include "base/location.h" 9 #include "base/location.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/memory/scoped_ptr.h" 11 #include "base/memory/scoped_ptr.h"
12 #include "base/single_thread_task_runner.h" 12 #include "base/single_thread_task_runner.h"
13 #include "base/thread_task_runner_handle.h" 13 #include "base/thread_task_runner_handle.h"
14 #include "base/threading/thread.h" 14 #include "base/threading/thread.h"
15 #include "jingle/notifier/listener/push_client.h" 15 #include "jingle/notifier/listener/push_client.h"
16 #include "sync/notifier/invalidation_notifier.h" 16 #include "sync/notifier/invalidation_notifier.h"
17 #include "sync/notifier/object_id_invalidation_map.h"
17 18
18 namespace syncer { 19 namespace syncer {
19 20
20 class NonBlockingInvalidator::Core 21 class NonBlockingInvalidator::Core
21 : public base::RefCountedThreadSafe<NonBlockingInvalidator::Core>, 22 : public base::RefCountedThreadSafe<NonBlockingInvalidator::Core>,
22 // InvalidationHandler to observe the InvalidationNotifier we create. 23 // InvalidationHandler to observe the InvalidationNotifier we create.
23 public InvalidationHandler { 24 public InvalidationHandler {
24 public: 25 public:
25 // Called on parent thread. |delegate_observer| should be 26 // Called on parent thread. |delegate_observer| should be
26 // initialized. 27 // initialized.
27 explicit Core( 28 explicit Core(
28 const WeakHandle<InvalidationHandler>& delegate_observer); 29 const WeakHandle<InvalidationHandler>& delegate_observer);
29 30
30 // Helpers called on I/O thread. 31 // Helpers called on I/O thread.
31 void Initialize( 32 void Initialize(
32 const notifier::NotifierOptions& notifier_options, 33 const notifier::NotifierOptions& notifier_options,
33 const std::string& invalidator_client_id, 34 const std::string& invalidator_client_id,
34 const InvalidationStateMap& initial_invalidation_state_map, 35 const UnackedInvalidationStorageMap& saved_invalidations,
35 const std::string& invalidation_bootstrap_data, 36 const std::string& invalidation_bootstrap_data,
36 const WeakHandle<InvalidationStateTracker>& invalidation_state_tracker, 37 const WeakHandle<InvalidationStateTracker>& invalidation_state_tracker,
37 const std::string& client_info); 38 const std::string& client_info);
38 void Teardown(); 39 void Teardown();
39 void UpdateRegisteredIds(const ObjectIdSet& ids); 40 void UpdateRegisteredIds(const ObjectIdSet& ids);
40 void Acknowledge(const invalidation::ObjectId& id,
41 const AckHandle& ack_handle);
42 void UpdateCredentials(const std::string& email, const std::string& token); 41 void UpdateCredentials(const std::string& email, const std::string& token);
43 42
44 // InvalidationHandler implementation (all called on I/O thread by 43 // InvalidationHandler implementation (all called on I/O thread by
45 // InvalidationNotifier). 44 // InvalidationNotifier).
46 virtual void OnInvalidatorStateChange(InvalidatorState reason) OVERRIDE; 45 virtual void OnInvalidatorStateChange(InvalidatorState reason) OVERRIDE;
47 virtual void OnIncomingInvalidation( 46 virtual void OnIncomingInvalidation(
48 const ObjectIdInvalidationMap& invalidation_map) OVERRIDE; 47 const ObjectIdInvalidationMap& invalidation_map) OVERRIDE;
49 48
50 private: 49 private:
51 friend class 50 friend class
(...skipping 14 matching lines...) Expand all
66 : delegate_observer_(delegate_observer) { 65 : delegate_observer_(delegate_observer) {
67 DCHECK(delegate_observer_.IsInitialized()); 66 DCHECK(delegate_observer_.IsInitialized());
68 } 67 }
69 68
70 NonBlockingInvalidator::Core::~Core() { 69 NonBlockingInvalidator::Core::~Core() {
71 } 70 }
72 71
73 void NonBlockingInvalidator::Core::Initialize( 72 void NonBlockingInvalidator::Core::Initialize(
74 const notifier::NotifierOptions& notifier_options, 73 const notifier::NotifierOptions& notifier_options,
75 const std::string& invalidator_client_id, 74 const std::string& invalidator_client_id,
76 const InvalidationStateMap& initial_invalidation_state_map, 75 const UnackedInvalidationStorageMap& saved_invalidations,
77 const std::string& invalidation_bootstrap_data, 76 const std::string& invalidation_bootstrap_data,
78 const WeakHandle<InvalidationStateTracker>& invalidation_state_tracker, 77 const WeakHandle<InvalidationStateTracker>& invalidation_state_tracker,
79 const std::string& client_info) { 78 const std::string& client_info) {
80 DCHECK(notifier_options.request_context_getter.get()); 79 DCHECK(notifier_options.request_context_getter.get());
81 DCHECK_EQ(notifier::NOTIFICATION_SERVER, 80 DCHECK_EQ(notifier::NOTIFICATION_SERVER,
82 notifier_options.notification_method); 81 notifier_options.notification_method);
83 network_task_runner_ = notifier_options.request_context_getter-> 82 network_task_runner_ = notifier_options.request_context_getter->
84 GetNetworkTaskRunner(); 83 GetNetworkTaskRunner();
85 DCHECK(network_task_runner_->BelongsToCurrentThread()); 84 DCHECK(network_task_runner_->BelongsToCurrentThread());
86 invalidation_notifier_.reset( 85 invalidation_notifier_.reset(
87 new InvalidationNotifier( 86 new InvalidationNotifier(
88 notifier::PushClient::CreateDefaultOnIOThread(notifier_options), 87 notifier::PushClient::CreateDefaultOnIOThread(notifier_options),
89 invalidator_client_id, 88 invalidator_client_id,
90 initial_invalidation_state_map, 89 saved_invalidations,
91 invalidation_bootstrap_data, 90 invalidation_bootstrap_data,
92 invalidation_state_tracker, 91 invalidation_state_tracker,
93 client_info)); 92 client_info));
94 invalidation_notifier_->RegisterHandler(this); 93 invalidation_notifier_->RegisterHandler(this);
95 } 94 }
96 95
97 void NonBlockingInvalidator::Core::Teardown() { 96 void NonBlockingInvalidator::Core::Teardown() {
98 DCHECK(network_task_runner_->BelongsToCurrentThread()); 97 DCHECK(network_task_runner_->BelongsToCurrentThread());
99 invalidation_notifier_->UnregisterHandler(this); 98 invalidation_notifier_->UnregisterHandler(this);
100 invalidation_notifier_.reset(); 99 invalidation_notifier_.reset();
101 network_task_runner_ = NULL; 100 network_task_runner_ = NULL;
102 } 101 }
103 102
104 void NonBlockingInvalidator::Core::UpdateRegisteredIds(const ObjectIdSet& ids) { 103 void NonBlockingInvalidator::Core::UpdateRegisteredIds(const ObjectIdSet& ids) {
105 DCHECK(network_task_runner_->BelongsToCurrentThread()); 104 DCHECK(network_task_runner_->BelongsToCurrentThread());
106 invalidation_notifier_->UpdateRegisteredIds(this, ids); 105 invalidation_notifier_->UpdateRegisteredIds(this, ids);
107 } 106 }
108 107
109 void NonBlockingInvalidator::Core::Acknowledge(const invalidation::ObjectId& id,
110 const AckHandle& ack_handle) {
111 DCHECK(network_task_runner_->BelongsToCurrentThread());
112 invalidation_notifier_->Acknowledge(id, ack_handle);
113 }
114
115 void NonBlockingInvalidator::Core::UpdateCredentials(const std::string& email, 108 void NonBlockingInvalidator::Core::UpdateCredentials(const std::string& email,
116 const std::string& token) { 109 const std::string& token) {
117 DCHECK(network_task_runner_->BelongsToCurrentThread()); 110 DCHECK(network_task_runner_->BelongsToCurrentThread());
118 invalidation_notifier_->UpdateCredentials(email, token); 111 invalidation_notifier_->UpdateCredentials(email, token);
119 } 112 }
120 113
121 void NonBlockingInvalidator::Core::OnInvalidatorStateChange( 114 void NonBlockingInvalidator::Core::OnInvalidatorStateChange(
122 InvalidatorState reason) { 115 InvalidatorState reason) {
123 DCHECK(network_task_runner_->BelongsToCurrentThread()); 116 DCHECK(network_task_runner_->BelongsToCurrentThread());
124 delegate_observer_.Call( 117 delegate_observer_.Call(
125 FROM_HERE, &InvalidationHandler::OnInvalidatorStateChange, reason); 118 FROM_HERE, &InvalidationHandler::OnInvalidatorStateChange, reason);
126 } 119 }
127 120
128 void NonBlockingInvalidator::Core::OnIncomingInvalidation( 121 void NonBlockingInvalidator::Core::OnIncomingInvalidation(
129 const ObjectIdInvalidationMap& invalidation_map) { 122 const ObjectIdInvalidationMap& invalidation_map) {
130 DCHECK(network_task_runner_->BelongsToCurrentThread()); 123 DCHECK(network_task_runner_->BelongsToCurrentThread());
131 delegate_observer_.Call(FROM_HERE, 124 delegate_observer_.Call(FROM_HERE,
132 &InvalidationHandler::OnIncomingInvalidation, 125 &InvalidationHandler::OnIncomingInvalidation,
133 invalidation_map); 126 invalidation_map);
134 } 127 }
135 128
136 NonBlockingInvalidator::NonBlockingInvalidator( 129 NonBlockingInvalidator::NonBlockingInvalidator(
137 const notifier::NotifierOptions& notifier_options, 130 const notifier::NotifierOptions& notifier_options,
138 const std::string& invalidator_client_id, 131 const std::string& invalidator_client_id,
139 const InvalidationStateMap& initial_invalidation_state_map, 132 const UnackedInvalidationStorageMap& saved_invalidations,
140 const std::string& invalidation_bootstrap_data, 133 const std::string& invalidation_bootstrap_data,
141 const WeakHandle<InvalidationStateTracker>& 134 const WeakHandle<InvalidationStateTracker>&
142 invalidation_state_tracker, 135 invalidation_state_tracker,
143 const std::string& client_info) 136 const std::string& client_info)
144 : weak_ptr_factory_(this), 137 : weak_ptr_factory_(this),
145 core_( 138 core_(
146 new Core(MakeWeakHandle(weak_ptr_factory_.GetWeakPtr()))), 139 new Core(MakeWeakHandle(weak_ptr_factory_.GetWeakPtr()))),
147 parent_task_runner_( 140 parent_task_runner_(
148 base::ThreadTaskRunnerHandle::Get()), 141 base::ThreadTaskRunnerHandle::Get()),
149 network_task_runner_(notifier_options.request_context_getter-> 142 network_task_runner_(notifier_options.request_context_getter->
150 GetNetworkTaskRunner()) { 143 GetNetworkTaskRunner()) {
151 if (!network_task_runner_->PostTask( 144 if (!network_task_runner_->PostTask(
152 FROM_HERE, 145 FROM_HERE,
153 base::Bind( 146 base::Bind(
154 &NonBlockingInvalidator::Core::Initialize, 147 &NonBlockingInvalidator::Core::Initialize,
155 core_.get(), 148 core_.get(),
156 notifier_options, 149 notifier_options,
157 invalidator_client_id, 150 invalidator_client_id,
158 initial_invalidation_state_map, 151 saved_invalidations,
159 invalidation_bootstrap_data, 152 invalidation_bootstrap_data,
160 invalidation_state_tracker, 153 invalidation_state_tracker,
161 client_info))) { 154 client_info))) {
162 NOTREACHED(); 155 NOTREACHED();
163 } 156 }
164 } 157 }
165 158
166 NonBlockingInvalidator::~NonBlockingInvalidator() { 159 NonBlockingInvalidator::~NonBlockingInvalidator() {
167 DCHECK(parent_task_runner_->BelongsToCurrentThread()); 160 DCHECK(parent_task_runner_->BelongsToCurrentThread());
168 if (!network_task_runner_->PostTask( 161 if (!network_task_runner_->PostTask(
(...skipping 21 matching lines...) Expand all
190 registrar_.GetAllRegisteredIds()))) { 183 registrar_.GetAllRegisteredIds()))) {
191 NOTREACHED(); 184 NOTREACHED();
192 } 185 }
193 } 186 }
194 187
195 void NonBlockingInvalidator::UnregisterHandler(InvalidationHandler* handler) { 188 void NonBlockingInvalidator::UnregisterHandler(InvalidationHandler* handler) {
196 DCHECK(parent_task_runner_->BelongsToCurrentThread()); 189 DCHECK(parent_task_runner_->BelongsToCurrentThread());
197 registrar_.UnregisterHandler(handler); 190 registrar_.UnregisterHandler(handler);
198 } 191 }
199 192
200 void NonBlockingInvalidator::Acknowledge(const invalidation::ObjectId& id,
201 const AckHandle& ack_handle) {
202 DCHECK(parent_task_runner_->BelongsToCurrentThread());
203 if (!network_task_runner_->PostTask(
204 FROM_HERE,
205 base::Bind(
206 &NonBlockingInvalidator::Core::Acknowledge,
207 core_.get(),
208 id,
209 ack_handle))) {
210 NOTREACHED();
211 }
212 }
213
214 InvalidatorState NonBlockingInvalidator::GetInvalidatorState() const { 193 InvalidatorState NonBlockingInvalidator::GetInvalidatorState() const {
215 DCHECK(parent_task_runner_->BelongsToCurrentThread()); 194 DCHECK(parent_task_runner_->BelongsToCurrentThread());
216 return registrar_.GetInvalidatorState(); 195 return registrar_.GetInvalidatorState();
217 } 196 }
218 197
219 void NonBlockingInvalidator::UpdateCredentials(const std::string& email, 198 void NonBlockingInvalidator::UpdateCredentials(const std::string& email,
220 const std::string& token) { 199 const std::string& token) {
221 DCHECK(parent_task_runner_->BelongsToCurrentThread()); 200 DCHECK(parent_task_runner_->BelongsToCurrentThread());
222 if (!network_task_runner_->PostTask( 201 if (!network_task_runner_->PostTask(
223 FROM_HERE, 202 FROM_HERE,
224 base::Bind(&NonBlockingInvalidator::Core::UpdateCredentials, 203 base::Bind(&NonBlockingInvalidator::Core::UpdateCredentials,
225 core_.get(), email, token))) { 204 core_.get(), email, token))) {
226 NOTREACHED(); 205 NOTREACHED();
227 } 206 }
228 } 207 }
229 208
230 void NonBlockingInvalidator::OnInvalidatorStateChange(InvalidatorState state) { 209 void NonBlockingInvalidator::OnInvalidatorStateChange(InvalidatorState state) {
231 DCHECK(parent_task_runner_->BelongsToCurrentThread()); 210 DCHECK(parent_task_runner_->BelongsToCurrentThread());
232 registrar_.UpdateInvalidatorState(state); 211 registrar_.UpdateInvalidatorState(state);
233 } 212 }
234 213
235 void NonBlockingInvalidator::OnIncomingInvalidation( 214 void NonBlockingInvalidator::OnIncomingInvalidation(
236 const ObjectIdInvalidationMap& invalidation_map) { 215 const ObjectIdInvalidationMap& invalidation_map) {
237 DCHECK(parent_task_runner_->BelongsToCurrentThread()); 216 DCHECK(parent_task_runner_->BelongsToCurrentThread());
238 registrar_.DispatchInvalidationsToHandlers(invalidation_map); 217 registrar_.DispatchInvalidationsToHandlers(invalidation_map);
239 } 218 }
240 219
241 } // namespace syncer 220 } // namespace syncer
OLDNEW
« no previous file with comments | « sync/notifier/non_blocking_invalidator.h ('k') | sync/notifier/non_blocking_invalidator_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698