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

Unified Diff: components/sync_driver/glue/sync_backend_registrar.cc

Issue 2203673002: [Sync] Move //components/sync_driver to //components/sync/driver. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@sd-a
Patch Set: Full change rebased on static lib. Created 4 years, 4 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 side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « components/sync_driver/glue/sync_backend_registrar.h ('k') | components/sync_driver/glue/sync_backend_registrar_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698