| 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/message_loop/message_loop_proxy.h" | 8 #include "base/message_loop/message_loop_proxy.h" |
| 9 #include "base/observer_list.h" | 9 #include "base/observer_list.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" |
| 13 #include "sync/engine/model_type_sync_proxy_impl.h" |
| 14 #include "sync/engine/model_type_sync_worker.h" |
| 15 #include "sync/engine/model_type_sync_worker_impl.h" |
| 12 #include "sync/engine/non_blocking_sync_common.h" | 16 #include "sync/engine/non_blocking_sync_common.h" |
| 13 #include "sync/engine/non_blocking_type_processor.h" | |
| 14 #include "sync/engine/non_blocking_type_processor_core.h" | |
| 15 #include "sync/engine/non_blocking_type_processor_core_interface.h" | |
| 16 #include "sync/engine/non_blocking_type_processor_interface.h" | |
| 17 #include "sync/sessions/directory_type_debug_info_emitter.h" | 17 #include "sync/sessions/directory_type_debug_info_emitter.h" |
| 18 | 18 |
| 19 namespace syncer { | 19 namespace syncer { |
| 20 | 20 |
| 21 namespace { | 21 namespace { |
| 22 | 22 |
| 23 class NonBlockingTypeProcessorWrapper | 23 class ModelTypeSyncProxyWrapper : public ModelTypeSyncProxy { |
| 24 : public NonBlockingTypeProcessorInterface { | |
| 25 public: | 24 public: |
| 26 NonBlockingTypeProcessorWrapper( | 25 ModelTypeSyncProxyWrapper( |
| 27 base::WeakPtr<NonBlockingTypeProcessor> processor, | 26 const base::WeakPtr<ModelTypeSyncProxyImpl>& proxy, |
| 28 scoped_refptr<base::SequencedTaskRunner> processor_task_runner); | 27 const scoped_refptr<base::SequencedTaskRunner>& processor_task_runner); |
| 29 virtual ~NonBlockingTypeProcessorWrapper(); | 28 virtual ~ModelTypeSyncProxyWrapper(); |
| 30 | 29 |
| 31 virtual void ReceiveCommitResponse( | 30 virtual void ReceiveCommitResponse( |
| 32 const DataTypeState& type_state, | 31 const DataTypeState& type_state, |
| 33 const CommitResponseDataList& response_list) OVERRIDE; | 32 const CommitResponseDataList& response_list) OVERRIDE; |
| 34 virtual void ReceiveUpdateResponse( | 33 virtual void ReceiveUpdateResponse( |
| 35 const DataTypeState& type_state, | 34 const DataTypeState& type_state, |
| 36 const UpdateResponseDataList& response_list) OVERRIDE; | 35 const UpdateResponseDataList& response_list) OVERRIDE; |
| 37 | 36 |
| 38 private: | 37 private: |
| 39 base::WeakPtr<NonBlockingTypeProcessor> processor_; | 38 base::WeakPtr<ModelTypeSyncProxyImpl> processor_; |
| 40 scoped_refptr<base::SequencedTaskRunner> processor_task_runner_; | 39 scoped_refptr<base::SequencedTaskRunner> processor_task_runner_; |
| 41 }; | 40 }; |
| 42 | 41 |
| 43 NonBlockingTypeProcessorWrapper::NonBlockingTypeProcessorWrapper( | 42 ModelTypeSyncProxyWrapper::ModelTypeSyncProxyWrapper( |
| 44 base::WeakPtr<NonBlockingTypeProcessor> processor, | 43 const base::WeakPtr<ModelTypeSyncProxyImpl>& proxy, |
| 45 scoped_refptr<base::SequencedTaskRunner> processor_task_runner) | 44 const scoped_refptr<base::SequencedTaskRunner>& processor_task_runner) |
| 46 : processor_(processor), processor_task_runner_(processor_task_runner) { | 45 : processor_(proxy), processor_task_runner_(processor_task_runner) { |
| 47 } | 46 } |
| 48 | 47 |
| 49 NonBlockingTypeProcessorWrapper::~NonBlockingTypeProcessorWrapper() { | 48 ModelTypeSyncProxyWrapper::~ModelTypeSyncProxyWrapper() { |
| 50 } | 49 } |
| 51 | 50 |
| 52 void NonBlockingTypeProcessorWrapper::ReceiveCommitResponse( | 51 void ModelTypeSyncProxyWrapper::ReceiveCommitResponse( |
| 53 const DataTypeState& type_state, | 52 const DataTypeState& type_state, |
| 54 const CommitResponseDataList& response_list) { | 53 const CommitResponseDataList& response_list) { |
| 55 processor_task_runner_->PostTask( | 54 processor_task_runner_->PostTask( |
| 56 FROM_HERE, | 55 FROM_HERE, |
| 57 base::Bind(&NonBlockingTypeProcessor::OnCommitCompletion, | 56 base::Bind(&ModelTypeSyncProxyImpl::OnCommitCompletion, |
| 58 processor_, | 57 processor_, |
| 59 type_state, | 58 type_state, |
| 60 response_list)); | 59 response_list)); |
| 61 } | 60 } |
| 62 | 61 |
| 63 void NonBlockingTypeProcessorWrapper::ReceiveUpdateResponse( | 62 void ModelTypeSyncProxyWrapper::ReceiveUpdateResponse( |
| 64 const DataTypeState& type_state, | 63 const DataTypeState& type_state, |
| 65 const UpdateResponseDataList& response_list) { | 64 const UpdateResponseDataList& response_list) { |
| 66 processor_task_runner_->PostTask( | 65 processor_task_runner_->PostTask( |
| 67 FROM_HERE, | 66 FROM_HERE, |
| 68 base::Bind(&NonBlockingTypeProcessor::OnUpdateReceived, | 67 base::Bind(&ModelTypeSyncProxyImpl::OnUpdateReceived, |
| 69 processor_, | 68 processor_, |
| 70 type_state, | 69 type_state, |
| 71 response_list)); | 70 response_list)); |
| 72 } | 71 } |
| 73 | 72 |
| 74 class NonBlockingTypeProcessorCoreWrapper | 73 class ModelTypeSyncWorkerWrapper : public ModelTypeSyncWorker { |
| 75 : public NonBlockingTypeProcessorCoreInterface { | |
| 76 public: | 74 public: |
| 77 NonBlockingTypeProcessorCoreWrapper( | 75 ModelTypeSyncWorkerWrapper( |
| 78 base::WeakPtr<NonBlockingTypeProcessorCore> core, | 76 const base::WeakPtr<ModelTypeSyncWorkerImpl>& worker, |
| 79 scoped_refptr<base::SequencedTaskRunner> sync_thread); | 77 const scoped_refptr<base::SequencedTaskRunner>& sync_thread); |
| 80 virtual ~NonBlockingTypeProcessorCoreWrapper(); | 78 virtual ~ModelTypeSyncWorkerWrapper(); |
| 81 | 79 |
| 82 virtual void RequestCommits(const CommitRequestDataList& list) OVERRIDE; | 80 virtual void RequestCommits(const CommitRequestDataList& list) OVERRIDE; |
| 83 | 81 |
| 84 private: | 82 private: |
| 85 base::WeakPtr<NonBlockingTypeProcessorCore> core_; | 83 base::WeakPtr<ModelTypeSyncWorkerImpl> worker_; |
| 86 scoped_refptr<base::SequencedTaskRunner> sync_thread_; | 84 scoped_refptr<base::SequencedTaskRunner> sync_thread_; |
| 87 }; | 85 }; |
| 88 | 86 |
| 89 NonBlockingTypeProcessorCoreWrapper::NonBlockingTypeProcessorCoreWrapper( | 87 ModelTypeSyncWorkerWrapper::ModelTypeSyncWorkerWrapper( |
| 90 base::WeakPtr<NonBlockingTypeProcessorCore> core, | 88 const base::WeakPtr<ModelTypeSyncWorkerImpl>& worker, |
| 91 scoped_refptr<base::SequencedTaskRunner> sync_thread) | 89 const scoped_refptr<base::SequencedTaskRunner>& sync_thread) |
| 92 : core_(core), sync_thread_(sync_thread) { | 90 : worker_(worker), sync_thread_(sync_thread) { |
| 93 } | 91 } |
| 94 | 92 |
| 95 NonBlockingTypeProcessorCoreWrapper::~NonBlockingTypeProcessorCoreWrapper() { | 93 ModelTypeSyncWorkerWrapper::~ModelTypeSyncWorkerWrapper() { |
| 96 } | 94 } |
| 97 | 95 |
| 98 void NonBlockingTypeProcessorCoreWrapper::RequestCommits( | 96 void ModelTypeSyncWorkerWrapper::RequestCommits( |
| 99 const CommitRequestDataList& list) { | 97 const CommitRequestDataList& list) { |
| 100 sync_thread_->PostTask( | 98 sync_thread_->PostTask( |
| 101 FROM_HERE, | 99 FROM_HERE, |
| 102 base::Bind(&NonBlockingTypeProcessorCore::EnqueueForCommit, core_, list)); | 100 base::Bind(&ModelTypeSyncWorkerImpl::EnqueueForCommit, worker_, list)); |
| 103 } | 101 } |
| 104 | 102 |
| 105 } // namespace | 103 } // namespace |
| 106 | 104 |
| 107 ModelTypeRegistry::ModelTypeRegistry() : directory_(NULL) {} | 105 ModelTypeRegistry::ModelTypeRegistry() : directory_(NULL) {} |
| 108 | 106 |
| 109 ModelTypeRegistry::ModelTypeRegistry( | 107 ModelTypeRegistry::ModelTypeRegistry( |
| 110 const std::vector<scoped_refptr<ModelSafeWorker> >& workers, | 108 const std::vector<scoped_refptr<ModelSafeWorker> >& workers, |
| 111 syncable::Directory* directory) | 109 syncable::Directory* directory) |
| 112 : directory_(directory) { | 110 : directory_(directory) { |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 179 } | 177 } |
| 180 | 178 |
| 181 enabled_directory_types_ = GetRoutingInfoTypes(routing_info); | 179 enabled_directory_types_ = GetRoutingInfoTypes(routing_info); |
| 182 DCHECK(Intersection(GetEnabledDirectoryTypes(), | 180 DCHECK(Intersection(GetEnabledDirectoryTypes(), |
| 183 GetEnabledNonBlockingTypes()).Empty()); | 181 GetEnabledNonBlockingTypes()).Empty()); |
| 184 } | 182 } |
| 185 | 183 |
| 186 void ModelTypeRegistry::InitializeNonBlockingType( | 184 void ModelTypeRegistry::InitializeNonBlockingType( |
| 187 ModelType type, | 185 ModelType type, |
| 188 const DataTypeState& data_type_state, | 186 const DataTypeState& data_type_state, |
| 189 scoped_refptr<base::SequencedTaskRunner> type_task_runner, | 187 const scoped_refptr<base::SequencedTaskRunner>& type_task_runner, |
| 190 base::WeakPtr<NonBlockingTypeProcessor> processor) { | 188 const base::WeakPtr<ModelTypeSyncProxyImpl>& proxy_impl) { |
| 191 DVLOG(1) << "Enabling an off-thread sync type: " << ModelTypeToString(type); | 189 DVLOG(1) << "Enabling an off-thread sync type: " << ModelTypeToString(type); |
| 192 | 190 |
| 193 // Initialize CoreProcessor -> Processor communication channel. | 191 // Initialize Worker -> Proxy communication channel. |
| 194 scoped_ptr<NonBlockingTypeProcessorInterface> processor_interface( | 192 scoped_ptr<ModelTypeSyncProxy> proxy( |
| 195 new NonBlockingTypeProcessorWrapper(processor, type_task_runner)); | 193 new ModelTypeSyncProxyWrapper(proxy_impl, type_task_runner)); |
| 196 scoped_ptr<NonBlockingTypeProcessorCore> core( | 194 scoped_ptr<ModelTypeSyncWorkerImpl> worker( |
| 197 new NonBlockingTypeProcessorCore( | 195 new ModelTypeSyncWorkerImpl(type, data_type_state, proxy.Pass())); |
| 198 type, data_type_state, processor_interface.Pass())); | |
| 199 | 196 |
| 200 // Initialize Processor -> CoreProcessor communication channel. | 197 // Initialize Proxy -> Worker communication channel. |
| 201 scoped_ptr<NonBlockingTypeProcessorCoreInterface> core_interface( | 198 scoped_ptr<ModelTypeSyncWorker> wrapped_worker( |
| 202 new NonBlockingTypeProcessorCoreWrapper( | 199 new ModelTypeSyncWorkerWrapper(worker->AsWeakPtr(), |
| 203 core->AsWeakPtr(), | 200 scoped_refptr<base::SequencedTaskRunner>( |
| 204 scoped_refptr<base::SequencedTaskRunner>( | 201 base::MessageLoopProxy::current()))); |
| 205 base::MessageLoopProxy::current()))); | |
| 206 type_task_runner->PostTask(FROM_HERE, | 202 type_task_runner->PostTask(FROM_HERE, |
| 207 base::Bind(&NonBlockingTypeProcessor::OnConnect, | 203 base::Bind(&ModelTypeSyncProxyImpl::OnConnect, |
| 208 processor, | 204 proxy_impl, |
| 209 base::Passed(&core_interface))); | 205 base::Passed(&wrapped_worker))); |
| 210 | 206 |
| 211 DCHECK(update_handler_map_.find(type) == update_handler_map_.end()); | 207 DCHECK(update_handler_map_.find(type) == update_handler_map_.end()); |
| 212 DCHECK(commit_contributor_map_.find(type) == commit_contributor_map_.end()); | 208 DCHECK(commit_contributor_map_.find(type) == commit_contributor_map_.end()); |
| 213 | 209 |
| 214 update_handler_map_.insert(std::make_pair(type, core.get())); | 210 update_handler_map_.insert(std::make_pair(type, worker.get())); |
| 215 commit_contributor_map_.insert(std::make_pair(type, core.get())); | 211 commit_contributor_map_.insert(std::make_pair(type, worker.get())); |
| 216 | 212 |
| 217 // The container takes ownership. | 213 // The container takes ownership. |
| 218 non_blocking_type_processor_cores_.push_back(core.release()); | 214 model_type_sync_workers_.push_back(worker.release()); |
| 219 | 215 |
| 220 DCHECK(Intersection(GetEnabledDirectoryTypes(), | 216 DCHECK(Intersection(GetEnabledDirectoryTypes(), |
| 221 GetEnabledNonBlockingTypes()).Empty()); | 217 GetEnabledNonBlockingTypes()).Empty()); |
| 222 } | 218 } |
| 223 | 219 |
| 224 void ModelTypeRegistry::RemoveNonBlockingType(ModelType type) { | 220 void ModelTypeRegistry::RemoveNonBlockingType(ModelType type) { |
| 225 DVLOG(1) << "Disabling an off-thread sync type: " << ModelTypeToString(type); | 221 DVLOG(1) << "Disabling an off-thread sync type: " << ModelTypeToString(type); |
| 226 DCHECK(update_handler_map_.find(type) != update_handler_map_.end()); | 222 DCHECK(update_handler_map_.find(type) != update_handler_map_.end()); |
| 227 DCHECK(commit_contributor_map_.find(type) != commit_contributor_map_.end()); | 223 DCHECK(commit_contributor_map_.find(type) != commit_contributor_map_.end()); |
| 228 | 224 |
| 229 size_t updaters_erased = update_handler_map_.erase(type); | 225 size_t updaters_erased = update_handler_map_.erase(type); |
| 230 size_t committers_erased = commit_contributor_map_.erase(type); | 226 size_t committers_erased = commit_contributor_map_.erase(type); |
| 231 | 227 |
| 232 DCHECK_EQ(1U, updaters_erased); | 228 DCHECK_EQ(1U, updaters_erased); |
| 233 DCHECK_EQ(1U, committers_erased); | 229 DCHECK_EQ(1U, committers_erased); |
| 234 | 230 |
| 235 // Remove from the ScopedVector, deleting the core in the process. | 231 // Remove from the ScopedVector, deleting the worker in the process. |
| 236 for (ScopedVector<NonBlockingTypeProcessorCore>::iterator it = | 232 for (ScopedVector<ModelTypeSyncWorkerImpl>::iterator it = |
| 237 non_blocking_type_processor_cores_.begin(); | 233 model_type_sync_workers_.begin(); |
| 238 it != non_blocking_type_processor_cores_.end(); ++it) { | 234 it != model_type_sync_workers_.end(); |
| 235 ++it) { |
| 239 if ((*it)->GetModelType() == type) { | 236 if ((*it)->GetModelType() == type) { |
| 240 non_blocking_type_processor_cores_.erase(it); | 237 model_type_sync_workers_.erase(it); |
| 241 break; | 238 break; |
| 242 } | 239 } |
| 243 } | 240 } |
| 244 } | 241 } |
| 245 | 242 |
| 246 ModelTypeSet ModelTypeRegistry::GetEnabledTypes() const { | 243 ModelTypeSet ModelTypeRegistry::GetEnabledTypes() const { |
| 247 return Union(GetEnabledDirectoryTypes(), GetEnabledNonBlockingTypes()); | 244 return Union(GetEnabledDirectoryTypes(), GetEnabledNonBlockingTypes()); |
| 248 } | 245 } |
| 249 | 246 |
| 250 UpdateHandlerMap* ModelTypeRegistry::update_handler_map() { | 247 UpdateHandlerMap* ModelTypeRegistry::update_handler_map() { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 it->second->EmitStatusCountersUpdate(); | 282 it->second->EmitStatusCountersUpdate(); |
| 286 } | 283 } |
| 287 } | 284 } |
| 288 | 285 |
| 289 ModelTypeSet ModelTypeRegistry::GetEnabledDirectoryTypes() const { | 286 ModelTypeSet ModelTypeRegistry::GetEnabledDirectoryTypes() const { |
| 290 return enabled_directory_types_; | 287 return enabled_directory_types_; |
| 291 } | 288 } |
| 292 | 289 |
| 293 ModelTypeSet ModelTypeRegistry::GetEnabledNonBlockingTypes() const { | 290 ModelTypeSet ModelTypeRegistry::GetEnabledNonBlockingTypes() const { |
| 294 ModelTypeSet enabled_off_thread_types; | 291 ModelTypeSet enabled_off_thread_types; |
| 295 for (ScopedVector<NonBlockingTypeProcessorCore>::const_iterator it = | 292 for (ScopedVector<ModelTypeSyncWorkerImpl>::const_iterator it = |
| 296 non_blocking_type_processor_cores_.begin(); | 293 model_type_sync_workers_.begin(); |
| 297 it != non_blocking_type_processor_cores_.end(); ++it) { | 294 it != model_type_sync_workers_.end(); |
| 295 ++it) { |
| 298 enabled_off_thread_types.Put((*it)->GetModelType()); | 296 enabled_off_thread_types.Put((*it)->GetModelType()); |
| 299 } | 297 } |
| 300 return enabled_off_thread_types; | 298 return enabled_off_thread_types; |
| 301 } | 299 } |
| 302 | 300 |
| 303 } // namespace syncer | 301 } // namespace syncer |
| OLD | NEW |