OLD | NEW |
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 "sync/sessions/model_type_registry.h" | 5 #include "sync/sessions/model_type_registry.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/observer_list.h" | 8 #include "base/observer_list.h" |
9 #include "base/thread_task_runner_handle.h" | 9 #include "base/thread_task_runner_handle.h" |
10 #include "sync/engine/directory_commit_contributor.h" | 10 #include "sync/engine/directory_commit_contributor.h" |
11 #include "sync/engine/directory_update_handler.h" | 11 #include "sync/engine/directory_update_handler.h" |
12 #include "sync/engine/model_type_sync_proxy.h" | 12 #include "sync/engine/model_type_sync_proxy.h" |
13 #include "sync/engine/model_type_sync_proxy_impl.h" | 13 #include "sync/engine/model_type_sync_proxy_impl.h" |
14 #include "sync/engine/model_type_sync_worker.h" | 14 #include "sync/engine/model_type_sync_worker.h" |
15 #include "sync/engine/model_type_sync_worker_impl.h" | 15 #include "sync/engine/model_type_sync_worker_impl.h" |
16 #include "sync/internal_api/public/non_blocking_sync_common.h" | 16 #include "sync/internal_api/public/non_blocking_sync_common.h" |
17 #include "sync/sessions/directory_type_debug_info_emitter.h" | 17 #include "sync/sessions/directory_type_debug_info_emitter.h" |
18 #include "sync/util/cryptographer.h" | 18 #include "sync/util/cryptographer.h" |
19 | 19 |
20 namespace syncer { | 20 namespace syncer { |
21 | 21 |
22 namespace { | 22 namespace { |
23 | 23 |
24 class ModelTypeSyncProxyWrapper : public ModelTypeSyncProxy { | 24 class ModelTypeSyncProxyWrapper : public syncer_v2::ModelTypeSyncProxy { |
25 public: | 25 public: |
26 ModelTypeSyncProxyWrapper( | 26 ModelTypeSyncProxyWrapper( |
27 const base::WeakPtr<ModelTypeSyncProxyImpl>& proxy, | 27 const base::WeakPtr<syncer_v2::ModelTypeSyncProxyImpl>& proxy, |
28 const scoped_refptr<base::SequencedTaskRunner>& processor_task_runner); | 28 const scoped_refptr<base::SequencedTaskRunner>& processor_task_runner); |
29 ~ModelTypeSyncProxyWrapper() override; | 29 ~ModelTypeSyncProxyWrapper() override; |
30 | 30 |
31 void OnCommitCompleted( | 31 void OnCommitCompleted( |
32 const syncer_v2::DataTypeState& type_state, | 32 const syncer_v2::DataTypeState& type_state, |
33 const syncer_v2::CommitResponseDataList& response_list) override; | 33 const syncer_v2::CommitResponseDataList& response_list) override; |
34 void OnUpdateReceived( | 34 void OnUpdateReceived( |
35 const syncer_v2::DataTypeState& type_state, | 35 const syncer_v2::DataTypeState& type_state, |
36 const syncer_v2::UpdateResponseDataList& response_list, | 36 const syncer_v2::UpdateResponseDataList& response_list, |
37 const syncer_v2::UpdateResponseDataList& pending_updates) override; | 37 const syncer_v2::UpdateResponseDataList& pending_updates) override; |
38 | 38 |
39 private: | 39 private: |
40 base::WeakPtr<ModelTypeSyncProxyImpl> processor_; | 40 base::WeakPtr<syncer_v2::ModelTypeSyncProxyImpl> processor_; |
41 scoped_refptr<base::SequencedTaskRunner> processor_task_runner_; | 41 scoped_refptr<base::SequencedTaskRunner> processor_task_runner_; |
42 }; | 42 }; |
43 | 43 |
44 ModelTypeSyncProxyWrapper::ModelTypeSyncProxyWrapper( | 44 ModelTypeSyncProxyWrapper::ModelTypeSyncProxyWrapper( |
45 const base::WeakPtr<ModelTypeSyncProxyImpl>& proxy, | 45 const base::WeakPtr<syncer_v2::ModelTypeSyncProxyImpl>& proxy, |
46 const scoped_refptr<base::SequencedTaskRunner>& processor_task_runner) | 46 const scoped_refptr<base::SequencedTaskRunner>& processor_task_runner) |
47 : processor_(proxy), processor_task_runner_(processor_task_runner) { | 47 : processor_(proxy), processor_task_runner_(processor_task_runner) {} |
48 } | |
49 | 48 |
50 ModelTypeSyncProxyWrapper::~ModelTypeSyncProxyWrapper() { | 49 ModelTypeSyncProxyWrapper::~ModelTypeSyncProxyWrapper() { |
51 } | 50 } |
52 | 51 |
53 void ModelTypeSyncProxyWrapper::OnCommitCompleted( | 52 void ModelTypeSyncProxyWrapper::OnCommitCompleted( |
54 const syncer_v2::DataTypeState& type_state, | 53 const syncer_v2::DataTypeState& type_state, |
55 const syncer_v2::CommitResponseDataList& response_list) { | 54 const syncer_v2::CommitResponseDataList& response_list) { |
56 processor_task_runner_->PostTask( | 55 processor_task_runner_->PostTask( |
57 FROM_HERE, | 56 FROM_HERE, |
58 base::Bind(&ModelTypeSyncProxyImpl::OnCommitCompleted, | 57 base::Bind(&syncer_v2::ModelTypeSyncProxyImpl::OnCommitCompleted, |
59 processor_, | 58 processor_, type_state, response_list)); |
60 type_state, | |
61 response_list)); | |
62 } | 59 } |
63 | 60 |
64 void ModelTypeSyncProxyWrapper::OnUpdateReceived( | 61 void ModelTypeSyncProxyWrapper::OnUpdateReceived( |
65 const syncer_v2::DataTypeState& type_state, | 62 const syncer_v2::DataTypeState& type_state, |
66 const syncer_v2::UpdateResponseDataList& response_list, | 63 const syncer_v2::UpdateResponseDataList& response_list, |
67 const syncer_v2::UpdateResponseDataList& pending_updates) { | 64 const syncer_v2::UpdateResponseDataList& pending_updates) { |
68 processor_task_runner_->PostTask( | 65 processor_task_runner_->PostTask( |
69 FROM_HERE, | 66 FROM_HERE, |
70 base::Bind(&ModelTypeSyncProxyImpl::OnUpdateReceived, | 67 base::Bind(&syncer_v2::ModelTypeSyncProxyImpl::OnUpdateReceived, |
71 processor_, | 68 processor_, type_state, response_list, pending_updates)); |
72 type_state, | |
73 response_list, | |
74 pending_updates)); | |
75 } | 69 } |
76 | 70 |
77 class ModelTypeSyncWorkerWrapper : public ModelTypeSyncWorker { | 71 class ModelTypeSyncWorkerWrapper : public syncer_v2::ModelTypeSyncWorker { |
78 public: | 72 public: |
79 ModelTypeSyncWorkerWrapper( | 73 ModelTypeSyncWorkerWrapper( |
80 const base::WeakPtr<ModelTypeSyncWorkerImpl>& worker, | 74 const base::WeakPtr<syncer_v2::ModelTypeSyncWorkerImpl>& worker, |
81 const scoped_refptr<base::SequencedTaskRunner>& sync_thread); | 75 const scoped_refptr<base::SequencedTaskRunner>& sync_thread); |
82 ~ModelTypeSyncWorkerWrapper() override; | 76 ~ModelTypeSyncWorkerWrapper() override; |
83 | 77 |
84 void EnqueueForCommit(const syncer_v2::CommitRequestDataList& list) override; | 78 void EnqueueForCommit(const syncer_v2::CommitRequestDataList& list) override; |
85 | 79 |
86 private: | 80 private: |
87 base::WeakPtr<ModelTypeSyncWorkerImpl> worker_; | 81 base::WeakPtr<syncer_v2::ModelTypeSyncWorkerImpl> worker_; |
88 scoped_refptr<base::SequencedTaskRunner> sync_thread_; | 82 scoped_refptr<base::SequencedTaskRunner> sync_thread_; |
89 }; | 83 }; |
90 | 84 |
91 ModelTypeSyncWorkerWrapper::ModelTypeSyncWorkerWrapper( | 85 ModelTypeSyncWorkerWrapper::ModelTypeSyncWorkerWrapper( |
92 const base::WeakPtr<ModelTypeSyncWorkerImpl>& worker, | 86 const base::WeakPtr<syncer_v2::ModelTypeSyncWorkerImpl>& worker, |
93 const scoped_refptr<base::SequencedTaskRunner>& sync_thread) | 87 const scoped_refptr<base::SequencedTaskRunner>& sync_thread) |
94 : worker_(worker), sync_thread_(sync_thread) { | 88 : worker_(worker), sync_thread_(sync_thread) {} |
95 } | |
96 | 89 |
97 ModelTypeSyncWorkerWrapper::~ModelTypeSyncWorkerWrapper() { | 90 ModelTypeSyncWorkerWrapper::~ModelTypeSyncWorkerWrapper() { |
98 } | 91 } |
99 | 92 |
100 void ModelTypeSyncWorkerWrapper::EnqueueForCommit( | 93 void ModelTypeSyncWorkerWrapper::EnqueueForCommit( |
101 const syncer_v2::CommitRequestDataList& list) { | 94 const syncer_v2::CommitRequestDataList& list) { |
102 sync_thread_->PostTask( | 95 sync_thread_->PostTask( |
103 FROM_HERE, | 96 FROM_HERE, |
104 base::Bind(&ModelTypeSyncWorkerImpl::EnqueueForCommit, worker_, list)); | 97 base::Bind(&syncer_v2::ModelTypeSyncWorkerImpl::EnqueueForCommit, worker_, |
| 98 list)); |
105 } | 99 } |
106 | 100 |
107 } // namespace | 101 } // namespace |
108 | 102 |
109 ModelTypeRegistry::ModelTypeRegistry( | 103 ModelTypeRegistry::ModelTypeRegistry( |
110 const std::vector<scoped_refptr<ModelSafeWorker> >& workers, | 104 const std::vector<scoped_refptr<ModelSafeWorker> >& workers, |
111 syncable::Directory* directory, | 105 syncable::Directory* directory, |
112 NudgeHandler* nudge_handler) | 106 NudgeHandler* nudge_handler) |
113 : directory_(directory), | 107 : directory_(directory), |
114 nudge_handler_(nudge_handler), | 108 nudge_handler_(nudge_handler), |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
185 enabled_directory_types_ = GetRoutingInfoTypes(routing_info); | 179 enabled_directory_types_ = GetRoutingInfoTypes(routing_info); |
186 DCHECK(Intersection(GetEnabledDirectoryTypes(), | 180 DCHECK(Intersection(GetEnabledDirectoryTypes(), |
187 GetEnabledNonBlockingTypes()).Empty()); | 181 GetEnabledNonBlockingTypes()).Empty()); |
188 } | 182 } |
189 | 183 |
190 void ModelTypeRegistry::ConnectSyncTypeToWorker( | 184 void ModelTypeRegistry::ConnectSyncTypeToWorker( |
191 ModelType type, | 185 ModelType type, |
192 const syncer_v2::DataTypeState& data_type_state, | 186 const syncer_v2::DataTypeState& data_type_state, |
193 const syncer_v2::UpdateResponseDataList& saved_pending_updates, | 187 const syncer_v2::UpdateResponseDataList& saved_pending_updates, |
194 const scoped_refptr<base::SequencedTaskRunner>& type_task_runner, | 188 const scoped_refptr<base::SequencedTaskRunner>& type_task_runner, |
195 const base::WeakPtr<ModelTypeSyncProxyImpl>& proxy_impl) { | 189 const base::WeakPtr<syncer_v2::ModelTypeSyncProxyImpl>& proxy_impl) { |
196 DVLOG(1) << "Enabling an off-thread sync type: " << ModelTypeToString(type); | 190 DVLOG(1) << "Enabling an off-thread sync type: " << ModelTypeToString(type); |
197 | 191 |
198 // Initialize Worker -> Proxy communication channel. | 192 // Initialize Worker -> Proxy communication channel. |
199 scoped_ptr<ModelTypeSyncProxy> proxy( | 193 scoped_ptr<syncer_v2::ModelTypeSyncProxy> proxy( |
200 new ModelTypeSyncProxyWrapper(proxy_impl, type_task_runner)); | 194 new ModelTypeSyncProxyWrapper(proxy_impl, type_task_runner)); |
201 scoped_ptr<Cryptographer> cryptographer_copy; | 195 scoped_ptr<Cryptographer> cryptographer_copy; |
202 if (encrypted_types_.Has(type)) | 196 if (encrypted_types_.Has(type)) |
203 cryptographer_copy.reset(new Cryptographer(*cryptographer_)); | 197 cryptographer_copy.reset(new Cryptographer(*cryptographer_)); |
204 | 198 |
205 scoped_ptr<ModelTypeSyncWorkerImpl> worker( | 199 scoped_ptr<syncer_v2::ModelTypeSyncWorkerImpl> worker( |
206 new ModelTypeSyncWorkerImpl(type, | 200 new syncer_v2::ModelTypeSyncWorkerImpl( |
207 data_type_state, | 201 type, data_type_state, saved_pending_updates, |
208 saved_pending_updates, | 202 cryptographer_copy.Pass(), nudge_handler_, proxy.Pass())); |
209 cryptographer_copy.Pass(), | |
210 nudge_handler_, | |
211 proxy.Pass())); | |
212 | 203 |
213 // Initialize Proxy -> Worker communication channel. | 204 // Initialize Proxy -> Worker communication channel. |
214 scoped_ptr<ModelTypeSyncWorker> wrapped_worker( | 205 scoped_ptr<syncer_v2::ModelTypeSyncWorker> wrapped_worker( |
215 new ModelTypeSyncWorkerWrapper(worker->AsWeakPtr(), | 206 new ModelTypeSyncWorkerWrapper(worker->AsWeakPtr(), |
216 scoped_refptr<base::SequencedTaskRunner>( | 207 scoped_refptr<base::SequencedTaskRunner>( |
217 base::ThreadTaskRunnerHandle::Get()))); | 208 base::ThreadTaskRunnerHandle::Get()))); |
218 type_task_runner->PostTask(FROM_HERE, | 209 type_task_runner->PostTask( |
219 base::Bind(&ModelTypeSyncProxyImpl::OnConnect, | 210 FROM_HERE, base::Bind(&syncer_v2::ModelTypeSyncProxyImpl::OnConnect, |
220 proxy_impl, | 211 proxy_impl, base::Passed(&wrapped_worker))); |
221 base::Passed(&wrapped_worker))); | |
222 | 212 |
223 DCHECK(update_handler_map_.find(type) == update_handler_map_.end()); | 213 DCHECK(update_handler_map_.find(type) == update_handler_map_.end()); |
224 DCHECK(commit_contributor_map_.find(type) == commit_contributor_map_.end()); | 214 DCHECK(commit_contributor_map_.find(type) == commit_contributor_map_.end()); |
225 | 215 |
226 update_handler_map_.insert(std::make_pair(type, worker.get())); | 216 update_handler_map_.insert(std::make_pair(type, worker.get())); |
227 commit_contributor_map_.insert(std::make_pair(type, worker.get())); | 217 commit_contributor_map_.insert(std::make_pair(type, worker.get())); |
228 | 218 |
229 // The container takes ownership. | 219 // The container takes ownership. |
230 model_type_sync_workers_.push_back(worker.Pass()); | 220 model_type_sync_workers_.push_back(worker.Pass()); |
231 | 221 |
232 DCHECK(Intersection(GetEnabledDirectoryTypes(), | 222 DCHECK(Intersection(GetEnabledDirectoryTypes(), |
233 GetEnabledNonBlockingTypes()).Empty()); | 223 GetEnabledNonBlockingTypes()).Empty()); |
234 } | 224 } |
235 | 225 |
236 void ModelTypeRegistry::DisconnectSyncWorker(ModelType type) { | 226 void ModelTypeRegistry::DisconnectSyncWorker(ModelType type) { |
237 DVLOG(1) << "Disabling an off-thread sync type: " << ModelTypeToString(type); | 227 DVLOG(1) << "Disabling an off-thread sync type: " << ModelTypeToString(type); |
238 DCHECK(update_handler_map_.find(type) != update_handler_map_.end()); | 228 DCHECK(update_handler_map_.find(type) != update_handler_map_.end()); |
239 DCHECK(commit_contributor_map_.find(type) != commit_contributor_map_.end()); | 229 DCHECK(commit_contributor_map_.find(type) != commit_contributor_map_.end()); |
240 | 230 |
241 size_t updaters_erased = update_handler_map_.erase(type); | 231 size_t updaters_erased = update_handler_map_.erase(type); |
242 size_t committers_erased = commit_contributor_map_.erase(type); | 232 size_t committers_erased = commit_contributor_map_.erase(type); |
243 | 233 |
244 DCHECK_EQ(1U, updaters_erased); | 234 DCHECK_EQ(1U, updaters_erased); |
245 DCHECK_EQ(1U, committers_erased); | 235 DCHECK_EQ(1U, committers_erased); |
246 | 236 |
247 // Remove from the ScopedVector, deleting the worker in the process. | 237 // Remove from the ScopedVector, deleting the worker in the process. |
248 for (ScopedVector<ModelTypeSyncWorkerImpl>::iterator it = | 238 for (ScopedVector<syncer_v2::ModelTypeSyncWorkerImpl>::iterator it = |
249 model_type_sync_workers_.begin(); | 239 model_type_sync_workers_.begin(); |
250 it != model_type_sync_workers_.end(); | 240 it != model_type_sync_workers_.end(); ++it) { |
251 ++it) { | |
252 if ((*it)->GetModelType() == type) { | 241 if ((*it)->GetModelType() == type) { |
253 model_type_sync_workers_.erase(it); | 242 model_type_sync_workers_.erase(it); |
254 break; | 243 break; |
255 } | 244 } |
256 } | 245 } |
257 } | 246 } |
258 | 247 |
259 ModelTypeSet ModelTypeRegistry::GetEnabledTypes() const { | 248 ModelTypeSet ModelTypeRegistry::GetEnabledTypes() const { |
260 return Union(GetEnabledDirectoryTypes(), GetEnabledNonBlockingTypes()); | 249 return Union(GetEnabledDirectoryTypes(), GetEnabledNonBlockingTypes()); |
261 } | 250 } |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 | 326 |
338 void ModelTypeRegistry::OnLocalSetPassphraseEncryption( | 327 void ModelTypeRegistry::OnLocalSetPassphraseEncryption( |
339 const SyncEncryptionHandler::NigoriState& nigori_state) { | 328 const SyncEncryptionHandler::NigoriState& nigori_state) { |
340 } | 329 } |
341 | 330 |
342 ModelTypeSet ModelTypeRegistry::GetEnabledDirectoryTypes() const { | 331 ModelTypeSet ModelTypeRegistry::GetEnabledDirectoryTypes() const { |
343 return enabled_directory_types_; | 332 return enabled_directory_types_; |
344 } | 333 } |
345 | 334 |
346 void ModelTypeRegistry::OnEncryptionStateChanged() { | 335 void ModelTypeRegistry::OnEncryptionStateChanged() { |
347 for (ScopedVector<ModelTypeSyncWorkerImpl>::iterator it = | 336 for (ScopedVector<syncer_v2::ModelTypeSyncWorkerImpl>::iterator it = |
348 model_type_sync_workers_.begin(); | 337 model_type_sync_workers_.begin(); |
349 it != model_type_sync_workers_.end(); | 338 it != model_type_sync_workers_.end(); ++it) { |
350 ++it) { | |
351 if (encrypted_types_.Has((*it)->GetModelType())) { | 339 if (encrypted_types_.Has((*it)->GetModelType())) { |
352 (*it)->UpdateCryptographer( | 340 (*it)->UpdateCryptographer( |
353 make_scoped_ptr(new Cryptographer(*cryptographer_))); | 341 make_scoped_ptr(new Cryptographer(*cryptographer_))); |
354 } | 342 } |
355 } | 343 } |
356 } | 344 } |
357 | 345 |
358 ModelTypeSet ModelTypeRegistry::GetEnabledNonBlockingTypes() const { | 346 ModelTypeSet ModelTypeRegistry::GetEnabledNonBlockingTypes() const { |
359 ModelTypeSet enabled_off_thread_types; | 347 ModelTypeSet enabled_off_thread_types; |
360 for (ScopedVector<ModelTypeSyncWorkerImpl>::const_iterator it = | 348 for (ScopedVector<syncer_v2::ModelTypeSyncWorkerImpl>::const_iterator it = |
361 model_type_sync_workers_.begin(); | 349 model_type_sync_workers_.begin(); |
362 it != model_type_sync_workers_.end(); | 350 it != model_type_sync_workers_.end(); ++it) { |
363 ++it) { | |
364 enabled_off_thread_types.Put((*it)->GetModelType()); | 351 enabled_off_thread_types.Put((*it)->GetModelType()); |
365 } | 352 } |
366 return enabled_off_thread_types; | 353 return enabled_off_thread_types; |
367 } | 354 } |
368 | 355 |
369 } // namespace syncer | 356 } // namespace syncer |
OLD | NEW |