Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 #include "sync/notifier/object_id_invalidation_map.h" |
| 18 #include "sync/notifier/sync_system_resources.h" | |
| 18 | 19 |
| 19 namespace syncer { | 20 namespace syncer { |
| 20 | 21 |
| 22 struct NonBlockingInvalidator::InitializeOptions { | |
|
pavely
2013/12/20 00:04:16
Number of parameters to NonBlockingInvalidator::Co
| |
| 23 InitializeOptions( | |
| 24 NetworkChannelCreator network_channel_creator, | |
| 25 const std::string& invalidator_client_id, | |
| 26 const UnackedInvalidationsMap& saved_invalidations, | |
| 27 const std::string& invalidation_bootstrap_data, | |
| 28 const WeakHandle<InvalidationStateTracker>& | |
| 29 invalidation_state_tracker, | |
| 30 const std::string& client_info, | |
| 31 scoped_refptr<net::URLRequestContextGetter> request_context_getter) | |
| 32 : network_channel_creator(network_channel_creator), | |
| 33 invalidator_client_id(invalidator_client_id), | |
| 34 saved_invalidations(saved_invalidations), | |
| 35 invalidation_bootstrap_data(invalidation_bootstrap_data), | |
| 36 invalidation_state_tracker(invalidation_state_tracker), | |
| 37 client_info(client_info), | |
| 38 request_context_getter(request_context_getter) { | |
| 39 } | |
| 40 | |
| 41 NetworkChannelCreator network_channel_creator; | |
| 42 std::string invalidator_client_id; | |
| 43 UnackedInvalidationsMap saved_invalidations; | |
| 44 std::string invalidation_bootstrap_data; | |
| 45 WeakHandle<InvalidationStateTracker> invalidation_state_tracker; | |
| 46 std::string client_info; | |
| 47 scoped_refptr<net::URLRequestContextGetter> request_context_getter; | |
| 48 }; | |
| 49 | |
| 50 | |
| 21 class NonBlockingInvalidator::Core | 51 class NonBlockingInvalidator::Core |
| 22 : public base::RefCountedThreadSafe<NonBlockingInvalidator::Core>, | 52 : public base::RefCountedThreadSafe<NonBlockingInvalidator::Core>, |
| 23 // InvalidationHandler to observe the InvalidationNotifier we create. | 53 // InvalidationHandler to observe the InvalidationNotifier we create. |
| 24 public InvalidationHandler { | 54 public InvalidationHandler { |
| 25 public: | 55 public: |
| 26 // Called on parent thread. |delegate_observer| should be | 56 // Called on parent thread. |delegate_observer| should be |
| 27 // initialized. | 57 // initialized. |
| 28 explicit Core( | 58 explicit Core( |
| 29 const WeakHandle<InvalidationHandler>& delegate_observer); | 59 const WeakHandle<InvalidationHandler>& delegate_observer); |
| 30 | 60 |
| 31 // Helpers called on I/O thread. | 61 // Helpers called on I/O thread. |
| 32 void Initialize( | 62 void Initialize( |
| 33 const notifier::NotifierOptions& notifier_options, | 63 const NonBlockingInvalidator::InitializeOptions& initialize_options); |
| 34 const std::string& invalidator_client_id, | |
| 35 const UnackedInvalidationsMap& saved_invalidations, | |
| 36 const std::string& invalidation_bootstrap_data, | |
| 37 const WeakHandle<InvalidationStateTracker>& invalidation_state_tracker, | |
| 38 const std::string& client_info); | |
| 39 void Teardown(); | 64 void Teardown(); |
| 40 void UpdateRegisteredIds(const ObjectIdSet& ids); | 65 void UpdateRegisteredIds(const ObjectIdSet& ids); |
| 41 void UpdateCredentials(const std::string& email, const std::string& token); | 66 void UpdateCredentials(const std::string& email, const std::string& token); |
| 42 | 67 |
| 43 // InvalidationHandler implementation (all called on I/O thread by | 68 // InvalidationHandler implementation (all called on I/O thread by |
| 44 // InvalidationNotifier). | 69 // InvalidationNotifier). |
| 45 virtual void OnInvalidatorStateChange(InvalidatorState reason) OVERRIDE; | 70 virtual void OnInvalidatorStateChange(InvalidatorState reason) OVERRIDE; |
| 46 virtual void OnIncomingInvalidation( | 71 virtual void OnIncomingInvalidation( |
| 47 const ObjectIdInvalidationMap& invalidation_map) OVERRIDE; | 72 const ObjectIdInvalidationMap& invalidation_map) OVERRIDE; |
| 48 | 73 |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 63 NonBlockingInvalidator::Core::Core( | 88 NonBlockingInvalidator::Core::Core( |
| 64 const WeakHandle<InvalidationHandler>& delegate_observer) | 89 const WeakHandle<InvalidationHandler>& delegate_observer) |
| 65 : delegate_observer_(delegate_observer) { | 90 : delegate_observer_(delegate_observer) { |
| 66 DCHECK(delegate_observer_.IsInitialized()); | 91 DCHECK(delegate_observer_.IsInitialized()); |
| 67 } | 92 } |
| 68 | 93 |
| 69 NonBlockingInvalidator::Core::~Core() { | 94 NonBlockingInvalidator::Core::~Core() { |
| 70 } | 95 } |
| 71 | 96 |
| 72 void NonBlockingInvalidator::Core::Initialize( | 97 void NonBlockingInvalidator::Core::Initialize( |
| 73 const notifier::NotifierOptions& notifier_options, | 98 const NonBlockingInvalidator::InitializeOptions& initialize_options) { |
| 74 const std::string& invalidator_client_id, | 99 DCHECK(initialize_options.request_context_getter.get()); |
| 75 const UnackedInvalidationsMap& saved_invalidations, | 100 network_task_runner_ = |
| 76 const std::string& invalidation_bootstrap_data, | 101 initialize_options.request_context_getter->GetNetworkTaskRunner(); |
| 77 const WeakHandle<InvalidationStateTracker>& invalidation_state_tracker, | |
| 78 const std::string& client_info) { | |
| 79 DCHECK(notifier_options.request_context_getter.get()); | |
| 80 DCHECK_EQ(notifier::NOTIFICATION_SERVER, | |
| 81 notifier_options.notification_method); | |
| 82 network_task_runner_ = notifier_options.request_context_getter-> | |
| 83 GetNetworkTaskRunner(); | |
| 84 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 102 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
| 103 scoped_ptr<SyncNetworkChannel> network_channel = | |
| 104 initialize_options.network_channel_creator.Run(); | |
| 85 invalidation_notifier_.reset( | 105 invalidation_notifier_.reset( |
| 86 new InvalidationNotifier( | 106 new InvalidationNotifier( |
| 87 notifier::PushClient::CreateDefaultOnIOThread(notifier_options), | 107 network_channel.Pass(), |
| 88 invalidator_client_id, | 108 initialize_options.invalidator_client_id, |
| 89 saved_invalidations, | 109 initialize_options.saved_invalidations, |
| 90 invalidation_bootstrap_data, | 110 initialize_options.invalidation_bootstrap_data, |
| 91 invalidation_state_tracker, | 111 initialize_options.invalidation_state_tracker, |
| 92 client_info)); | 112 initialize_options.client_info)); |
| 93 invalidation_notifier_->RegisterHandler(this); | 113 invalidation_notifier_->RegisterHandler(this); |
| 94 } | 114 } |
| 95 | 115 |
| 96 void NonBlockingInvalidator::Core::Teardown() { | 116 void NonBlockingInvalidator::Core::Teardown() { |
| 97 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 117 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
| 98 invalidation_notifier_->UnregisterHandler(this); | 118 invalidation_notifier_->UnregisterHandler(this); |
| 99 invalidation_notifier_.reset(); | 119 invalidation_notifier_.reset(); |
| 100 network_task_runner_ = NULL; | 120 network_task_runner_ = NULL; |
| 101 } | 121 } |
| 102 | 122 |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 120 | 140 |
| 121 void NonBlockingInvalidator::Core::OnIncomingInvalidation( | 141 void NonBlockingInvalidator::Core::OnIncomingInvalidation( |
| 122 const ObjectIdInvalidationMap& invalidation_map) { | 142 const ObjectIdInvalidationMap& invalidation_map) { |
| 123 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 143 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
| 124 delegate_observer_.Call(FROM_HERE, | 144 delegate_observer_.Call(FROM_HERE, |
| 125 &InvalidationHandler::OnIncomingInvalidation, | 145 &InvalidationHandler::OnIncomingInvalidation, |
| 126 invalidation_map); | 146 invalidation_map); |
| 127 } | 147 } |
| 128 | 148 |
| 129 NonBlockingInvalidator::NonBlockingInvalidator( | 149 NonBlockingInvalidator::NonBlockingInvalidator( |
| 130 const notifier::NotifierOptions& notifier_options, | 150 NetworkChannelCreator network_channel_creator, |
| 131 const std::string& invalidator_client_id, | 151 const std::string& invalidator_client_id, |
| 132 const UnackedInvalidationsMap& saved_invalidations, | 152 const UnackedInvalidationsMap& saved_invalidations, |
| 133 const std::string& invalidation_bootstrap_data, | 153 const std::string& invalidation_bootstrap_data, |
| 134 const WeakHandle<InvalidationStateTracker>& | 154 const WeakHandle<InvalidationStateTracker>& |
| 135 invalidation_state_tracker, | 155 invalidation_state_tracker, |
| 136 const std::string& client_info) | 156 const std::string& client_info, |
| 157 const scoped_refptr<net::URLRequestContextGetter>& request_context_getter) | |
| 137 : parent_task_runner_(base::ThreadTaskRunnerHandle::Get()), | 158 : parent_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
| 138 network_task_runner_( | 159 network_task_runner_(request_context_getter->GetNetworkTaskRunner()), |
| 139 notifier_options.request_context_getter->GetNetworkTaskRunner()), | |
| 140 weak_ptr_factory_(this) { | 160 weak_ptr_factory_(this) { |
| 141 core_ = new Core(MakeWeakHandle(weak_ptr_factory_.GetWeakPtr())); | 161 core_ = new Core(MakeWeakHandle(weak_ptr_factory_.GetWeakPtr())); |
| 142 | 162 |
| 163 InitializeOptions initialize_options( | |
| 164 network_channel_creator, | |
| 165 invalidator_client_id, | |
| 166 saved_invalidations, | |
| 167 invalidation_bootstrap_data, | |
| 168 invalidation_state_tracker, | |
| 169 client_info, | |
| 170 request_context_getter); | |
| 171 | |
| 143 if (!network_task_runner_->PostTask( | 172 if (!network_task_runner_->PostTask( |
| 144 FROM_HERE, | 173 FROM_HERE, |
| 145 base::Bind( | 174 base::Bind( |
| 146 &NonBlockingInvalidator::Core::Initialize, | 175 &NonBlockingInvalidator::Core::Initialize, |
| 147 core_.get(), | 176 core_.get(), |
| 148 notifier_options, | 177 initialize_options))) { |
| 149 invalidator_client_id, | |
| 150 saved_invalidations, | |
| 151 invalidation_bootstrap_data, | |
| 152 invalidation_state_tracker, | |
| 153 client_info))) { | |
| 154 NOTREACHED(); | 178 NOTREACHED(); |
| 155 } | 179 } |
| 156 } | 180 } |
| 157 | 181 |
| 158 NonBlockingInvalidator::~NonBlockingInvalidator() { | 182 NonBlockingInvalidator::~NonBlockingInvalidator() { |
| 159 DCHECK(parent_task_runner_->BelongsToCurrentThread()); | 183 DCHECK(parent_task_runner_->BelongsToCurrentThread()); |
| 160 if (!network_task_runner_->PostTask( | 184 if (!network_task_runner_->PostTask( |
| 161 FROM_HERE, | 185 FROM_HERE, |
| 162 base::Bind(&NonBlockingInvalidator::Core::Teardown, | 186 base::Bind(&NonBlockingInvalidator::Core::Teardown, |
| 163 core_.get()))) { | 187 core_.get()))) { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 209 DCHECK(parent_task_runner_->BelongsToCurrentThread()); | 233 DCHECK(parent_task_runner_->BelongsToCurrentThread()); |
| 210 registrar_.UpdateInvalidatorState(state); | 234 registrar_.UpdateInvalidatorState(state); |
| 211 } | 235 } |
| 212 | 236 |
| 213 void NonBlockingInvalidator::OnIncomingInvalidation( | 237 void NonBlockingInvalidator::OnIncomingInvalidation( |
| 214 const ObjectIdInvalidationMap& invalidation_map) { | 238 const ObjectIdInvalidationMap& invalidation_map) { |
| 215 DCHECK(parent_task_runner_->BelongsToCurrentThread()); | 239 DCHECK(parent_task_runner_->BelongsToCurrentThread()); |
| 216 registrar_.DispatchInvalidationsToHandlers(invalidation_map); | 240 registrar_.DispatchInvalidationsToHandlers(invalidation_map); |
| 217 } | 241 } |
| 218 | 242 |
| 243 NetworkChannelCreator | |
| 244 NonBlockingInvalidator::MakePushClientChannelCreator( | |
| 245 const notifier::NotifierOptions& notifier_options) { | |
| 246 return base::Bind(SyncNetworkChannel::CreatePushClientChannel, | |
| 247 notifier_options); | |
| 248 } | |
| 249 | |
| 250 NetworkChannelCreator | |
| 251 NonBlockingInvalidator::MakeGCMNetworkChannelCreator() { | |
| 252 return base::Bind(SyncNetworkChannel::CreateGCMNetworkChannel); | |
| 253 } | |
| 254 | |
| 219 } // namespace syncer | 255 } // namespace syncer |
| OLD | NEW |