diff options
Diffstat (limited to 'chrome/browser')
-rw-r--r-- | chrome/browser/sync/glue/sync_backend_host.cc | 41 | ||||
-rw-r--r-- | chrome/browser/sync/glue/sync_backend_host.h | 18 |
2 files changed, 21 insertions, 38 deletions
diff --git a/chrome/browser/sync/glue/sync_backend_host.cc b/chrome/browser/sync/glue/sync_backend_host.cc index 2f91728..3816312 100644 --- a/chrome/browser/sync/glue/sync_backend_host.cc +++ b/chrome/browser/sync/glue/sync_backend_host.cc @@ -198,11 +198,10 @@ class SyncBackendHost::Core void DoFinishInitialProcessControlTypes(); // The shutdown order is a bit complicated: - // 1) Call DoStopSyncManagerForShutdown() from |frontend_loop_| to request - // sync manager to stop as soon as possible. + // 1) Call the SyncManagerStopHandle's RequestStop() from |frontend_loop_| to + // request sync manager to stop as soon as possible. // 2) Post DoShutdown() to sync loop to clean up backend state, save // directory and destroy sync manager. - void DoStopSyncManagerForShutdown(); void DoShutdown(bool sync_disabled); void DoDestroySyncManager(); @@ -401,7 +400,8 @@ void SyncBackendHost::Initialize( new InternalComponentsFactoryImpl(factory_switches)).Pass(), unrecoverable_error_handler.Pass(), report_unrecoverable_error_function, - !cl->HasSwitch(switches::kSyncDisableOAuth2Token))); + !cl->HasSwitch(switches::kSyncDisableOAuth2Token), + &cancelation_signal_)); InitCore(init_opts.Pass()); } @@ -492,24 +492,9 @@ bool SyncBackendHost::SetDecryptionPassphrase(const std::string& passphrase) { return true; } -void SyncBackendHost::StopSyncManagerForShutdown() { - DCHECK_GT(initialization_state_, NOT_ATTEMPTED); - if (initialization_state_ == CREATING_SYNC_MANAGER) { - // We post here to implicitly wait for the SyncManager to be created, - // if needed. We have to wait, since we need to shutdown immediately, - // and we need to tell the SyncManager so it can abort any activity - // (net I/O, data application). - DCHECK(registrar_->sync_thread()->IsRunning()); - registrar_->sync_thread()->message_loop()->PostTask(FROM_HERE, - base::Bind(&SyncBackendHost::Core::DoStopSyncManagerForShutdown, - core_.get())); - } else { - core_->DoStopSyncManagerForShutdown(); - } -} - void SyncBackendHost::StopSyncingForShutdown() { DCHECK_EQ(base::MessageLoop::current(), frontend_loop_); + DCHECK_GT(initialization_state_, NOT_ATTEMPTED); // Immediately stop sending messages to the frontend. frontend_ = NULL; @@ -521,7 +506,7 @@ void SyncBackendHost::StopSyncingForShutdown() { registrar_->RequestWorkerStopOnUIThread(); - StopSyncManagerForShutdown(); + cancelation_signal_.RequestStop(); } scoped_ptr<base::Thread> SyncBackendHost::Shutdown(ShutdownOption option) { @@ -883,7 +868,8 @@ SyncBackendHost::DoInitializeOptions::DoInitializeOptions( scoped_ptr<syncer::UnrecoverableErrorHandler> unrecoverable_error_handler, syncer::ReportUnrecoverableErrorFunction report_unrecoverable_error_function, - bool use_oauth2_token) + bool use_oauth2_token, + syncer::CancelationSignal* const cancelation_signal) : sync_loop(sync_loop), registrar(registrar), routing_info(routing_info), @@ -903,7 +889,8 @@ SyncBackendHost::DoInitializeOptions::DoInitializeOptions( unrecoverable_error_handler(unrecoverable_error_handler.Pass()), report_unrecoverable_error_function( report_unrecoverable_error_function), - use_oauth2_token(use_oauth2_token) { + use_oauth2_token(use_oauth2_token), + cancelation_signal(cancelation_signal) { } SyncBackendHost::DoInitializeOptions::~DoInitializeOptions() {} @@ -1168,7 +1155,8 @@ void SyncBackendHost::Core::DoInitialize( &encryptor_, options->unrecoverable_error_handler.Pass(), options->report_unrecoverable_error_function, - options->use_oauth2_token); + options->use_oauth2_token, + options->cancelation_signal); // |sync_manager_| may end up being NULL here in tests (in // synchronous initialization mode). @@ -1278,11 +1266,6 @@ void SyncBackendHost::Core::DoEnableEncryptEverything() { sync_manager_->GetEncryptionHandler()->EnableEncryptEverything(); } -void SyncBackendHost::Core::DoStopSyncManagerForShutdown() { - if (sync_manager_) - sync_manager_->StopSyncingForShutdown(); -} - void SyncBackendHost::Core::DoShutdown(bool sync_disabled) { DCHECK_EQ(base::MessageLoop::current(), sync_loop_); // It's safe to do this even if the type was never activated. diff --git a/chrome/browser/sync/glue/sync_backend_host.h b/chrome/browser/sync/glue/sync_backend_host.h index 113ad42..05ed3fc 100644 --- a/chrome/browser/sync/glue/sync_backend_host.h +++ b/chrome/browser/sync/glue/sync_backend_host.h @@ -20,6 +20,7 @@ #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" #include "google_apis/gaia/google_service_auth_error.h" +#include "sync/internal_api/public/base/cancelation_signal.h" #include "sync/internal_api/public/base/model_type.h" #include "sync/internal_api/public/configure_reason.h" #include "sync/internal_api/public/engine/model_safe_worker.h" @@ -218,10 +219,9 @@ class SyncBackendHost bool SetDecryptionPassphrase(const std::string& passphrase) WARN_UNUSED_RESULT; - // Called on |frontend_loop_| to kick off shutdown procedure. After this, no - // further sync activity will occur with the sync server and no further - // change applications will occur from changes already downloaded. - // Furthermore, no notifications will be sent to any invalidation handler. + // Called on |frontend_loop_| to kick off shutdown procedure. Attempts to cut + // short any long-lived or blocking sync thread tasks so that the shutdown on + // sync thread task that we're about to post won't have to wait very long. virtual void StopSyncingForShutdown(); // Called on |frontend_loop_| to kick off shutdown. @@ -339,7 +339,8 @@ class SyncBackendHost unrecoverable_error_handler, syncer::ReportUnrecoverableErrorFunction report_unrecoverable_error_function, - bool use_oauth2_token); + bool use_oauth2_token, + syncer::CancelationSignal* cancelation_signal); ~DoInitializeOptions(); base::MessageLoop* sync_loop; @@ -363,6 +364,7 @@ class SyncBackendHost syncer::ReportUnrecoverableErrorFunction report_unrecoverable_error_function; bool use_oauth2_token; + syncer::CancelationSignal* const cancelation_signal; }; // Allows tests to perform alternate core initialization work. @@ -523,10 +525,6 @@ class SyncBackendHost virtual void OnIncomingInvalidation( const syncer::ObjectIdInvalidationMap& invalidation_map) OVERRIDE; - // Handles stopping the core's SyncManager, accounting for whether - // initialization is done yet. - void StopSyncManagerForShutdown(); - base::WeakPtrFactory<SyncBackendHost> weak_ptr_factory_; content::NotificationRegistrar notification_registrar_; @@ -589,6 +587,8 @@ class SyncBackendHost invalidation::InvalidationService* invalidator_; bool invalidation_handler_registered_; + syncer::CancelationSignal cancelation_signal_; + DISALLOW_COPY_AND_ASSIGN(SyncBackendHost); }; |