Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(383)

Unified Diff: chrome/browser/sync/internal_api/sync_manager.cc

Issue 8586014: [Sync] Replace uses of ObserverListThreadSafe with WeakHandles (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Sync to head Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 1719a57fbcea07ab437e8d941fe7811ef08892dc..07801ef43717de6348194e3d951dd0593f91b84f 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()));
if (!share_opened) {
LOG(ERROR) << "Could not open share for:" << username_for_share();
return false;
@@ -907,8 +908,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);
« no previous file with comments | « chrome/browser/sync/internal_api/sync_manager.h ('k') | chrome/browser/sync/internal_api/syncapi_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698