Chromium Code Reviews| Index: chrome/browser/sync/engine/syncapi.cc |
| diff --git a/chrome/browser/sync/engine/syncapi.cc b/chrome/browser/sync/engine/syncapi.cc |
| index ef3f5b43659ceff68594c5bb28996f9b732dd60e..d5775f9c14d3448c8fe3bd0987c602ef32804837 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" |
| @@ -1259,7 +1258,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. |
| @@ -1280,13 +1282,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. |
| @@ -1400,11 +1395,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(); |
| - |
| // Sends notifications to peers. |
| void SendNotification(); |
| @@ -1583,15 +1573,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). |
| @@ -1743,6 +1726,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."; |
| @@ -1792,9 +1776,15 @@ bool SyncManager::SyncInternal::Init( |
| browser_sync::SyncScheduler::CONFIGURATION_MODE, NULL); |
| } |
| + initialized_ = true; |
| + |
| // Do this once the directory is opened. |
| BootstrapEncryption(restored_key_for_bootstrapping); |
| - MarkAndNotifyInitializationComplete(); |
| + |
| + // Notify that initialization is complete. |
| + FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
| + OnInitializationComplete()); |
|
tim (not reviewing)
2011/06/10 01:53:20
So, in the reviews yesterday to make our observers
akalin
2011/06/14 17:10:25
The races occurred because the observer add/remove
akalin
2011/06/14 21:27:23
Oh, I see what you were saying. That was just a m
|
| + |
| return signed_in; |
| } |
| @@ -1854,26 +1844,6 @@ 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()); |
| -} |
| - |
| void SyncManager::SyncInternal::SendNotification() { |
| DCHECK_EQ(MessageLoop::current(), sync_loop_); |
| if (!sync_notifier_) { |
| @@ -1884,7 +1854,7 @@ void SyncManager::SyncInternal::SendNotification() { |
| } |
| 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); |
| @@ -2561,7 +2531,7 @@ void SyncManager::SyncInternal::OnSyncEngineEvent( |
| } |
| } |
| - if (!initialized()) { |
| + if (!initialized_) { |
| LOG(INFO) << "OnSyncCycleCompleted not sent because sync api is not " |
| << "initialized"; |
| return; |
| @@ -2998,7 +2968,6 @@ BaseTransaction::~BaseTransaction() { |
| } |
| UserShare* SyncManager::GetUserShare() const { |
| - DCHECK(data_->initialized()) << "GetUserShare requires initialization!"; |
| return data_->GetUserShare(); |
| } |