| Index: chrome/browser/sync/engine/syncapi.cc
|
| diff --git a/chrome/browser/sync/engine/syncapi.cc b/chrome/browser/sync/engine/syncapi.cc
|
| index ab0f43dd28a7f40060ba449561c98f51ea316d77..23cb43e3b338554d01b63a995e14a45dc2ebb98a 100644
|
| --- a/chrome/browser/sync/engine/syncapi.cc
|
| +++ b/chrome/browser/sync/engine/syncapi.cc
|
| @@ -26,7 +26,6 @@
|
| #include "base/sha1.h"
|
| #include "base/string_number_conversions.h"
|
| #include "base/string_util.h"
|
| -#include "base/synchronization/lock.h"
|
| #include "base/task.h"
|
| #include "base/time.h"
|
| #include "base/utf_string_conversions.h"
|
| @@ -1267,7 +1266,10 @@ class SyncManager::SyncInternal
|
| return connection_manager_.get();
|
| }
|
| SyncScheduler* scheduler() { return scheduler_.get(); }
|
| - UserShare* GetUserShare() { return &share_; }
|
| + UserShare* GetUserShare() {
|
| + DCHECK(initialized_);
|
| + return &share_;
|
| + }
|
|
|
| // Return the currently active (validated) username for use with syncable
|
| // types.
|
| @@ -1288,13 +1290,6 @@ class SyncManager::SyncInternal
|
| // See SyncManager::Shutdown for information.
|
| void Shutdown();
|
|
|
| - // Whether we're initialized to the point of being able to accept changes
|
| - // (and hence allow transaction creation). See initialized_ for details.
|
| - bool initialized() const {
|
| - base::AutoLock lock(initialized_mutex_);
|
| - return initialized_;
|
| - }
|
| -
|
| // If this is a deletion for a password, sets the legacy
|
| // ExtraPasswordChangeRecordData field of |buffer|. Otherwise sets
|
| // |buffer|'s specifics field to contain the unencrypted data.
|
| @@ -1408,11 +1403,6 @@ class SyncManager::SyncInternal
|
| // available.
|
| void RaiseAuthNeededEvent();
|
|
|
| - // Helper to set initialized_ to true and raise an event to clients to notify
|
| - // that initialization is complete and it is safe to send us changes. If
|
| - // already initialized, this is a no-op.
|
| - void MarkAndNotifyInitializationComplete();
|
| -
|
| // Determine if the parents or predecessors differ between the old and new
|
| // versions of an entry stored in |a| and |b|. Note that a node's index may
|
| // change without its NEXT_ID changing if the node at NEXT_ID also moved (but
|
| @@ -1588,15 +1578,8 @@ class SyncManager::SyncInternal
|
| // The instance is shared between the SyncManager and the Syncer.
|
| ModelSafeWorkerRegistrar* registrar_;
|
|
|
| - // Set to true once Init has been called, and we know of an
|
| - // authenticated valid) username either from a fresh authentication
|
| - // attempt (as in first-use case) or from a previous attempt stored
|
| - // in our UserSettings (as in the steady-state), and the
|
| - // syncable::Directory has been opened, meaning we are ready to
|
| - // accept changes. Protected by initialized_mutex_ as it can get
|
| - // read/set by both the SyncScheduler and the AuthWatcherThread.
|
| + // Set to true once Init has been called.
|
| bool initialized_;
|
| - mutable base::Lock initialized_mutex_;
|
|
|
| // True if the SyncManager should be running in test mode (no sync
|
| // scheduler actually communicating with the server).
|
| @@ -1748,6 +1731,7 @@ bool SyncManager::SyncInternal::Init(
|
| sync_notifier::SyncNotifier* sync_notifier,
|
| const std::string& restored_key_for_bootstrapping,
|
| bool setup_for_test_mode) {
|
| + CHECK(!initialized_);
|
|
|
| VLOG(1) << "Starting SyncInternal initialization.";
|
|
|
| @@ -1796,14 +1780,18 @@ bool SyncManager::SyncInternal::Init(
|
| browser_sync::SyncScheduler::CONFIGURATION_MODE, NULL);
|
| }
|
|
|
| - // Do this once the directory is opened.
|
| + initialized_ = true;
|
| +
|
| + // Notify that initialization is complete.
|
| + ObserverList<SyncManager::Observer> temp_obs_list;
|
| + CopyObservers(&temp_obs_list);
|
| + FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list,
|
| + OnInitializationComplete());
|
| +
|
| + // The following calls check that initialized_ is true.
|
| +
|
| BootstrapEncryption(restored_key_for_bootstrapping);
|
| - MarkAndNotifyInitializationComplete();
|
|
|
| - // Only listen to notification once we are completely initialized. This is
|
| - // necessary because calls to e.g. |SetState| or |UpdateCredentials| may
|
| - // trigger notifications, and those can be called before initialized_ is set
|
| - // to true.
|
| sync_notifier_->AddObserver(this);
|
|
|
| return signed_in;
|
| @@ -1821,6 +1809,7 @@ void SyncManager::SyncInternal::BootstrapEncryption(
|
| }
|
|
|
| bool SyncManager::SyncInternal::UpdateCryptographerFromNigori() {
|
| + DCHECK(initialized_);
|
| syncable::ScopedDirLookup lookup(dir_manager(), username_for_share());
|
| if (!lookup.good()) {
|
| NOTREACHED() << "BootstrapEncryption: lookup not good so bailing out";
|
| @@ -1857,28 +1846,8 @@ void SyncManager::SyncInternal::StartSyncingNormally() {
|
| scheduler()->Start(SyncScheduler::NORMAL_MODE, NULL);
|
| }
|
|
|
| -void SyncManager::SyncInternal::MarkAndNotifyInitializationComplete() {
|
| - // There is only one real time we need this mutex. If we get an auth
|
| - // success, and before the initial sync ends we get an auth failure. In this
|
| - // case we'll be listening to both the AuthWatcher and Syncer, and it's a race
|
| - // between their respective threads to call MarkAndNotify. We need to make
|
| - // sure the observer is notified once and only once.
|
| - {
|
| - base::AutoLock lock(initialized_mutex_);
|
| - if (initialized_)
|
| - return;
|
| - initialized_ = true;
|
| - }
|
| -
|
| - // Notify that initialization is complete.
|
| - ObserverList<SyncManager::Observer> temp_obs_list;
|
| - CopyObservers(&temp_obs_list);
|
| - FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list,
|
| - OnInitializationComplete());
|
| -}
|
| -
|
| bool SyncManager::SyncInternal::OpenDirectory() {
|
| - DCHECK(!initialized()) << "Should only happen once";
|
| + DCHECK(!initialized_) << "Should only happen once";
|
|
|
| bool share_opened = dir_manager()->Open(username_for_share());
|
| DCHECK(share_opened);
|
| @@ -2077,6 +2046,7 @@ bool SyncManager::SyncInternal::IsUsingExplicitPassphrase() {
|
|
|
| void SyncManager::SyncInternal::EncryptDataTypes(
|
| const syncable::ModelTypeSet& encrypted_types) {
|
| + DCHECK(initialized_);
|
| VLOG(1) << "Attempting to encrypt datatypes "
|
| << syncable::ModelTypeSetToString(encrypted_types);
|
|
|
| @@ -2564,7 +2534,7 @@ void SyncManager::SyncInternal::OnSyncEngineEvent(
|
| }
|
| }
|
|
|
| - if (!initialized()) {
|
| + if (!initialized_) {
|
| LOG(INFO) << "OnSyncCycleCompleted not sent because sync api is not "
|
| << "initialized";
|
| return;
|
| @@ -3000,12 +2970,10 @@ BaseTransaction::~BaseTransaction() {
|
| }
|
|
|
| UserShare* SyncManager::GetUserShare() const {
|
| - DCHECK(data_->initialized()) << "GetUserShare requires initialization!";
|
| return data_->GetUserShare();
|
| }
|
|
|
| void SyncManager::RefreshEncryption() {
|
| - DCHECK(data_->initialized());
|
| if (data_->UpdateCryptographerFromNigori())
|
| data_->EncryptDataTypes(syncable::ModelTypeSet());
|
| }
|
|
|