| Index: chrome/browser/sync/internal_api/sync_manager.cc
|
| diff --git a/chrome/browser/sync/internal_api/sync_manager.cc b/chrome/browser/sync/internal_api/sync_manager.cc
|
| index 319f7779f6d7730bae391e166254ed0509e56aaf..2edfaf457c0d278170a59396714a59063935e8ab 100644
|
| --- a/chrome/browser/sync/internal_api/sync_manager.cc
|
| +++ b/chrome/browser/sync/internal_api/sync_manager.cc
|
| @@ -12,7 +12,6 @@
|
| #include "base/json/json_writer.h"
|
| #include "base/memory/ref_counted.h"
|
| #include "base/observer_list.h"
|
| -#include "base/observer_list_threadsafe.h"
|
| #include "base/string_number_conversions.h"
|
| #include "base/values.h"
|
| #include "chrome/browser/sync/engine/all_status.h"
|
| @@ -131,8 +130,6 @@ class SyncManager::SyncInternal
|
| explicit SyncInternal(const std::string& name)
|
| : name_(name),
|
| weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
|
| - change_observers_(
|
| - new ObserverListThreadSafe<SyncManager::ChangeObserver>()),
|
| registrar_(NULL),
|
| change_delegate_(NULL),
|
| initialized_(false),
|
| @@ -277,9 +274,6 @@ class SyncManager::SyncInternal
|
|
|
| virtual void StoreState(const std::string& cookie) OVERRIDE;
|
|
|
| - void AddChangeObserver(SyncManager::ChangeObserver* observer);
|
| - void RemoveChangeObserver(SyncManager::ChangeObserver* observer);
|
| -
|
| void AddObserver(SyncManager::Observer* observer);
|
| void RemoveObserver(SyncManager::Observer* observer);
|
|
|
| @@ -495,11 +489,9 @@ class SyncManager::SyncInternal
|
| // constructing any transaction type.
|
| UserShare share_;
|
|
|
| - // Even though observers are always added/removed from the sync
|
| - // thread, we still need to use a thread-safe observer list as we
|
| - // can notify from any thread.
|
| - scoped_refptr<ObserverListThreadSafe<SyncManager::ChangeObserver> >
|
| - change_observers_;
|
| + // This can be called from any thread, but only between calls to
|
| + // OpenDirectory() and ShutdownOnSyncThread().
|
| + browser_sync::WeakHandle<SyncManager::ChangeObserver> change_observer_;
|
|
|
| ObserverList<SyncManager::Observer> observers_;
|
|
|
| @@ -893,7 +885,16 @@ void SyncManager::SyncInternal::StartSyncingNormally() {
|
| bool SyncManager::SyncInternal::OpenDirectory() {
|
| DCHECK(!initialized_) << "Should only happen once";
|
|
|
| - bool share_opened = dir_manager()->Open(username_for_share(), this);
|
| + // Set before Open().
|
| + change_observer_ =
|
| + browser_sync::MakeWeakHandle(js_mutation_event_observer_.AsWeakPtr());
|
| +
|
| + bool share_opened =
|
| + dir_manager()->Open(
|
| + username_for_share(),
|
| + this,
|
| + browser_sync::MakeWeakHandle(
|
| + js_mutation_event_observer_.AsWeakPtr()));
|
| DCHECK(share_opened);
|
| if (!share_opened) {
|
| LOG(ERROR) << "Could not open share for:" << username_for_share();
|
| @@ -908,8 +909,6 @@ bool SyncManager::SyncInternal::OpenDirectory() {
|
| }
|
|
|
| connection_manager()->set_client_id(lookup->cache_guid());
|
| - lookup->AddTransactionObserver(&js_mutation_event_observer_);
|
| - AddChangeObserver(&js_mutation_event_observer_);
|
| return true;
|
| }
|
|
|
| @@ -1223,16 +1222,6 @@ SyncManager::~SyncManager() {
|
| delete data_;
|
| }
|
|
|
| -void SyncManager::AddChangeObserver(ChangeObserver* observer) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - data_->AddChangeObserver(observer);
|
| -}
|
| -
|
| -void SyncManager::RemoveChangeObserver(ChangeObserver* observer) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - data_->RemoveChangeObserver(observer);
|
| -}
|
| -
|
| void SyncManager::AddObserver(Observer* observer) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| data_->AddObserver(observer);
|
| @@ -1268,8 +1257,9 @@ void SyncManager::SyncInternal::ShutdownOnSyncThread() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
|
|
| // Prevent any in-flight method calls from running. Also
|
| - // invalidates |weak_handle_this_|.
|
| + // invalidates |weak_handle_this_| and |change_observer_|.
|
| weak_ptr_factory_.InvalidateWeakPtrs();
|
| + js_mutation_event_observer_.InvalidateWeakPtrs();
|
|
|
| scheduler_.reset();
|
|
|
| @@ -1297,9 +1287,6 @@ void SyncManager::SyncInternal::ShutdownOnSyncThread() {
|
| // transaction.
|
| ReadTransaction trans(FROM_HERE, GetUserShare());
|
| trans.GetCryptographer()->RemoveObserver(this);
|
| - trans.GetLookup()->
|
| - RemoveTransactionObserver(&js_mutation_event_observer_);
|
| - RemoveChangeObserver(&js_mutation_event_observer_);
|
| }
|
| dir_manager()->FinalSaveChangesForAll();
|
| dir_manager()->Close(username_for_share());
|
| @@ -1315,8 +1302,9 @@ void SyncManager::SyncInternal::ShutdownOnSyncThread() {
|
|
|
| initialized_ = false;
|
|
|
| - // We reset this here, since only now we know it will not be
|
| + // We reset these here, since only now we know they will not be
|
| // accessed from other threads (since we shut down everything).
|
| + change_observer_.Reset();
|
| weak_handle_this_.Reset();
|
| }
|
|
|
| @@ -1382,7 +1370,7 @@ void SyncManager::SyncInternal::HandleTransactionCompleteChangeEvent(
|
| const syncable::ModelType type = syncable::ModelTypeFromInt(i);
|
| if (models_with_changes.test(type)) {
|
| change_delegate_->OnChangesComplete(type);
|
| - change_observers_->Notify(
|
| + change_observer_.Call(FROM_HERE,
|
| &SyncManager::ChangeObserver::OnChangesComplete, type);
|
| }
|
| }
|
| @@ -1418,7 +1406,7 @@ ModelTypeBitSet SyncManager::SyncInternal::HandleTransactionEndingChangeEvent(
|
| if (!ordered_changes.Get().empty()) {
|
| change_delegate_->
|
| OnChangesApplied(type, &read_trans, ordered_changes);
|
| - change_observers_->Notify(
|
| + change_observer_.Call(FROM_HERE,
|
| &SyncManager::ChangeObserver::OnChangesApplied,
|
| type, write_transaction_info.Get().id, ordered_changes);
|
| models_with_changes.set(i, true);
|
| @@ -1962,16 +1950,6 @@ void SyncManager::SyncInternal::StoreState(
|
| lookup->SaveChanges();
|
| }
|
|
|
| -void SyncManager::SyncInternal::AddChangeObserver(
|
| - SyncManager::ChangeObserver* observer) {
|
| - change_observers_->AddObserver(observer);
|
| -}
|
| -
|
| -void SyncManager::SyncInternal::RemoveChangeObserver(
|
| - SyncManager::ChangeObserver* observer) {
|
| - change_observers_->RemoveObserver(observer);
|
| -}
|
| -
|
| void SyncManager::SyncInternal::AddObserver(
|
| SyncManager::Observer* observer) {
|
| observers_.AddObserver(observer);
|
|
|