Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "build/build_config.h" | 5 #include "build/build_config.h" |
| 6 | 6 |
| 7 #include "chrome/browser/sync/glue/sync_backend_host.h" | 7 #include "chrome/browser/sync/glue/sync_backend_host.h" |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <map> | 10 #include <map> |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 210 registrar_->StopOnUIThread(); | 210 registrar_->StopOnUIThread(); |
| 211 } else { | 211 } else { |
| 212 // If the sync thread isn't running, then the syncer is effectively | 212 // If the sync thread isn't running, then the syncer is effectively |
| 213 // stopped. Moreover, it implies that we never attempted initialization, | 213 // stopped. Moreover, it implies that we never attempted initialization, |
| 214 // so the registrar won't need stopping either. | 214 // so the registrar won't need stopping either. |
| 215 DCHECK_EQ(NOT_ATTEMPTED, initialization_state_); | 215 DCHECK_EQ(NOT_ATTEMPTED, initialization_state_); |
| 216 DCHECK(!registrar_.get()); | 216 DCHECK(!registrar_.get()); |
| 217 } | 217 } |
| 218 } | 218 } |
| 219 | 219 |
| 220 void SyncBackendHost::Shutdown(bool sync_disabled) { | 220 void SyncBackendHost::Shutdown(bool delete_stale_data) { |
| 221 // TODO(tim): DCHECK(registrar_->StoppedOnUIThread()) would be nice. | 221 // TODO(tim): DCHECK(registrar_->StoppedOnUIThread()) would be nice. |
| 222 if (sync_thread_.IsRunning()) { | 222 if (sync_thread_.IsRunning()) { |
| 223 sync_thread_.message_loop()->PostTask(FROM_HERE, | 223 sync_thread_.message_loop()->PostTask(FROM_HERE, |
| 224 base::Bind(&SyncBackendHost::Core::DoShutdown, core_.get(), | 224 base::Bind(&SyncBackendHost::Core::DoShutdown, core_.get(), |
| 225 sync_disabled)); | 225 delete_stale_data)); |
| 226 } | 226 } |
| 227 | 227 |
| 228 // Stop will return once the thread exits, which will be after DoShutdown | 228 // Stop will return once the thread exits, which will be after DoShutdown |
| 229 // runs. DoShutdown needs to run from sync_thread_ because the sync backend | 229 // runs. DoShutdown needs to run from sync_thread_ because the sync backend |
| 230 // requires any thread that opened sqlite handles to relinquish them | 230 // requires any thread that opened sqlite handles to relinquish them |
| 231 // personally. We need to join threads, because otherwise the main Chrome | 231 // personally. We need to join threads, because otherwise the main Chrome |
| 232 // thread (ui loop) can exit before DoShutdown finishes, at which point | 232 // thread (ui loop) can exit before DoShutdown finishes, at which point |
| 233 // virtually anything the sync backend does (or the post-back to | 233 // virtually anything the sync backend does (or the post-back to |
| 234 // frontend_loop_ by our Core) will epically fail because the CRT won't be | 234 // frontend_loop_ by our Core) will epically fail because the CRT won't be |
| 235 // initialized. | 235 // initialized. |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 413 | 413 |
| 414 void SyncBackendHost::Core::OnInitializationComplete( | 414 void SyncBackendHost::Core::OnInitializationComplete( |
| 415 const WeakHandle<JsBackend>& js_backend, | 415 const WeakHandle<JsBackend>& js_backend, |
| 416 bool success) { | 416 bool success) { |
| 417 DCHECK_EQ(MessageLoop::current(), sync_loop_); | 417 DCHECK_EQ(MessageLoop::current(), sync_loop_); |
| 418 | 418 |
| 419 host_->frontend_loop_->PostTask(FROM_HERE, | 419 host_->frontend_loop_->PostTask(FROM_HERE, |
| 420 base::Bind(&Core::HandleInitializationCompletedOnFrontendLoop, this, | 420 base::Bind(&Core::HandleInitializationCompletedOnFrontendLoop, this, |
| 421 js_backend, success)); | 421 js_backend, success)); |
| 422 | 422 |
| 423 // Initialization is complete, so we can schedule recurring SaveChanges. | 423 if (success) { |
| 424 sync_loop_->PostTask(FROM_HERE, base::Bind(&Core::StartSavingChanges, this)); | 424 // Initialization is complete, so we can schedule recurring SaveChanges. |
| 425 sync_loop_->PostTask(FROM_HERE, | |
| 426 base::Bind(&Core::StartSavingChanges, this)); | |
| 427 } | |
| 425 } | 428 } |
| 426 | 429 |
| 427 void SyncBackendHost::Core::OnAuthError(const AuthError& auth_error) { | 430 void SyncBackendHost::Core::OnAuthError(const AuthError& auth_error) { |
| 428 if (!sync_loop_) | 431 if (!sync_loop_) |
| 429 return; | 432 return; |
| 430 DCHECK_EQ(MessageLoop::current(), sync_loop_); | 433 DCHECK_EQ(MessageLoop::current(), sync_loop_); |
| 431 // Post to our core loop so we can modify state. Could be on another thread. | 434 // Post to our core loop so we can modify state. Could be on another thread. |
| 432 host_->frontend_loop_->PostTask(FROM_HERE, | 435 host_->frontend_loop_->PostTask(FROM_HERE, |
| 433 base::Bind(&Core::HandleAuthErrorEventOnFrontendLoop, this, auth_error)); | 436 base::Bind(&Core::HandleAuthErrorEventOnFrontendLoop, this, auth_error)); |
| 434 } | 437 } |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 601 options.service_url.EffectiveIntPort(), | 604 options.service_url.EffectiveIntPort(), |
| 602 options.service_url.SchemeIsSecure(), | 605 options.service_url.SchemeIsSecure(), |
| 603 host_->MakeHttpBridgeFactory(options.request_context_getter), | 606 host_->MakeHttpBridgeFactory(options.request_context_getter), |
| 604 options.registrar /* as ModelSafeWorkerRegistrar */, | 607 options.registrar /* as ModelSafeWorkerRegistrar */, |
| 605 options.registrar /* as SyncManager::ChangeDelegate */, | 608 options.registrar /* as SyncManager::ChangeDelegate */, |
| 606 MakeUserAgentForSyncApi(), | 609 MakeUserAgentForSyncApi(), |
| 607 options.credentials, | 610 options.credentials, |
| 608 host_->sync_notifier_factory_.CreateSyncNotifier(), | 611 host_->sync_notifier_factory_.CreateSyncNotifier(), |
| 609 options.restored_key_for_bootstrapping, | 612 options.restored_key_for_bootstrapping, |
| 610 options.setup_for_test_mode); | 613 options.setup_for_test_mode); |
| 611 DCHECK(success) << "Syncapi initialization failed!"; | |
|
Nicolas Zea
2011/11/08 22:12:18
LOG_IF(ERROR, !success) would still be useful I th
rlarocque
2011/11/11 22:24:56
Done.
| |
| 612 } | 614 } |
| 613 | 615 |
| 614 void SyncBackendHost::Core::DoCheckServerReachable() { | 616 void SyncBackendHost::Core::DoCheckServerReachable() { |
| 615 DCHECK_EQ(MessageLoop::current(), sync_loop_); | 617 DCHECK_EQ(MessageLoop::current(), sync_loop_); |
| 616 sync_manager_->CheckServerReachable(); | 618 sync_manager_->CheckServerReachable(); |
| 617 } | 619 } |
| 618 | 620 |
| 619 void SyncBackendHost::Core::DoUpdateCredentials( | 621 void SyncBackendHost::Core::DoUpdateCredentials( |
| 620 const SyncCredentials& credentials) { | 622 const SyncCredentials& credentials) { |
| 621 DCHECK_EQ(MessageLoop::current(), sync_loop_); | 623 DCHECK_EQ(MessageLoop::current(), sync_loop_); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 659 sync_manager_->RefreshEncryption(); | 661 sync_manager_->RefreshEncryption(); |
| 660 done_callback.Run(); | 662 done_callback.Run(); |
| 661 } | 663 } |
| 662 | 664 |
| 663 void SyncBackendHost::Core::DoStopSyncManagerForShutdown( | 665 void SyncBackendHost::Core::DoStopSyncManagerForShutdown( |
| 664 const base::Closure& closure) { | 666 const base::Closure& closure) { |
| 665 DCHECK(sync_manager_.get()); | 667 DCHECK(sync_manager_.get()); |
| 666 sync_manager_->StopSyncingForShutdown(closure); | 668 sync_manager_->StopSyncingForShutdown(closure); |
| 667 } | 669 } |
| 668 | 670 |
| 669 void SyncBackendHost::Core::DoShutdown(bool sync_disabled) { | 671 void SyncBackendHost::Core::DoShutdown(bool delete_stale_data) { |
| 670 DCHECK_EQ(MessageLoop::current(), sync_loop_); | 672 DCHECK_EQ(MessageLoop::current(), sync_loop_); |
| 671 if (!sync_manager_.get()) | 673 if (!sync_manager_.get()) |
| 672 return; | 674 return; |
| 673 | 675 |
| 674 save_changes_timer_.Stop(); | 676 save_changes_timer_.Stop(); |
| 675 sync_manager_->ShutdownOnSyncThread(); | 677 sync_manager_->ShutdownOnSyncThread(); |
| 676 sync_manager_->RemoveObserver(this); | 678 sync_manager_->RemoveObserver(this); |
| 677 sync_manager_.reset(); | 679 sync_manager_.reset(); |
| 678 registrar_ = NULL; | 680 registrar_ = NULL; |
| 679 | 681 |
| 680 if (sync_disabled) | 682 if (delete_stale_data) |
| 681 DeleteSyncDataFolder(); | 683 DeleteSyncDataFolder(); |
| 682 | 684 |
| 683 sync_loop_ = NULL; | 685 sync_loop_ = NULL; |
| 684 | 686 |
| 685 host_ = NULL; | 687 host_ = NULL; |
| 686 } | 688 } |
| 687 | 689 |
| 688 void SyncBackendHost::Core::DoRequestConfig( | 690 void SyncBackendHost::Core::DoRequestConfig( |
| 689 const syncable::ModelTypeBitSet& types_to_config, | 691 const syncable::ModelTypeBitSet& types_to_config, |
| 690 sync_api::ConfigureReason reason) { | 692 sync_api::ConfigureReason reason) { |
| (...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1045 FROM_HERE, | 1047 FROM_HERE, |
| 1046 base::Bind(&SyncBackendHost::Core::DoRefreshEncryption, | 1048 base::Bind(&SyncBackendHost::Core::DoRefreshEncryption, |
| 1047 core_.get(), sync_thread_done_callback)); | 1049 core_.get(), sync_thread_done_callback)); |
| 1048 } | 1050 } |
| 1049 | 1051 |
| 1050 #undef SVLOG | 1052 #undef SVLOG |
| 1051 | 1053 |
| 1052 #undef SLOG | 1054 #undef SLOG |
| 1053 | 1055 |
| 1054 } // namespace browser_sync | 1056 } // namespace browser_sync |
| OLD | NEW |