Index: components/sync_driver/glue/sync_backend_registrar.cc |
diff --git a/components/sync_driver/glue/sync_backend_registrar.cc b/components/sync_driver/glue/sync_backend_registrar.cc |
deleted file mode 100644 |
index e17a7f61cb4e5d3cd634659c8495b7760d469a18..0000000000000000000000000000000000000000 |
--- a/components/sync_driver/glue/sync_backend_registrar.cc |
+++ /dev/null |
@@ -1,381 +0,0 @@ |
-// Copyright 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "components/sync_driver/glue/sync_backend_registrar.h" |
- |
-#include <cstddef> |
-#include <utility> |
- |
-#include "base/compiler_specific.h" |
-#include "base/logging.h" |
-#include "base/message_loop/message_loop.h" |
-#include "components/sync/core/user_share.h" |
-#include "components/sync_driver/change_processor.h" |
-#include "components/sync_driver/sync_client.h" |
- |
-namespace browser_sync { |
- |
-SyncBackendRegistrar::SyncBackendRegistrar( |
- const std::string& name, |
- sync_driver::SyncClient* sync_client, |
- std::unique_ptr<base::Thread> sync_thread, |
- const scoped_refptr<base::SingleThreadTaskRunner>& ui_thread, |
- const scoped_refptr<base::SingleThreadTaskRunner>& db_thread, |
- const scoped_refptr<base::SingleThreadTaskRunner>& file_thread) |
- : name_(name), |
- sync_client_(sync_client), |
- ui_thread_(ui_thread), |
- db_thread_(db_thread), |
- file_thread_(file_thread) { |
- DCHECK(ui_thread_->BelongsToCurrentThread()); |
- DCHECK(sync_client_); |
- |
- sync_thread_ = std::move(sync_thread); |
- if (!sync_thread_) { |
- sync_thread_.reset(new base::Thread("Chrome_SyncThread")); |
- base::Thread::Options options; |
- options.timer_slack = base::TIMER_SLACK_MAXIMUM; |
- CHECK(sync_thread_->StartWithOptions(options)); |
- } |
- |
- MaybeAddWorker(syncer::GROUP_DB); |
- MaybeAddWorker(syncer::GROUP_FILE); |
- MaybeAddWorker(syncer::GROUP_UI); |
- MaybeAddWorker(syncer::GROUP_PASSIVE); |
- MaybeAddWorker(syncer::GROUP_HISTORY); |
- MaybeAddWorker(syncer::GROUP_PASSWORD); |
- |
- // Must have at least one worker for SyncBackendRegistrar to be destroyed |
- // correctly, as it is destroyed after the last worker dies. |
- DCHECK_GT(workers_.size(), 0u); |
-} |
- |
-void SyncBackendRegistrar::RegisterNonBlockingType(syncer::ModelType type) { |
- DCHECK(ui_thread_->BelongsToCurrentThread()); |
- base::AutoLock lock(lock_); |
- DCHECK(routing_info_.find(type) == routing_info_.end() || |
- routing_info_[type] == syncer::GROUP_NON_BLOCKING); |
- non_blocking_types_.Put(type); |
-} |
- |
-void SyncBackendRegistrar::SetInitialTypes(syncer::ModelTypeSet initial_types) { |
- base::AutoLock lock(lock_); |
- |
- // This function should be called only once, shortly after construction. The |
- // routing info at that point is expected to be empty. |
- DCHECK(routing_info_.empty()); |
- |
- // Set our initial state to reflect the current status of the sync directory. |
- // This will ensure that our calculations in ConfigureDataTypes() will always |
- // return correct results. |
- for (syncer::ModelTypeSet::Iterator it = initial_types.First(); it.Good(); |
- it.Inc()) { |
- routing_info_[it.Get()] = GetInitialGroupForType(it.Get()); |
- } |
- |
- if (!workers_.count(syncer::GROUP_HISTORY)) { |
- LOG_IF(WARNING, initial_types.Has(syncer::TYPED_URLS)) |
- << "History store disabled, cannot sync Omnibox History"; |
- routing_info_.erase(syncer::TYPED_URLS); |
- } |
- |
- if (!workers_.count(syncer::GROUP_PASSWORD)) { |
- LOG_IF(WARNING, initial_types.Has(syncer::PASSWORDS)) |
- << "Password store not initialized, cannot sync passwords"; |
- routing_info_.erase(syncer::PASSWORDS); |
- } |
- |
- last_configured_types_ = syncer::GetRoutingInfoTypes(routing_info_); |
-} |
- |
-void SyncBackendRegistrar::AddRestoredNonBlockingType(syncer::ModelType type) { |
- DCHECK(ui_thread_->BelongsToCurrentThread()); |
- base::AutoLock lock(lock_); |
- DCHECK(non_blocking_types_.Has(type)); |
- DCHECK(routing_info_.find(type) == routing_info_.end()); |
- routing_info_[type] = syncer::GROUP_NON_BLOCKING; |
- last_configured_types_.Put(type); |
-} |
- |
-bool SyncBackendRegistrar::IsNigoriEnabled() const { |
- DCHECK(ui_thread_->BelongsToCurrentThread()); |
- base::AutoLock lock(lock_); |
- return routing_info_.find(syncer::NIGORI) != routing_info_.end(); |
-} |
- |
-syncer::ModelTypeSet SyncBackendRegistrar::ConfigureDataTypes( |
- syncer::ModelTypeSet types_to_add, |
- syncer::ModelTypeSet types_to_remove) { |
- DCHECK(Intersection(types_to_add, types_to_remove).Empty()); |
- syncer::ModelTypeSet filtered_types_to_add = types_to_add; |
- if (workers_.count(syncer::GROUP_HISTORY) == 0) { |
- LOG(WARNING) << "No history worker -- removing TYPED_URLS"; |
- filtered_types_to_add.Remove(syncer::TYPED_URLS); |
- } |
- if (workers_.count(syncer::GROUP_PASSWORD) == 0) { |
- LOG(WARNING) << "No password worker -- removing PASSWORDS"; |
- filtered_types_to_add.Remove(syncer::PASSWORDS); |
- } |
- |
- base::AutoLock lock(lock_); |
- syncer::ModelTypeSet newly_added_types; |
- for (syncer::ModelTypeSet::Iterator it = filtered_types_to_add.First(); |
- it.Good(); it.Inc()) { |
- // Add a newly specified data type as syncer::GROUP_PASSIVE into the |
- // routing_info, if it does not already exist. |
- if (routing_info_.count(it.Get()) == 0) { |
- routing_info_[it.Get()] = GetInitialGroupForType(it.Get()); |
- newly_added_types.Put(it.Get()); |
- } |
- } |
- for (syncer::ModelTypeSet::Iterator it = types_to_remove.First(); it.Good(); |
- it.Inc()) { |
- routing_info_.erase(it.Get()); |
- } |
- |
- // TODO(akalin): Use SVLOG/SLOG if we add any more logging. |
- DVLOG(1) << name_ << ": Adding types " |
- << syncer::ModelTypeSetToString(types_to_add) |
- << " (with newly-added types " |
- << syncer::ModelTypeSetToString(newly_added_types) |
- << ") and removing types " |
- << syncer::ModelTypeSetToString(types_to_remove) |
- << " to get new routing info " |
- << syncer::ModelSafeRoutingInfoToString(routing_info_); |
- last_configured_types_ = syncer::GetRoutingInfoTypes(routing_info_); |
- |
- return newly_added_types; |
-} |
- |
-syncer::ModelTypeSet SyncBackendRegistrar::GetLastConfiguredTypes() const { |
- return last_configured_types_; |
-} |
- |
-void SyncBackendRegistrar::RequestWorkerStopOnUIThread() { |
- DCHECK(ui_thread_->BelongsToCurrentThread()); |
- base::AutoLock lock(lock_); |
- for (WorkerMap::const_iterator it = workers_.begin(); it != workers_.end(); |
- ++it) { |
- it->second->RequestStop(); |
- } |
-} |
- |
-void SyncBackendRegistrar::ActivateDataType( |
- syncer::ModelType type, |
- syncer::ModelSafeGroup group, |
- sync_driver::ChangeProcessor* change_processor, |
- syncer::UserShare* user_share) { |
- DVLOG(1) << "Activate: " << syncer::ModelTypeToString(type); |
- |
- base::AutoLock lock(lock_); |
- // Ensure that the given data type is in the PASSIVE group. |
- syncer::ModelSafeRoutingInfo::iterator i = routing_info_.find(type); |
- DCHECK(i != routing_info_.end()); |
- DCHECK_EQ(i->second, syncer::GROUP_PASSIVE); |
- routing_info_[type] = group; |
- |
- // Add the data type's change processor to the list of change |
- // processors so it can receive updates. |
- DCHECK_EQ(processors_.count(type), 0U); |
- processors_[type] = change_processor; |
- |
- // Start the change processor. |
- change_processor->Start(user_share); |
- DCHECK(GetProcessorUnsafe(type)); |
-} |
- |
-void SyncBackendRegistrar::DeactivateDataType(syncer::ModelType type) { |
- DVLOG(1) << "Deactivate: " << syncer::ModelTypeToString(type); |
- |
- DCHECK(ui_thread_->BelongsToCurrentThread() || IsControlType(type)); |
- base::AutoLock lock(lock_); |
- |
- routing_info_.erase(type); |
- ignore_result(processors_.erase(type)); |
- DCHECK(!GetProcessorUnsafe(type)); |
-} |
- |
-bool SyncBackendRegistrar::IsTypeActivatedForTest( |
- syncer::ModelType type) const { |
- return GetProcessor(type) != NULL; |
-} |
- |
-void SyncBackendRegistrar::OnChangesApplied( |
- syncer::ModelType model_type, |
- int64_t model_version, |
- const syncer::BaseTransaction* trans, |
- const syncer::ImmutableChangeRecordList& changes) { |
- sync_driver::ChangeProcessor* processor = GetProcessor(model_type); |
- if (!processor) |
- return; |
- |
- processor->ApplyChangesFromSyncModel(trans, model_version, changes); |
-} |
- |
-void SyncBackendRegistrar::OnChangesComplete(syncer::ModelType model_type) { |
- sync_driver::ChangeProcessor* processor = GetProcessor(model_type); |
- if (!processor) |
- return; |
- |
- // This call just notifies the processor that it can commit; it |
- // already buffered any changes it plans to makes so needs no |
- // further information. |
- processor->CommitChangesFromSyncModel(); |
-} |
- |
-void SyncBackendRegistrar::GetWorkers( |
- std::vector<scoped_refptr<syncer::ModelSafeWorker>>* out) { |
- base::AutoLock lock(lock_); |
- out->clear(); |
- for (WorkerMap::const_iterator it = workers_.begin(); it != workers_.end(); |
- ++it) { |
- out->push_back(it->second.get()); |
- } |
-} |
- |
-void SyncBackendRegistrar::GetModelSafeRoutingInfo( |
- syncer::ModelSafeRoutingInfo* out) { |
- base::AutoLock lock(lock_); |
- syncer::ModelSafeRoutingInfo copy(routing_info_); |
- out->swap(copy); |
-} |
- |
-sync_driver::ChangeProcessor* SyncBackendRegistrar::GetProcessor( |
- syncer::ModelType type) const { |
- base::AutoLock lock(lock_); |
- sync_driver::ChangeProcessor* processor = GetProcessorUnsafe(type); |
- if (!processor) |
- return NULL; |
- |
- // We can only check if |processor| exists, as otherwise the type is |
- // mapped to syncer::GROUP_PASSIVE. |
- CHECK(IsCurrentThreadSafeForModel(type)); |
- return processor; |
-} |
- |
-sync_driver::ChangeProcessor* SyncBackendRegistrar::GetProcessorUnsafe( |
- syncer::ModelType type) const { |
- lock_.AssertAcquired(); |
- std::map<syncer::ModelType, sync_driver::ChangeProcessor*>::const_iterator |
- it = processors_.find(type); |
- |
- // Until model association happens for a datatype, it will not |
- // appear in the processors list. During this time, it is OK to |
- // drop changes on the floor (since model association has not |
- // happened yet). When the data type is activated, model |
- // association takes place then the change processor is added to the |
- // |processors_| list. |
- if (it == processors_.end()) |
- return NULL; |
- |
- return it->second; |
-} |
- |
-bool SyncBackendRegistrar::IsCurrentThreadSafeForModel( |
- syncer::ModelType model_type) const { |
- lock_.AssertAcquired(); |
- return IsOnThreadForGroup(model_type, |
- GetGroupForModelType(model_type, routing_info_)); |
-} |
- |
-bool SyncBackendRegistrar::IsOnThreadForGroup( |
- syncer::ModelType type, |
- syncer::ModelSafeGroup group) const { |
- switch (group) { |
- case syncer::GROUP_PASSIVE: |
- return IsControlType(type); |
- case syncer::GROUP_UI: |
- return ui_thread_->BelongsToCurrentThread(); |
- case syncer::GROUP_DB: |
- return db_thread_->BelongsToCurrentThread(); |
- case syncer::GROUP_FILE: |
- return file_thread_->BelongsToCurrentThread(); |
- case syncer::GROUP_HISTORY: |
- // TODO(sync): How to check we're on the right thread? |
- return type == syncer::TYPED_URLS; |
- case syncer::GROUP_PASSWORD: |
- // TODO(sync): How to check we're on the right thread? |
- return type == syncer::PASSWORDS; |
- case syncer::GROUP_NON_BLOCKING: |
- // IsOnThreadForGroup shouldn't be called for non-blocking types. |
- return false; |
- } |
- NOTREACHED(); |
- return false; |
-} |
- |
-SyncBackendRegistrar::~SyncBackendRegistrar() { |
- DCHECK(workers_.empty()); |
-} |
- |
-void SyncBackendRegistrar::OnWorkerLoopDestroyed(syncer::ModelSafeGroup group) { |
- RemoveWorker(group); |
-} |
- |
-void SyncBackendRegistrar::MaybeAddWorker(syncer::ModelSafeGroup group) { |
- const scoped_refptr<syncer::ModelSafeWorker> worker = |
- sync_client_->CreateModelWorkerForGroup(group, this); |
- if (worker) { |
- DCHECK(workers_.find(group) == workers_.end()); |
- workers_[group] = worker; |
- workers_[group]->RegisterForLoopDestruction(); |
- } |
-} |
- |
-void SyncBackendRegistrar::OnWorkerUnregistrationDone( |
- syncer::ModelSafeGroup group) { |
- RemoveWorker(group); |
-} |
- |
-void SyncBackendRegistrar::RemoveWorker(syncer::ModelSafeGroup group) { |
- DVLOG(1) << "Remove " << ModelSafeGroupToString(group) << " worker."; |
- |
- bool last_worker = false; |
- { |
- base::AutoLock al(lock_); |
- WorkerMap::iterator it = workers_.find(group); |
- CHECK(it != workers_.end()); |
- stopped_workers_.push_back(it->second); |
- workers_.erase(it); |
- last_worker = workers_.empty(); |
- } |
- |
- if (last_worker) { |
- // Self-destruction after last worker. |
- DVLOG(1) << "Destroy registrar on loop of " |
- << ModelSafeGroupToString(group); |
- delete this; |
- } |
-} |
- |
-std::unique_ptr<base::Thread> SyncBackendRegistrar::ReleaseSyncThread() { |
- return std::move(sync_thread_); |
-} |
- |
-void SyncBackendRegistrar::Shutdown() { |
- // All data types should have been deactivated by now. |
- DCHECK(processors_.empty()); |
- |
- // Unregister worker from observing loop destruction. |
- base::AutoLock al(lock_); |
- for (WorkerMap::iterator it = workers_.begin(); it != workers_.end(); ++it) { |
- it->second->UnregisterForLoopDestruction( |
- base::Bind(&SyncBackendRegistrar::OnWorkerUnregistrationDone, |
- base::Unretained(this))); |
- } |
-} |
- |
-base::Thread* SyncBackendRegistrar::sync_thread() { |
- return sync_thread_.get(); |
-} |
- |
-syncer::ModelSafeGroup SyncBackendRegistrar::GetInitialGroupForType( |
- syncer::ModelType type) const { |
- if (non_blocking_types_.Has(type)) |
- return syncer::GROUP_NON_BLOCKING; |
- else |
- return syncer::GROUP_PASSIVE; |
-} |
- |
-} // namespace browser_sync |