Index: chrome/browser/sync/glue/sync_backend_host.cc |
diff --git a/chrome/browser/sync/glue/sync_backend_host.cc b/chrome/browser/sync/glue/sync_backend_host.cc |
index 86f4478cf902889f304638b6418f4d9b218ee461..cac510deff7d174cae0dce88b12255d5babb623c 100644 |
--- a/chrome/browser/sync/glue/sync_backend_host.cc |
+++ b/chrome/browser/sync/glue/sync_backend_host.cc |
@@ -49,7 +49,6 @@ static const int kSaveChangesIntervalSeconds = 10; |
static const FilePath::CharType kSyncDataFolderName[] = |
FILE_PATH_LITERAL("Sync Data"); |
-using browser_sync::DataTypeController; |
typedef TokenService::TokenAvailableDetails TokenAvailableDetails; |
typedef GoogleServiceAuthError AuthError; |
@@ -96,7 +95,7 @@ void SyncBackendHost::Initialize( |
SyncFrontend* frontend, |
const WeakHandle<JsEventHandler>& event_handler, |
const GURL& sync_service_url, |
- const syncable::ModelTypeSet& types, |
+ const syncable::ModelTypeSet& initial_types, |
const SyncCredentials& credentials, |
bool delete_sync_data_folder) { |
if (!sync_thread_.Start()) |
@@ -114,8 +113,8 @@ void SyncBackendHost::Initialize( |
// Any datatypes that we want the syncer to pull down must |
// be in the routing_info map. We set them to group passive, meaning that |
// updates will be applied to sync, but not dispatched to the native models. |
- for (syncable::ModelTypeSet::const_iterator it = types.begin(); |
- it != types.end(); ++it) { |
+ for (syncable::ModelTypeSet::const_iterator it = initial_types.begin(); |
+ it != initial_types.end(); ++it) { |
registrar_.routing_info[(*it)] = GROUP_PASSIVE; |
} |
@@ -128,8 +127,8 @@ void SyncBackendHost::Initialize( |
registrar_.workers[GROUP_PASSWORD] = |
new PasswordModelWorker(password_store); |
} else { |
- LOG_IF(WARNING, types.count(syncable::PASSWORDS) > 0) << "Password store " |
- << "not initialized, cannot sync passwords"; |
+ LOG_IF(WARNING, initial_types.count(syncable::PASSWORDS) > 0) |
+ << "Password store not initialized, cannot sync passwords"; |
registrar_.routing_info.erase(syncable::PASSWORDS); |
} |
@@ -281,82 +280,74 @@ SyncBackendHost::PendingConfigureDataTypesState:: |
~PendingConfigureDataTypesState() {} |
void SyncBackendHost::GetPendingConfigModeState( |
- const DataTypeController::TypeMap& data_type_controllers, |
- const syncable::ModelTypeSet& types, |
+ const syncable::ModelTypeSet& types_to_add, |
+ const syncable::ModelTypeSet& types_to_remove, |
base::Callback<void(bool)> ready_task, |
ModelSafeRoutingInfo* routing_info, |
sync_api::ConfigureReason reason, |
- bool nigori_enabled, |
- SyncBackendHost::PendingConfigureDataTypesState* state, |
- bool* deleted_type) { |
+ SyncBackendHost::PendingConfigureDataTypesState* state) { |
+ if (DCHECK_IS_ON()) { |
+ syncable::ModelTypeSet intersection; |
+ std::set_intersection( |
+ types_to_add.begin(), types_to_add.end(), |
+ types_to_remove.begin(), types_to_remove.end(), |
+ std::inserter(intersection, intersection.end())); |
+ DCHECK(intersection.empty()); |
+ } |
*state = SyncBackendHost::PendingConfigureDataTypesState(); |
- *deleted_type = false; |
- for (DataTypeController::TypeMap::const_iterator it = |
- data_type_controllers.begin(); |
- it != data_type_controllers.end(); ++it) { |
- syncable::ModelType type = it->first; |
- // If a type is not specified, remove it from the routing_info. |
- if (types.count(type) == 0) { |
- *deleted_type = true; |
- routing_info->erase(type); |
- } else { |
- // Add a newly specified data type as GROUP_PASSIVE into the |
- // routing_info, if it does not already exist. |
- if (routing_info->count(type) == 0) { |
- (*routing_info)[type] = GROUP_PASSIVE; |
- state->added_types.set(type); |
- } |
+ |
+ for (syncable::ModelTypeSet::const_iterator it = types_to_add.begin(); |
+ it != types_to_add.end(); ++it) { |
+ syncable::ModelType type = *it; |
+ // Add a newly specified data type as GROUP_PASSIVE into the |
+ // routing_info, if it does not already exist. |
+ if (routing_info->count(type) == 0) { |
+ (*routing_info)[type] = GROUP_PASSIVE; |
+ state->added_types.insert(type); |
} |
} |
- // We must handle NIGORI separately as it has no DataTypeController. |
- if (types.count(syncable::NIGORI) == 0) { |
- if (nigori_enabled) { // Nigori is currently enabled. |
- *deleted_type = true; |
- routing_info->erase(syncable::NIGORI); |
- // IsNigoriEnabled is now false. |
- } |
- } else { // Nigori needs to be enabled. |
- if (!nigori_enabled) { |
- // Currently it is disabled. So enable it. |
- (*routing_info)[syncable::NIGORI] = GROUP_PASSIVE; |
- state->added_types.set(syncable::NIGORI); |
- } |
+ for (syncable::ModelTypeSet::const_iterator it = types_to_remove.begin(); |
+ it != types_to_remove.end(); ++it) { |
+ routing_info->erase(*it); |
} |
state->ready_task = ready_task; |
- state->initial_types = types; |
+ state->types_to_add = types_to_add; |
state->reason = reason; |
} |
void SyncBackendHost::ConfigureDataTypes( |
- const DataTypeController::TypeMap& data_type_controllers, |
- const syncable::ModelTypeSet& types, |
+ const syncable::ModelTypeSet& types_to_add, |
+ const syncable::ModelTypeSet& types_to_remove, |
sync_api::ConfigureReason reason, |
base::Callback<void(bool)> ready_task, |
bool enable_nigori) { |
+ syncable::ModelTypeSet types_to_add_with_nigori = types_to_add; |
+ syncable::ModelTypeSet types_to_remove_with_nigori = types_to_remove; |
+ if (enable_nigori) { |
+ types_to_add_with_nigori.insert(syncable::NIGORI); |
+ types_to_remove_with_nigori.erase(syncable::NIGORI); |
+ } else { |
+ types_to_add_with_nigori.erase(syncable::NIGORI); |
+ types_to_remove_with_nigori.insert(syncable::NIGORI); |
+ } |
tim (not reviewing)
2011/08/10 23:39:08
^^
Wow, what a mindffffffffffffffff
akalin
2011/08/10 23:41:49
What do you suggest? It's better than the special
|
// Only one configure is allowed at a time. |
DCHECK(!pending_config_mode_state_.get()); |
DCHECK(!pending_download_state_.get()); |
DCHECK_GT(initialization_state_, NOT_INITIALIZED); |
- syncable::ModelTypeSet types_copy = types; |
- if (enable_nigori) { |
- types_copy.insert(syncable::NIGORI); |
- } |
- bool nigori_currently_enabled = IsNigoriEnabled(); |
pending_config_mode_state_.reset(new PendingConfigureDataTypesState()); |
- bool deleted_type = false; |
{ |
base::AutoLock lock(registrar_lock_); |
- GetPendingConfigModeState(data_type_controllers, types_copy, |
- ready_task, ®istrar_.routing_info, reason, |
- nigori_currently_enabled, |
- pending_config_mode_state_.get(), |
- &deleted_type); |
+ GetPendingConfigModeState(types_to_add_with_nigori, |
+ types_to_remove_with_nigori, |
+ ready_task, |
+ ®istrar_.routing_info, reason, |
+ pending_config_mode_state_.get()); |
} |
- if (deleted_type) { |
+ if (!types_to_remove.empty()) { |
sync_thread_.message_loop()->PostTask( |
FROM_HERE, |
NewRunnableMethod( |
@@ -392,7 +383,7 @@ void SyncBackendHost::FinishConfigureDataTypesOnFrontendLoop() { |
VLOG(1) << "Syncer in config mode. SBH executing" |
<< "FinishConfigureDataTypesOnFrontendLoop"; |
- if (pending_config_mode_state_->added_types.none() && |
+ if (pending_config_mode_state_->added_types.empty() && |
!core_->sync_manager()->InitialSyncEndedForAllEnabledTypes()) { |
LOG(WARNING) << "No new types, but initial sync not finished." |
<< "Possible sync db corruption / removal."; |
@@ -401,13 +392,12 @@ void SyncBackendHost::FinishConfigureDataTypesOnFrontendLoop() { |
// types that are needed... but this is a rare corruption edge case or |
// implies the user mucked around with their syncdb, so for now do all. |
pending_config_mode_state_->added_types = |
- syncable::ModelTypeBitSetFromSet( |
- pending_config_mode_state_->initial_types); |
+ pending_config_mode_state_->types_to_add; |
} |
// If we've added types, we always want to request a nudge/config (even if |
// the initial sync is ended), in case we could not decrypt the data. |
- if (pending_config_mode_state_->added_types.none()) { |
+ if (pending_config_mode_state_->added_types.empty()) { |
VLOG(1) << "SyncBackendHost(" << this << "): No new types added. " |
<< "Calling ready_task directly"; |
// No new types - just notify the caller that the types are available. |
@@ -415,15 +405,18 @@ void SyncBackendHost::FinishConfigureDataTypesOnFrontendLoop() { |
} else { |
pending_download_state_.reset(pending_config_mode_state_.release()); |
- syncable::ModelTypeBitSet types_copy(pending_download_state_->added_types); |
- if (IsNigoriEnabled()) |
- types_copy.set(syncable::NIGORI); |
+ // Always configure nigori if it's enabled. |
+ syncable::ModelTypeSet types_to_config = |
+ pending_download_state_->added_types; |
+ if (IsNigoriEnabled()) { |
+ types_to_config.insert(syncable::NIGORI); |
+ } |
VLOG(1) << "SyncBackendHost(" << this << "):New Types added. " |
<< "Calling DoRequestConfig"; |
sync_thread_.message_loop()->PostTask(FROM_HERE, |
NewRunnableMethod(core_.get(), |
&SyncBackendHost::Core::DoRequestConfig, |
- types_copy, |
+ syncable::ModelTypeBitSetFromSet(types_to_config), |
pending_download_state_->reason)); |
} |
@@ -449,18 +442,17 @@ syncable::ModelTypeSet SyncBackendHost::GetEncryptedDataTypes() const { |
} |
void SyncBackendHost::ActivateDataType( |
- DataTypeController* data_type_controller, |
+ syncable::ModelType type, ModelSafeGroup group, |
ChangeProcessor* change_processor) { |
base::AutoLock lock(registrar_lock_); |
// Ensure that the given data type is in the PASSIVE group. |
browser_sync::ModelSafeRoutingInfo::iterator i = |
- registrar_.routing_info.find(data_type_controller->type()); |
+ registrar_.routing_info.find(type); |
DCHECK(i != registrar_.routing_info.end()); |
DCHECK((*i).second == GROUP_PASSIVE); |
- syncable::ModelType type = data_type_controller->type(); |
// Change the data type's routing info to its group. |
- registrar_.routing_info[type] = data_type_controller->model_safe_group(); |
+ registrar_.routing_info[type] = group; |
// Add the data type's change processor to the list of change |
// processors so it can receive updates. |
@@ -469,19 +461,21 @@ void SyncBackendHost::ActivateDataType( |
// Start the change processor. |
change_processor->Start(profile_, GetUserShare()); |
+ DCHECK(GetProcessorUnsafe(type)); |
} |
-void SyncBackendHost::DeactivateDataType( |
- DataTypeController* data_type_controller, |
- ChangeProcessor* change_processor) { |
+void SyncBackendHost::DeactivateDataType(syncable::ModelType type) { |
base::AutoLock lock(registrar_lock_); |
- registrar_.routing_info.erase(data_type_controller->type()); |
+ registrar_.routing_info.erase(type); |
+ std::map<syncable::ModelType, ChangeProcessor*>::iterator it = |
+ processors_.find(type); |
// Stop the change processor and remove it from the list of processors. |
- change_processor->Stop(); |
- std::map<syncable::ModelType, ChangeProcessor*>::size_type erased = |
- processors_.erase(data_type_controller->type()); |
- DCHECK_EQ(erased, 1U); |
+ if (it != processors_.end()) { |
+ it->second->Stop(); |
+ processors_.erase(it); |
+ } |
+ DCHECK(!GetProcessorUnsafe(type)); |
} |
bool SyncBackendHost::RequestClearServerData() { |
@@ -738,9 +732,9 @@ void SyncBackendHost::Core::DoEncryptDataTypes( |
} |
void SyncBackendHost::Core::DoRequestConfig( |
- const syncable::ModelTypeBitSet& added_types, |
+ const syncable::ModelTypeBitSet& types_to_config, |
sync_api::ConfigureReason reason) { |
- sync_manager_->RequestConfig(added_types, reason); |
+ sync_manager_->RequestConfig(types_to_config, reason); |
} |
void SyncBackendHost::Core::DoStartConfiguration(Callback0::Type* callback) { |
@@ -771,10 +765,17 @@ void SyncBackendHost::Core::DoShutdown(bool sync_disabled) { |
host_ = NULL; |
} |
-ChangeProcessor* SyncBackendHost::Core::GetProcessor( |
+ChangeProcessor* SyncBackendHost::GetProcessor( |
syncable::ModelType model_type) { |
+ base::AutoLock lock(registrar_lock_); |
+ return GetProcessorUnsafe(model_type); |
+} |
+ |
+ChangeProcessor* SyncBackendHost::GetProcessorUnsafe( |
+ syncable::ModelType model_type) { |
+ registrar_lock_.AssertAcquired(); |
std::map<syncable::ModelType, ChangeProcessor*>::const_iterator it = |
- host_->processors_.find(model_type); |
+ processors_.find(model_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 |
@@ -783,7 +784,7 @@ ChangeProcessor* SyncBackendHost::Core::GetProcessor( |
// processor is added to the processors_ list. This all happens on |
// the UI thread so we will never drop any changes after model |
// association. |
- if (it == host_->processors_.end()) |
+ if (it == processors_.end()) |
return NULL; |
if (!IsCurrentThreadSafeForModel(model_type)) { |
@@ -812,7 +813,7 @@ void SyncBackendHost::Core::OnChangesApplied( |
DCHECK(false) << "OnChangesApplied called after Shutdown?"; |
return; |
} |
- ChangeProcessor* processor = GetProcessor(model_type); |
+ ChangeProcessor* processor = host_->GetProcessor(model_type); |
if (!processor) |
return; |
@@ -826,7 +827,7 @@ void SyncBackendHost::Core::OnChangesComplete( |
return; |
} |
- ChangeProcessor* processor = GetProcessor(model_type); |
+ ChangeProcessor* processor = host_->GetProcessor(model_type); |
if (!processor) |
return; |
@@ -861,13 +862,13 @@ void SyncBackendHost::Core::HandleSyncCycleCompletedOnFrontendLoop( |
if (host_->pending_download_state_.get()) { |
scoped_ptr<PendingConfigureDataTypesState> state( |
host_->pending_download_state_.release()); |
- bool found_all_added = true; |
- syncable::ModelTypeSet::const_iterator it; |
- for (it = state->initial_types.begin(); it != state->initial_types.end(); |
- ++it) { |
- if (state->added_types.test(*it)) |
- found_all_added &= snapshot->initial_sync_ended.test(*it); |
- } |
+ DCHECK( |
+ std::includes(state->types_to_add.begin(), state->types_to_add.end(), |
+ state->added_types.begin(), state->added_types.end())); |
+ syncable::ModelTypeBitSet added_types = |
+ syncable::ModelTypeBitSetFromSet(state->added_types); |
+ bool found_all_added = |
+ (added_types & snapshot->initial_sync_ended) == added_types; |
state->ready_task.Run(found_all_added); |
if (!found_all_added) |
return; |
@@ -928,7 +929,7 @@ void SyncBackendHost::HandleInitializationCompletedOnFrontendLoop( |
initialization_state_ = DOWNLOADING_NIGORI; |
ConfigureDataTypes( |
- DataTypeController::TypeMap(), |
+ syncable::ModelTypeSet(), |
syncable::ModelTypeSet(), |
sync_api::CONFIGURE_REASON_NEW_CLIENT, |
base::Bind( |
@@ -937,17 +938,17 @@ void SyncBackendHost::HandleInitializationCompletedOnFrontendLoop( |
true); |
} |
-bool SyncBackendHost::Core::IsCurrentThreadSafeForModel( |
- syncable::ModelType model_type) { |
- base::AutoLock lock(host_->registrar_lock_); |
+bool SyncBackendHost::IsCurrentThreadSafeForModel( |
+ syncable::ModelType model_type) const { |
+ registrar_lock_.AssertAcquired(); |
browser_sync::ModelSafeRoutingInfo::const_iterator routing_it = |
- host_->registrar_.routing_info.find(model_type); |
- if (routing_it == host_->registrar_.routing_info.end()) |
+ registrar_.routing_info.find(model_type); |
+ if (routing_it == registrar_.routing_info.end()) |
return false; |
browser_sync::ModelSafeGroup group = routing_it->second; |
- WorkerMap::const_iterator worker_it = host_->registrar_.workers.find(group); |
- if (worker_it == host_->registrar_.workers.end()) |
+ WorkerMap::const_iterator worker_it = registrar_.workers.find(group); |
+ if (worker_it == registrar_.workers.end()) |
return false; |
ModelSafeWorker* worker = worker_it->second; |
return worker->CurrentThreadIsWorkThread(); |