| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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 "components/sync/driver/glue/sync_backend_registrar.h" | 5 #include "components/sync/driver/glue/sync_backend_registrar.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cstddef> | 8 #include <cstddef> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
| 13 #include "components/sync/core/user_share.h" | 13 #include "components/sync/core/user_share.h" |
| 14 #include "components/sync/driver/change_processor.h" | 14 #include "components/sync/driver/change_processor.h" |
| 15 #include "components/sync/driver/sync_client.h" | 15 #include "components/sync/driver/sync_client.h" |
| 16 | 16 |
| 17 using syncer::ModelSafeGroup; | 17 namespace syncer { |
| 18 using syncer::ModelSafeRoutingInfo; | |
| 19 using syncer::ModelType; | |
| 20 using syncer::ModelTypeSet; | |
| 21 | |
| 22 namespace browser_sync { | |
| 23 | 18 |
| 24 SyncBackendRegistrar::SyncBackendRegistrar( | 19 SyncBackendRegistrar::SyncBackendRegistrar( |
| 25 const std::string& name, | 20 const std::string& name, |
| 26 sync_driver::SyncClient* sync_client, | 21 SyncClient* sync_client, |
| 27 std::unique_ptr<base::Thread> sync_thread, | 22 std::unique_ptr<base::Thread> sync_thread, |
| 28 const scoped_refptr<base::SingleThreadTaskRunner>& ui_thread, | 23 const scoped_refptr<base::SingleThreadTaskRunner>& ui_thread, |
| 29 const scoped_refptr<base::SingleThreadTaskRunner>& db_thread, | 24 const scoped_refptr<base::SingleThreadTaskRunner>& db_thread, |
| 30 const scoped_refptr<base::SingleThreadTaskRunner>& file_thread) | 25 const scoped_refptr<base::SingleThreadTaskRunner>& file_thread) |
| 31 : name_(name), | 26 : name_(name), |
| 32 sync_client_(sync_client), | 27 sync_client_(sync_client), |
| 33 ui_thread_(ui_thread), | 28 ui_thread_(ui_thread), |
| 34 db_thread_(db_thread), | 29 db_thread_(db_thread), |
| 35 file_thread_(file_thread) { | 30 file_thread_(file_thread) { |
| 36 DCHECK(ui_thread_->BelongsToCurrentThread()); | 31 DCHECK(ui_thread_->BelongsToCurrentThread()); |
| 37 DCHECK(sync_client_); | 32 DCHECK(sync_client_); |
| 38 | 33 |
| 39 sync_thread_ = std::move(sync_thread); | 34 sync_thread_ = std::move(sync_thread); |
| 40 if (!sync_thread_) { | 35 if (!sync_thread_) { |
| 41 sync_thread_.reset(new base::Thread("Chrome_SyncThread")); | 36 sync_thread_.reset(new base::Thread("Chrome_SyncThread")); |
| 42 base::Thread::Options options; | 37 base::Thread::Options options; |
| 43 options.timer_slack = base::TIMER_SLACK_MAXIMUM; | 38 options.timer_slack = base::TIMER_SLACK_MAXIMUM; |
| 44 CHECK(sync_thread_->StartWithOptions(options)); | 39 CHECK(sync_thread_->StartWithOptions(options)); |
| 45 } | 40 } |
| 46 | 41 |
| 47 MaybeAddWorker(syncer::GROUP_DB); | 42 MaybeAddWorker(GROUP_DB); |
| 48 MaybeAddWorker(syncer::GROUP_FILE); | 43 MaybeAddWorker(GROUP_FILE); |
| 49 MaybeAddWorker(syncer::GROUP_UI); | 44 MaybeAddWorker(GROUP_UI); |
| 50 MaybeAddWorker(syncer::GROUP_PASSIVE); | 45 MaybeAddWorker(GROUP_PASSIVE); |
| 51 MaybeAddWorker(syncer::GROUP_HISTORY); | 46 MaybeAddWorker(GROUP_HISTORY); |
| 52 MaybeAddWorker(syncer::GROUP_PASSWORD); | 47 MaybeAddWorker(GROUP_PASSWORD); |
| 53 | 48 |
| 54 // Must have at least one worker for SyncBackendRegistrar to be destroyed | 49 // Must have at least one worker for SyncBackendRegistrar to be destroyed |
| 55 // correctly, as it is destroyed after the last worker dies. | 50 // correctly, as it is destroyed after the last worker dies. |
| 56 DCHECK_GT(workers_.size(), 0u); | 51 DCHECK_GT(workers_.size(), 0u); |
| 57 } | 52 } |
| 58 | 53 |
| 59 void SyncBackendRegistrar::RegisterNonBlockingType(ModelType type) { | 54 void SyncBackendRegistrar::RegisterNonBlockingType(ModelType type) { |
| 60 DCHECK(ui_thread_->BelongsToCurrentThread()); | 55 DCHECK(ui_thread_->BelongsToCurrentThread()); |
| 61 base::AutoLock lock(lock_); | 56 base::AutoLock lock(lock_); |
| 62 // There may have been a previously successful sync of a type when passive, | 57 // There may have been a previously successful sync of a type when passive, |
| 63 // which is now NonBlocking. We're not sure what order these two sets of types | 58 // which is now NonBlocking. We're not sure what order these two sets of types |
| 64 // are being registered in, so guard against SetInitialTypes(...) having been | 59 // are being registered in, so guard against SetInitialTypes(...) having been |
| 65 // already called by undoing everything to these types. | 60 // already called by undoing everything to these types. |
| 66 if (routing_info_.find(type) != routing_info_.end() && | 61 if (routing_info_.find(type) != routing_info_.end() && |
| 67 routing_info_[type] != syncer::GROUP_NON_BLOCKING) { | 62 routing_info_[type] != GROUP_NON_BLOCKING) { |
| 68 routing_info_.erase(type); | 63 routing_info_.erase(type); |
| 69 last_configured_types_.Remove(type); | 64 last_configured_types_.Remove(type); |
| 70 } | 65 } |
| 71 non_blocking_types_.Put(type); | 66 non_blocking_types_.Put(type); |
| 72 } | 67 } |
| 73 | 68 |
| 74 void SyncBackendRegistrar::SetInitialTypes(ModelTypeSet initial_types) { | 69 void SyncBackendRegistrar::SetInitialTypes(ModelTypeSet initial_types) { |
| 75 base::AutoLock lock(lock_); | 70 base::AutoLock lock(lock_); |
| 76 | 71 |
| 77 // This function should be called only once, shortly after construction. The | 72 // This function should be called only once, shortly after construction. The |
| 78 // routing info at that point is expected to be empty. | 73 // routing info at that point is expected to be empty. |
| 79 DCHECK(routing_info_.empty()); | 74 DCHECK(routing_info_.empty()); |
| 80 | 75 |
| 81 // Set our initial state to reflect the current status of the sync directory. | 76 // Set our initial state to reflect the current status of the sync directory. |
| 82 // This will ensure that our calculations in ConfigureDataTypes() will always | 77 // This will ensure that our calculations in ConfigureDataTypes() will always |
| 83 // return correct results. | 78 // return correct results. |
| 84 for (ModelTypeSet::Iterator it = initial_types.First(); it.Good(); it.Inc()) { | 79 for (ModelTypeSet::Iterator it = initial_types.First(); it.Good(); it.Inc()) { |
| 85 // If this type is also registered as NonBlocking, assume that it shouldn't | 80 // If this type is also registered as NonBlocking, assume that it shouldn't |
| 86 // be registered as passive. The NonBlocking path will eventually take care | 81 // be registered as passive. The NonBlocking path will eventually take care |
| 87 // of adding to routing_info_ later on. | 82 // of adding to routing_info_ later on. |
| 88 if (!non_blocking_types_.Has(it.Get())) { | 83 if (!non_blocking_types_.Has(it.Get())) { |
| 89 routing_info_[it.Get()] = syncer::GROUP_PASSIVE; | 84 routing_info_[it.Get()] = GROUP_PASSIVE; |
| 90 } | 85 } |
| 91 } | 86 } |
| 92 | 87 |
| 93 if (!workers_.count(syncer::GROUP_HISTORY)) { | 88 if (!workers_.count(GROUP_HISTORY)) { |
| 94 LOG_IF(WARNING, initial_types.Has(syncer::TYPED_URLS)) | 89 LOG_IF(WARNING, initial_types.Has(TYPED_URLS)) |
| 95 << "History store disabled, cannot sync Omnibox History"; | 90 << "History store disabled, cannot sync Omnibox History"; |
| 96 routing_info_.erase(syncer::TYPED_URLS); | 91 routing_info_.erase(TYPED_URLS); |
| 97 } | 92 } |
| 98 | 93 |
| 99 if (!workers_.count(syncer::GROUP_PASSWORD)) { | 94 if (!workers_.count(GROUP_PASSWORD)) { |
| 100 LOG_IF(WARNING, initial_types.Has(syncer::PASSWORDS)) | 95 LOG_IF(WARNING, initial_types.Has(PASSWORDS)) |
| 101 << "Password store not initialized, cannot sync passwords"; | 96 << "Password store not initialized, cannot sync passwords"; |
| 102 routing_info_.erase(syncer::PASSWORDS); | 97 routing_info_.erase(PASSWORDS); |
| 103 } | 98 } |
| 104 | 99 |
| 105 // Although this can re-set NonBlocking types, this should be idempotent. | 100 // Although this can re-set NonBlocking types, this should be idempotent. |
| 106 last_configured_types_ = syncer::GetRoutingInfoTypes(routing_info_); | 101 last_configured_types_ = GetRoutingInfoTypes(routing_info_); |
| 107 } | 102 } |
| 108 | 103 |
| 109 void SyncBackendRegistrar::AddRestoredNonBlockingType(ModelType type) { | 104 void SyncBackendRegistrar::AddRestoredNonBlockingType(ModelType type) { |
| 110 DCHECK(ui_thread_->BelongsToCurrentThread()); | 105 DCHECK(ui_thread_->BelongsToCurrentThread()); |
| 111 base::AutoLock lock(lock_); | 106 base::AutoLock lock(lock_); |
| 112 DCHECK(non_blocking_types_.Has(type)); | 107 DCHECK(non_blocking_types_.Has(type)); |
| 113 DCHECK(routing_info_.find(type) == routing_info_.end()); | 108 DCHECK(routing_info_.find(type) == routing_info_.end()); |
| 114 routing_info_[type] = syncer::GROUP_NON_BLOCKING; | 109 routing_info_[type] = GROUP_NON_BLOCKING; |
| 115 last_configured_types_.Put(type); | 110 last_configured_types_.Put(type); |
| 116 } | 111 } |
| 117 | 112 |
| 118 bool SyncBackendRegistrar::IsNigoriEnabled() const { | 113 bool SyncBackendRegistrar::IsNigoriEnabled() const { |
| 119 DCHECK(ui_thread_->BelongsToCurrentThread()); | 114 DCHECK(ui_thread_->BelongsToCurrentThread()); |
| 120 base::AutoLock lock(lock_); | 115 base::AutoLock lock(lock_); |
| 121 return routing_info_.find(syncer::NIGORI) != routing_info_.end(); | 116 return routing_info_.find(NIGORI) != routing_info_.end(); |
| 122 } | 117 } |
| 123 | 118 |
| 124 ModelTypeSet SyncBackendRegistrar::ConfigureDataTypes( | 119 ModelTypeSet SyncBackendRegistrar::ConfigureDataTypes( |
| 125 ModelTypeSet types_to_add, | 120 ModelTypeSet types_to_add, |
| 126 ModelTypeSet types_to_remove) { | 121 ModelTypeSet types_to_remove) { |
| 127 DCHECK(Intersection(types_to_add, types_to_remove).Empty()); | 122 DCHECK(Intersection(types_to_add, types_to_remove).Empty()); |
| 128 ModelTypeSet filtered_types_to_add = types_to_add; | 123 ModelTypeSet filtered_types_to_add = types_to_add; |
| 129 if (workers_.count(syncer::GROUP_HISTORY) == 0) { | 124 if (workers_.count(GROUP_HISTORY) == 0) { |
| 130 LOG(WARNING) << "No history worker -- removing TYPED_URLS"; | 125 LOG(WARNING) << "No history worker -- removing TYPED_URLS"; |
| 131 filtered_types_to_add.Remove(syncer::TYPED_URLS); | 126 filtered_types_to_add.Remove(TYPED_URLS); |
| 132 } | 127 } |
| 133 if (workers_.count(syncer::GROUP_PASSWORD) == 0) { | 128 if (workers_.count(GROUP_PASSWORD) == 0) { |
| 134 LOG(WARNING) << "No password worker -- removing PASSWORDS"; | 129 LOG(WARNING) << "No password worker -- removing PASSWORDS"; |
| 135 filtered_types_to_add.Remove(syncer::PASSWORDS); | 130 filtered_types_to_add.Remove(PASSWORDS); |
| 136 } | 131 } |
| 137 | 132 |
| 138 base::AutoLock lock(lock_); | 133 base::AutoLock lock(lock_); |
| 139 ModelTypeSet newly_added_types; | 134 ModelTypeSet newly_added_types; |
| 140 for (ModelTypeSet::Iterator it = filtered_types_to_add.First(); it.Good(); | 135 for (ModelTypeSet::Iterator it = filtered_types_to_add.First(); it.Good(); |
| 141 it.Inc()) { | 136 it.Inc()) { |
| 142 // Add a newly specified data type corresponding initial group into the | 137 // Add a newly specified data type corresponding initial group into the |
| 143 // routing_info, if it does not already exist. | 138 // routing_info, if it does not already exist. |
| 144 if (routing_info_.count(it.Get()) == 0) { | 139 if (routing_info_.count(it.Get()) == 0) { |
| 145 routing_info_[it.Get()] = GetInitialGroupForType(it.Get()); | 140 routing_info_[it.Get()] = GetInitialGroupForType(it.Get()); |
| 146 newly_added_types.Put(it.Get()); | 141 newly_added_types.Put(it.Get()); |
| 147 } | 142 } |
| 148 } | 143 } |
| 149 for (ModelTypeSet::Iterator it = types_to_remove.First(); it.Good(); | 144 for (ModelTypeSet::Iterator it = types_to_remove.First(); it.Good(); |
| 150 it.Inc()) { | 145 it.Inc()) { |
| 151 routing_info_.erase(it.Get()); | 146 routing_info_.erase(it.Get()); |
| 152 } | 147 } |
| 153 | 148 |
| 154 // TODO(akalin): Use SVLOG/SLOG if we add any more logging. | 149 // TODO(akalin): Use SVLOG/SLOG if we add any more logging. |
| 155 DVLOG(1) << name_ << ": Adding types " << ModelTypeSetToString(types_to_add) | 150 DVLOG(1) << name_ << ": Adding types " << ModelTypeSetToString(types_to_add) |
| 156 << " (with newly-added types " | 151 << " (with newly-added types " |
| 157 << ModelTypeSetToString(newly_added_types) << ") and removing types " | 152 << ModelTypeSetToString(newly_added_types) << ") and removing types " |
| 158 << ModelTypeSetToString(types_to_remove) | 153 << ModelTypeSetToString(types_to_remove) |
| 159 << " to get new routing info " | 154 << " to get new routing info " |
| 160 << ModelSafeRoutingInfoToString(routing_info_); | 155 << ModelSafeRoutingInfoToString(routing_info_); |
| 161 last_configured_types_ = syncer::GetRoutingInfoTypes(routing_info_); | 156 last_configured_types_ = GetRoutingInfoTypes(routing_info_); |
| 162 | 157 |
| 163 return newly_added_types; | 158 return newly_added_types; |
| 164 } | 159 } |
| 165 | 160 |
| 166 ModelTypeSet SyncBackendRegistrar::GetLastConfiguredTypes() const { | 161 ModelTypeSet SyncBackendRegistrar::GetLastConfiguredTypes() const { |
| 167 return last_configured_types_; | 162 return last_configured_types_; |
| 168 } | 163 } |
| 169 | 164 |
| 170 void SyncBackendRegistrar::RequestWorkerStopOnUIThread() { | 165 void SyncBackendRegistrar::RequestWorkerStopOnUIThread() { |
| 171 DCHECK(ui_thread_->BelongsToCurrentThread()); | 166 DCHECK(ui_thread_->BelongsToCurrentThread()); |
| 172 base::AutoLock lock(lock_); | 167 base::AutoLock lock(lock_); |
| 173 for (WorkerMap::const_iterator it = workers_.begin(); it != workers_.end(); | 168 for (WorkerMap::const_iterator it = workers_.begin(); it != workers_.end(); |
| 174 ++it) { | 169 ++it) { |
| 175 it->second->RequestStop(); | 170 it->second->RequestStop(); |
| 176 } | 171 } |
| 177 } | 172 } |
| 178 | 173 |
| 179 void SyncBackendRegistrar::ActivateDataType( | 174 void SyncBackendRegistrar::ActivateDataType(ModelType type, |
| 180 ModelType type, | 175 ModelSafeGroup group, |
| 181 ModelSafeGroup group, | 176 ChangeProcessor* change_processor, |
| 182 sync_driver::ChangeProcessor* change_processor, | 177 UserShare* user_share) { |
| 183 syncer::UserShare* user_share) { | |
| 184 DVLOG(1) << "Activate: " << ModelTypeToString(type); | 178 DVLOG(1) << "Activate: " << ModelTypeToString(type); |
| 185 | 179 |
| 186 base::AutoLock lock(lock_); | 180 base::AutoLock lock(lock_); |
| 187 // Ensure that the given data type is in the PASSIVE group. | 181 // Ensure that the given data type is in the PASSIVE group. |
| 188 ModelSafeRoutingInfo::iterator i = routing_info_.find(type); | 182 ModelSafeRoutingInfo::iterator i = routing_info_.find(type); |
| 189 DCHECK(i != routing_info_.end()); | 183 DCHECK(i != routing_info_.end()); |
| 190 DCHECK_EQ(i->second, syncer::GROUP_PASSIVE); | 184 DCHECK_EQ(i->second, GROUP_PASSIVE); |
| 191 routing_info_[type] = group; | 185 routing_info_[type] = group; |
| 192 | 186 |
| 193 // Add the data type's change processor to the list of change | 187 // Add the data type's change processor to the list of change |
| 194 // processors so it can receive updates. | 188 // processors so it can receive updates. |
| 195 DCHECK_EQ(processors_.count(type), 0U); | 189 DCHECK_EQ(processors_.count(type), 0U); |
| 196 processors_[type] = change_processor; | 190 processors_[type] = change_processor; |
| 197 | 191 |
| 198 // Start the change processor. | 192 // Start the change processor. |
| 199 change_processor->Start(user_share); | 193 change_processor->Start(user_share); |
| 200 DCHECK(GetProcessorUnsafe(type)); | 194 DCHECK(GetProcessorUnsafe(type)); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 211 DCHECK(!GetProcessorUnsafe(type)); | 205 DCHECK(!GetProcessorUnsafe(type)); |
| 212 } | 206 } |
| 213 | 207 |
| 214 bool SyncBackendRegistrar::IsTypeActivatedForTest(ModelType type) const { | 208 bool SyncBackendRegistrar::IsTypeActivatedForTest(ModelType type) const { |
| 215 return GetProcessor(type) != NULL; | 209 return GetProcessor(type) != NULL; |
| 216 } | 210 } |
| 217 | 211 |
| 218 void SyncBackendRegistrar::OnChangesApplied( | 212 void SyncBackendRegistrar::OnChangesApplied( |
| 219 ModelType model_type, | 213 ModelType model_type, |
| 220 int64_t model_version, | 214 int64_t model_version, |
| 221 const syncer::BaseTransaction* trans, | 215 const BaseTransaction* trans, |
| 222 const syncer::ImmutableChangeRecordList& changes) { | 216 const ImmutableChangeRecordList& changes) { |
| 223 sync_driver::ChangeProcessor* processor = GetProcessor(model_type); | 217 ChangeProcessor* processor = GetProcessor(model_type); |
| 224 if (!processor) | 218 if (!processor) |
| 225 return; | 219 return; |
| 226 | 220 |
| 227 processor->ApplyChangesFromSyncModel(trans, model_version, changes); | 221 processor->ApplyChangesFromSyncModel(trans, model_version, changes); |
| 228 } | 222 } |
| 229 | 223 |
| 230 void SyncBackendRegistrar::OnChangesComplete(ModelType model_type) { | 224 void SyncBackendRegistrar::OnChangesComplete(ModelType model_type) { |
| 231 sync_driver::ChangeProcessor* processor = GetProcessor(model_type); | 225 ChangeProcessor* processor = GetProcessor(model_type); |
| 232 if (!processor) | 226 if (!processor) |
| 233 return; | 227 return; |
| 234 | 228 |
| 235 // This call just notifies the processor that it can commit; it | 229 // This call just notifies the processor that it can commit; it |
| 236 // already buffered any changes it plans to makes so needs no | 230 // already buffered any changes it plans to makes so needs no |
| 237 // further information. | 231 // further information. |
| 238 processor->CommitChangesFromSyncModel(); | 232 processor->CommitChangesFromSyncModel(); |
| 239 } | 233 } |
| 240 | 234 |
| 241 void SyncBackendRegistrar::GetWorkers( | 235 void SyncBackendRegistrar::GetWorkers( |
| 242 std::vector<scoped_refptr<syncer::ModelSafeWorker>>* out) { | 236 std::vector<scoped_refptr<ModelSafeWorker>>* out) { |
| 243 base::AutoLock lock(lock_); | 237 base::AutoLock lock(lock_); |
| 244 out->clear(); | 238 out->clear(); |
| 245 for (WorkerMap::const_iterator it = workers_.begin(); it != workers_.end(); | 239 for (WorkerMap::const_iterator it = workers_.begin(); it != workers_.end(); |
| 246 ++it) { | 240 ++it) { |
| 247 out->push_back(it->second.get()); | 241 out->push_back(it->second.get()); |
| 248 } | 242 } |
| 249 } | 243 } |
| 250 | 244 |
| 251 void SyncBackendRegistrar::GetModelSafeRoutingInfo(ModelSafeRoutingInfo* out) { | 245 void SyncBackendRegistrar::GetModelSafeRoutingInfo(ModelSafeRoutingInfo* out) { |
| 252 base::AutoLock lock(lock_); | 246 base::AutoLock lock(lock_); |
| 253 ModelSafeRoutingInfo copy(routing_info_); | 247 ModelSafeRoutingInfo copy(routing_info_); |
| 254 out->swap(copy); | 248 out->swap(copy); |
| 255 } | 249 } |
| 256 | 250 |
| 257 sync_driver::ChangeProcessor* SyncBackendRegistrar::GetProcessor( | 251 ChangeProcessor* SyncBackendRegistrar::GetProcessor(ModelType type) const { |
| 258 ModelType type) const { | |
| 259 base::AutoLock lock(lock_); | 252 base::AutoLock lock(lock_); |
| 260 sync_driver::ChangeProcessor* processor = GetProcessorUnsafe(type); | 253 ChangeProcessor* processor = GetProcessorUnsafe(type); |
| 261 if (!processor) | 254 if (!processor) |
| 262 return NULL; | 255 return NULL; |
| 263 | 256 |
| 264 // We can only check if |processor| exists, as otherwise the type is | 257 // We can only check if |processor| exists, as otherwise the type is |
| 265 // mapped to syncer::GROUP_PASSIVE. | 258 // mapped to GROUP_PASSIVE. |
| 266 CHECK(IsCurrentThreadSafeForModel(type)); | 259 CHECK(IsCurrentThreadSafeForModel(type)); |
| 267 return processor; | 260 return processor; |
| 268 } | 261 } |
| 269 | 262 |
| 270 sync_driver::ChangeProcessor* SyncBackendRegistrar::GetProcessorUnsafe( | 263 ChangeProcessor* SyncBackendRegistrar::GetProcessorUnsafe( |
| 271 ModelType type) const { | 264 ModelType type) const { |
| 272 lock_.AssertAcquired(); | 265 lock_.AssertAcquired(); |
| 273 std::map<ModelType, sync_driver::ChangeProcessor*>::const_iterator it = | 266 std::map<ModelType, ChangeProcessor*>::const_iterator it = |
| 274 processors_.find(type); | 267 processors_.find(type); |
| 275 | 268 |
| 276 // Until model association happens for a datatype, it will not | 269 // Until model association happens for a datatype, it will not |
| 277 // appear in the processors list. During this time, it is OK to | 270 // appear in the processors list. During this time, it is OK to |
| 278 // drop changes on the floor (since model association has not | 271 // drop changes on the floor (since model association has not |
| 279 // happened yet). When the data type is activated, model | 272 // happened yet). When the data type is activated, model |
| 280 // association takes place then the change processor is added to the | 273 // association takes place then the change processor is added to the |
| 281 // |processors_| list. | 274 // |processors_| list. |
| 282 if (it == processors_.end()) | 275 if (it == processors_.end()) |
| 283 return NULL; | 276 return NULL; |
| 284 | 277 |
| 285 return it->second; | 278 return it->second; |
| 286 } | 279 } |
| 287 | 280 |
| 288 bool SyncBackendRegistrar::IsCurrentThreadSafeForModel( | 281 bool SyncBackendRegistrar::IsCurrentThreadSafeForModel( |
| 289 ModelType model_type) const { | 282 ModelType model_type) const { |
| 290 lock_.AssertAcquired(); | 283 lock_.AssertAcquired(); |
| 291 return IsOnThreadForGroup(model_type, | 284 return IsOnThreadForGroup(model_type, |
| 292 GetGroupForModelType(model_type, routing_info_)); | 285 GetGroupForModelType(model_type, routing_info_)); |
| 293 } | 286 } |
| 294 | 287 |
| 295 bool SyncBackendRegistrar::IsOnThreadForGroup(ModelType type, | 288 bool SyncBackendRegistrar::IsOnThreadForGroup(ModelType type, |
| 296 ModelSafeGroup group) const { | 289 ModelSafeGroup group) const { |
| 297 switch (group) { | 290 switch (group) { |
| 298 case syncer::GROUP_PASSIVE: | 291 case GROUP_PASSIVE: |
| 299 return IsControlType(type); | 292 return IsControlType(type); |
| 300 case syncer::GROUP_UI: | 293 case GROUP_UI: |
| 301 return ui_thread_->BelongsToCurrentThread(); | 294 return ui_thread_->BelongsToCurrentThread(); |
| 302 case syncer::GROUP_DB: | 295 case GROUP_DB: |
| 303 return db_thread_->BelongsToCurrentThread(); | 296 return db_thread_->BelongsToCurrentThread(); |
| 304 case syncer::GROUP_FILE: | 297 case GROUP_FILE: |
| 305 return file_thread_->BelongsToCurrentThread(); | 298 return file_thread_->BelongsToCurrentThread(); |
| 306 case syncer::GROUP_HISTORY: | 299 case GROUP_HISTORY: |
| 307 // TODO(sync): How to check we're on the right thread? | 300 // TODO(sync): How to check we're on the right thread? |
| 308 return type == syncer::TYPED_URLS; | 301 return type == TYPED_URLS; |
| 309 case syncer::GROUP_PASSWORD: | 302 case GROUP_PASSWORD: |
| 310 // TODO(sync): How to check we're on the right thread? | 303 // TODO(sync): How to check we're on the right thread? |
| 311 return type == syncer::PASSWORDS; | 304 return type == PASSWORDS; |
| 312 case syncer::GROUP_NON_BLOCKING: | 305 case GROUP_NON_BLOCKING: |
| 313 // IsOnThreadForGroup shouldn't be called for non-blocking types. | 306 // IsOnThreadForGroup shouldn't be called for non-blocking types. |
| 314 return false; | 307 return false; |
| 315 } | 308 } |
| 316 NOTREACHED(); | 309 NOTREACHED(); |
| 317 return false; | 310 return false; |
| 318 } | 311 } |
| 319 | 312 |
| 320 SyncBackendRegistrar::~SyncBackendRegistrar() { | 313 SyncBackendRegistrar::~SyncBackendRegistrar() { |
| 321 DCHECK(workers_.empty()); | 314 DCHECK(workers_.empty()); |
| 322 } | 315 } |
| 323 | 316 |
| 324 void SyncBackendRegistrar::OnWorkerLoopDestroyed(ModelSafeGroup group) { | 317 void SyncBackendRegistrar::OnWorkerLoopDestroyed(ModelSafeGroup group) { |
| 325 RemoveWorker(group); | 318 RemoveWorker(group); |
| 326 } | 319 } |
| 327 | 320 |
| 328 void SyncBackendRegistrar::MaybeAddWorker(ModelSafeGroup group) { | 321 void SyncBackendRegistrar::MaybeAddWorker(ModelSafeGroup group) { |
| 329 const scoped_refptr<syncer::ModelSafeWorker> worker = | 322 const scoped_refptr<ModelSafeWorker> worker = |
| 330 sync_client_->CreateModelWorkerForGroup(group, this); | 323 sync_client_->CreateModelWorkerForGroup(group, this); |
| 331 if (worker) { | 324 if (worker) { |
| 332 DCHECK(workers_.find(group) == workers_.end()); | 325 DCHECK(workers_.find(group) == workers_.end()); |
| 333 workers_[group] = worker; | 326 workers_[group] = worker; |
| 334 workers_[group]->RegisterForLoopDestruction(); | 327 workers_[group]->RegisterForLoopDestruction(); |
| 335 } | 328 } |
| 336 } | 329 } |
| 337 | 330 |
| 338 void SyncBackendRegistrar::OnWorkerUnregistrationDone(ModelSafeGroup group) { | 331 void SyncBackendRegistrar::OnWorkerUnregistrationDone(ModelSafeGroup group) { |
| 339 RemoveWorker(group); | 332 RemoveWorker(group); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 376 base::Unretained(this))); | 369 base::Unretained(this))); |
| 377 } | 370 } |
| 378 } | 371 } |
| 379 | 372 |
| 380 base::Thread* SyncBackendRegistrar::sync_thread() { | 373 base::Thread* SyncBackendRegistrar::sync_thread() { |
| 381 return sync_thread_.get(); | 374 return sync_thread_.get(); |
| 382 } | 375 } |
| 383 | 376 |
| 384 ModelSafeGroup SyncBackendRegistrar::GetInitialGroupForType( | 377 ModelSafeGroup SyncBackendRegistrar::GetInitialGroupForType( |
| 385 ModelType type) const { | 378 ModelType type) const { |
| 386 return non_blocking_types_.Has(type) ? syncer::GROUP_NON_BLOCKING | 379 return non_blocking_types_.Has(type) ? GROUP_NON_BLOCKING : GROUP_PASSIVE; |
| 387 : syncer::GROUP_PASSIVE; | |
| 388 } | 380 } |
| 389 | 381 |
| 390 } // namespace browser_sync | 382 } // namespace syncer |
| OLD | NEW |