Index: chrome/browser/sync/notifier/non_blocking_invalidation_notifier.cc |
diff --git a/chrome/browser/sync/notifier/non_blocking_invalidation_notifier.cc b/chrome/browser/sync/notifier/non_blocking_invalidation_notifier.cc |
index 40a1f91c9eb8edc6912e93d753e0b25eaa80f6a9..674c223d48824f76c21181da1c964f05a43e1217 100644 |
--- a/chrome/browser/sync/notifier/non_blocking_invalidation_notifier.cc |
+++ b/chrome/browser/sync/notifier/non_blocking_invalidation_notifier.cc |
@@ -7,10 +7,8 @@ |
#include "base/logging.h" |
#include "base/memory/scoped_ptr.h" |
#include "base/message_loop.h" |
-#include "base/observer_list_threadsafe.h" |
#include "base/threading/thread.h" |
#include "chrome/browser/sync/notifier/invalidation_notifier.h" |
-#include "chrome/browser/sync/notifier/sync_notifier_observer.h" |
namespace sync_notifier { |
@@ -18,12 +16,11 @@ class NonBlockingInvalidationNotifier::Core |
: public base::RefCountedThreadSafe<NonBlockingInvalidationNotifier::Core>, |
public SyncNotifierObserver { |
public: |
- // Called on parent thread. |
- Core(); |
- |
- // Called on parent thread. |
- void AddObserver(SyncNotifierObserver* observer); |
- void RemoveObserver(SyncNotifierObserver* observer); |
+ // Called on parent thread. |delegate_observer| should be |
+ // initialized. |
+ explicit Core( |
+ const browser_sync::WeakHandle<SyncNotifierObserver>& |
+ delegate_observer); |
// Helpers called on I/O thread. |
void Initialize( |
@@ -50,14 +47,19 @@ class NonBlockingInvalidationNotifier::Core |
// Called on parent or I/O thread. |
~Core(); |
+ // The variables below should be used only on the I/O thread. |
+ const browser_sync::WeakHandle<SyncNotifierObserver> delegate_observer_; |
scoped_ptr<InvalidationNotifier> invalidation_notifier_; |
scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_; |
- scoped_refptr<ObserverListThreadSafe<SyncNotifierObserver> > observers_; |
+ |
DISALLOW_COPY_AND_ASSIGN(Core); |
}; |
-NonBlockingInvalidationNotifier::Core::Core() |
- : observers_(new ObserverListThreadSafe<SyncNotifierObserver>()) { |
+NonBlockingInvalidationNotifier::Core::Core( |
+ const browser_sync::WeakHandle<SyncNotifierObserver>& |
+ delegate_observer) |
+ : delegate_observer_(delegate_observer) { |
+ DCHECK(delegate_observer_.IsInitialized()); |
} |
NonBlockingInvalidationNotifier::Core::~Core() { |
@@ -92,16 +94,6 @@ void NonBlockingInvalidationNotifier::Core::Teardown() { |
io_message_loop_proxy_ = NULL; |
} |
-void NonBlockingInvalidationNotifier::Core::AddObserver( |
- SyncNotifierObserver* observer) { |
- observers_->AddObserver(observer); |
-} |
- |
-void NonBlockingInvalidationNotifier::Core::RemoveObserver( |
- SyncNotifierObserver* observer) { |
- observers_->RemoveObserver(observer); |
-} |
- |
void NonBlockingInvalidationNotifier::Core::SetUniqueId( |
const std::string& unique_id) { |
DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); |
@@ -129,21 +121,24 @@ void NonBlockingInvalidationNotifier::Core::UpdateEnabledTypes( |
void NonBlockingInvalidationNotifier::Core::OnIncomingNotification( |
const syncable::ModelTypePayloadMap& type_payloads) { |
DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); |
- observers_->Notify(&SyncNotifierObserver::OnIncomingNotification, |
- type_payloads); |
+ delegate_observer_.Call(FROM_HERE, |
+ &SyncNotifierObserver::OnIncomingNotification, |
+ type_payloads); |
} |
void NonBlockingInvalidationNotifier::Core::OnNotificationStateChange( |
bool notifications_enabled) { |
DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); |
- observers_->Notify(&SyncNotifierObserver::OnNotificationStateChange, |
- notifications_enabled); |
+ delegate_observer_.Call(FROM_HERE, |
+ &SyncNotifierObserver::OnNotificationStateChange, |
+ notifications_enabled); |
} |
void NonBlockingInvalidationNotifier::Core::StoreState( |
const std::string& state) { |
DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); |
- observers_->Notify(&SyncNotifierObserver::StoreState, state); |
+ delegate_observer_.Call(FROM_HERE, |
+ &SyncNotifierObserver::StoreState, state); |
} |
NonBlockingInvalidationNotifier::NonBlockingInvalidationNotifier( |
@@ -152,7 +147,10 @@ NonBlockingInvalidationNotifier::NonBlockingInvalidationNotifier( |
const browser_sync::WeakHandle<InvalidationVersionTracker>& |
invalidation_version_tracker, |
const std::string& client_info) |
- : core_(new Core), |
+ : weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), |
+ core_( |
+ new Core(browser_sync::MakeWeakHandle( |
+ weak_ptr_factory_.GetWeakPtr()))), |
parent_message_loop_proxy_( |
base::MessageLoopProxy::current()), |
io_message_loop_proxy_(notifier_options.request_context_getter-> |
@@ -183,13 +181,13 @@ NonBlockingInvalidationNotifier::~NonBlockingInvalidationNotifier() { |
void NonBlockingInvalidationNotifier::AddObserver( |
SyncNotifierObserver* observer) { |
DCHECK(parent_message_loop_proxy_->BelongsToCurrentThread()); |
- core_->AddObserver(observer); |
+ observers_.AddObserver(observer); |
} |
void NonBlockingInvalidationNotifier::RemoveObserver( |
SyncNotifierObserver* observer) { |
DCHECK(parent_message_loop_proxy_->BelongsToCurrentThread()); |
- core_->RemoveObserver(observer); |
+ observers_.RemoveObserver(observer); |
} |
void NonBlockingInvalidationNotifier::SetUniqueId( |
@@ -242,4 +240,25 @@ void NonBlockingInvalidationNotifier::SendNotification( |
// need to forward on the call. |
} |
+void NonBlockingInvalidationNotifier::OnIncomingNotification( |
+ const syncable::ModelTypePayloadMap& type_payloads) { |
+ DCHECK(parent_message_loop_proxy_->BelongsToCurrentThread()); |
+ FOR_EACH_OBSERVER(SyncNotifierObserver, observers_, |
+ OnIncomingNotification(type_payloads)); |
+} |
+ |
+void NonBlockingInvalidationNotifier::OnNotificationStateChange( |
+ bool notifications_enabled) { |
+ DCHECK(parent_message_loop_proxy_->BelongsToCurrentThread()); |
+ FOR_EACH_OBSERVER(SyncNotifierObserver, observers_, |
+ OnNotificationStateChange(notifications_enabled)); |
+} |
+ |
+void NonBlockingInvalidationNotifier::StoreState( |
+ const std::string& state) { |
+ DCHECK(parent_message_loop_proxy_->BelongsToCurrentThread()); |
+ FOR_EACH_OBSERVER(SyncNotifierObserver, observers_, |
+ StoreState(state)); |
+} |
+ |
} // namespace sync_notifier |