diff options
author | rlarocque@chromium.org <rlarocque@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-10 00:39:48 +0000 |
---|---|---|
committer | rlarocque@chromium.org <rlarocque@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-10 00:39:48 +0000 |
commit | 33c1f53914a7a15b51cb226f572f5439e8ef9249 (patch) | |
tree | 553286bc9bc1966e753bbc6e1f703fbaab96f886 /sync/internal_api/syncapi_server_connection_manager.h | |
parent | 98f936181964f99cd0c73707cfd9027d0c528702 (diff) | |
download | chromium_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/syncapi_server_connection_manager.h')
-rw-r--r-- | sync/internal_api/syncapi_server_connection_manager.h | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/sync/internal_api/syncapi_server_connection_manager.h b/sync/internal_api/syncapi_server_connection_manager.h index 74312b3..8ce8dbb 100644 --- a/sync/internal_api/syncapi_server_connection_manager.h +++ b/sync/internal_api/syncapi_server_connection_manager.h @@ -12,9 +12,11 @@ #include "base/memory/scoped_ptr.h" #include "sync/base/sync_export.h" #include "sync/engine/net/server_connection_manager.h" +#include "sync/internal_api/public/base/cancelation_signal.h" namespace syncer { +class ConnectionDisconnectHandle; class HttpPostProviderFactory; class HttpPostProviderInterface; @@ -55,13 +57,16 @@ class SYNC_EXPORT_PRIVATE SyncAPIServerConnectionManager int port, bool use_ssl, bool use_oauth2_token, - HttpPostProviderFactory* factory); + HttpPostProviderFactory* factory, + CancelationSignal* cancelation_signal); virtual ~SyncAPIServerConnectionManager(); // ServerConnectionManager overrides. - virtual Connection* MakeConnection() OVERRIDE; + virtual scoped_ptr<Connection> MakeConnection() OVERRIDE; private: + FRIEND_TEST_ALL_PREFIXES( + SyncAPIServerConnectionManagerTest, VeryEarlyAbortPost); FRIEND_TEST_ALL_PREFIXES(SyncAPIServerConnectionManagerTest, EarlyAbortPost); FRIEND_TEST_ALL_PREFIXES(SyncAPIServerConnectionManagerTest, AbortPost); |