summaryrefslogtreecommitdiffstats
path: root/sync/internal_api/internal_components_factory_impl.cc
diff options
context:
space:
mode:
authorrlarocque@chromium.org <rlarocque@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-10 00:39:48 +0000
committerrlarocque@chromium.org <rlarocque@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-10 00:39:48 +0000
commit33c1f53914a7a15b51cb226f572f5439e8ef9249 (patch)
tree553286bc9bc1966e753bbc6e1f703fbaab96f886 /sync/internal_api/internal_components_factory_impl.cc
parent98f936181964f99cd0c73707cfd9027d0c528702 (diff)
downloadchromium_src-33c1f53914a7a15b51cb226f572f5439e8ef9249.zip
chromium_src-33c1f53914a7a15b51cb226f572f5439e8ef9249.tar.gz
chromium_src-33c1f53914a7a15b51cb226f572f5439e8ef9249.tar.bz2
sync: Gracefully handle very early shutdown
Introduce a new object to communicate cross-thread cancellation signals. This new object, the CancellationSignal, is protected by a lock. It allows the receiving thread to query whether or not a stop has been requested. It also allows the receiving thread to safely register a cross-thread callback to be invoked immediately when a stop is requested. This class is used to reimplement the UI thread to sync thread early shutdown signal. Previously, the UI thread would try to call in to objects owned by the sync thread. This required a workaround if the signal arrived very early, since we couldn't guarantee the sync thread had actually created those objects until later. The CancellationSignal is owned by the UI thread, so it is safe to call its RequestStop() at any point during sync initialization. The sync thread will receive the signal when it's ready. The new scheme has a few advantages over the old: - Thread ownership is simpler. The SyncBackendHost::Core, SyncManager, ServerConnectionManager, SyncScheduler and Syncer can now claim that all their member functions run on the sync thread. - We no longer need to implement special case logic for when a shutdown is requested before the SyncManager has initialized. - In a future CL, we can take advantage of the fact that we no longer require the special case to reduce inter-thread communication during sync startup. This will make startup simpler and, in some cases, improve sync startup time by as much as a few hundred milliseconds. - This will make it easier to address crbug.com/236451. BUG=236451 Review URL: https://chromiumcodereview.appspot.com/23189021 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@222154 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'sync/internal_api/internal_components_factory_impl.cc')
-rw-r--r--sync/internal_api/internal_components_factory_impl.cc11
1 files changed, 8 insertions, 3 deletions
diff --git a/sync/internal_api/internal_components_factory_impl.cc b/sync/internal_api/internal_components_factory_impl.cc
index d5fc102..6ccb143 100644
--- a/sync/internal_api/internal_components_factory_impl.cc
+++ b/sync/internal_api/internal_components_factory_impl.cc
@@ -21,15 +21,20 @@ InternalComponentsFactoryImpl::InternalComponentsFactoryImpl(
InternalComponentsFactoryImpl::~InternalComponentsFactoryImpl() { }
scoped_ptr<SyncScheduler> InternalComponentsFactoryImpl::BuildScheduler(
- const std::string& name, sessions::SyncSessionContext* context) {
+ const std::string& name,
+ sessions::SyncSessionContext* context,
+ CancelationSignal* cancelation_signal) {
scoped_ptr<BackoffDelayProvider> delay(BackoffDelayProvider::FromDefaults());
if (switches_.backoff_override == BACKOFF_SHORT_INITIAL_RETRY_OVERRIDE)
delay.reset(BackoffDelayProvider::WithShortInitialRetryOverride());
- return scoped_ptr<SyncScheduler>(
- new SyncSchedulerImpl(name, delay.release(), context, new Syncer()));
+ return scoped_ptr<SyncScheduler>(new SyncSchedulerImpl(
+ name,
+ delay.release(),
+ context,
+ new Syncer(cancelation_signal)));
}
scoped_ptr<sessions::SyncSessionContext>