Index: components/invalidation/non_blocking_invalidator.cc |
diff --git a/components/invalidation/non_blocking_invalidator.cc b/components/invalidation/non_blocking_invalidator.cc |
index 95ee59fe7ebbd095b9c2b9b0cea2ae8ed393e7ed..95b2b150c39560811381df33109d2813762613e6 100644 |
--- a/components/invalidation/non_blocking_invalidator.cc |
+++ b/components/invalidation/non_blocking_invalidator.cc |
@@ -18,7 +18,6 @@ |
#include "components/invalidation/object_id_invalidation_map.h" |
#include "components/invalidation/sync_system_resources.h" |
#include "jingle/notifier/listener/push_client.h" |
-#include "sync/internal_api/public/util/weak_handle.h" |
namespace syncer { |
@@ -28,8 +27,9 @@ struct NonBlockingInvalidator::InitializeOptions { |
const std::string& invalidator_client_id, |
const UnackedInvalidationsMap& saved_invalidations, |
const std::string& invalidation_bootstrap_data, |
- const WeakHandle<InvalidationStateTracker>& |
- invalidation_state_tracker, |
+ const base::WeakPtr<InvalidationStateTracker>& invalidation_state_tracker, |
+ const scoped_refptr<base::SingleThreadTaskRunner>& |
+ invalidation_state_tracker_task_runner, |
const std::string& client_info, |
scoped_refptr<net::URLRequestContextGetter> request_context_getter) |
: network_channel_creator(network_channel_creator), |
@@ -37,15 +37,18 @@ struct NonBlockingInvalidator::InitializeOptions { |
saved_invalidations(saved_invalidations), |
invalidation_bootstrap_data(invalidation_bootstrap_data), |
invalidation_state_tracker(invalidation_state_tracker), |
+ invalidation_state_tracker_task_runner( |
+ invalidation_state_tracker_task_runner), |
client_info(client_info), |
- request_context_getter(request_context_getter) { |
- } |
+ request_context_getter(request_context_getter) {} |
NetworkChannelCreator network_channel_creator; |
std::string invalidator_client_id; |
UnackedInvalidationsMap saved_invalidations; |
std::string invalidation_bootstrap_data; |
- WeakHandle<InvalidationStateTracker> invalidation_state_tracker; |
+ base::WeakPtr<InvalidationStateTracker> invalidation_state_tracker; |
+ scoped_refptr<base::SingleThreadTaskRunner> |
+ invalidation_state_tracker_task_runner; |
std::string client_info; |
scoped_refptr<net::URLRequestContextGetter> request_context_getter; |
}; |
@@ -98,8 +101,9 @@ class NonBlockingInvalidator::Core |
public InvalidationHandler { |
public: |
// Called on parent thread. |delegate_observer| should be initialized. |
- explicit Core( |
- const WeakHandle<NonBlockingInvalidator>& delegate_observer); |
+ Core(const base::WeakPtr<NonBlockingInvalidator>& delegate_observer, |
+ const scoped_refptr<base::SingleThreadTaskRunner>& |
+ delegate_observer_task_runner); |
// Helpers called on I/O thread. |
void Initialize( |
@@ -124,7 +128,8 @@ class NonBlockingInvalidator::Core |
virtual ~Core(); |
// The variables below should be used only on the I/O thread. |
- const WeakHandle<NonBlockingInvalidator> delegate_observer_; |
+ const base::WeakPtr<NonBlockingInvalidator> delegate_observer_; |
+ scoped_refptr<base::SingleThreadTaskRunner> delegate_observer_task_runner_; |
scoped_ptr<InvalidationNotifier> invalidation_notifier_; |
scoped_refptr<base::SingleThreadTaskRunner> network_task_runner_; |
@@ -132,9 +137,13 @@ class NonBlockingInvalidator::Core |
}; |
NonBlockingInvalidator::Core::Core( |
- const WeakHandle<NonBlockingInvalidator>& delegate_observer) |
- : delegate_observer_(delegate_observer) { |
- DCHECK(delegate_observer_.IsInitialized()); |
+ const base::WeakPtr<NonBlockingInvalidator>& delegate_observer, |
+ const scoped_refptr<base::SingleThreadTaskRunner>& |
+ delegate_observer_task_runner) |
+ : delegate_observer_(delegate_observer), |
+ delegate_observer_task_runner_(delegate_observer_task_runner) { |
+ DCHECK(delegate_observer_); |
+ DCHECK(delegate_observer_task_runner_); |
} |
NonBlockingInvalidator::Core::~Core() { |
@@ -148,14 +157,14 @@ void NonBlockingInvalidator::Core::Initialize( |
DCHECK(network_task_runner_->BelongsToCurrentThread()); |
scoped_ptr<SyncNetworkChannel> network_channel = |
initialize_options.network_channel_creator.Run(); |
- invalidation_notifier_.reset( |
- new InvalidationNotifier( |
- network_channel.Pass(), |
- initialize_options.invalidator_client_id, |
- initialize_options.saved_invalidations, |
- initialize_options.invalidation_bootstrap_data, |
- initialize_options.invalidation_state_tracker, |
- initialize_options.client_info)); |
+ invalidation_notifier_.reset(new InvalidationNotifier( |
+ network_channel.Pass(), |
+ initialize_options.invalidator_client_id, |
+ initialize_options.saved_invalidations, |
+ initialize_options.invalidation_bootstrap_data, |
+ initialize_options.invalidation_state_tracker, |
+ initialize_options.invalidation_state_tracker_task_runner, |
+ initialize_options.client_info)); |
invalidation_notifier_->RegisterHandler(this); |
} |
@@ -186,17 +195,21 @@ void NonBlockingInvalidator::Core::RequestDetailedStatus( |
void NonBlockingInvalidator::Core::OnInvalidatorStateChange( |
InvalidatorState reason) { |
DCHECK(network_task_runner_->BelongsToCurrentThread()); |
- delegate_observer_.Call(FROM_HERE, |
- &NonBlockingInvalidator::OnInvalidatorStateChange, |
- reason); |
+ delegate_observer_task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&NonBlockingInvalidator::OnInvalidatorStateChange, |
+ delegate_observer_, |
+ reason)); |
} |
void NonBlockingInvalidator::Core::OnIncomingInvalidation( |
const ObjectIdInvalidationMap& invalidation_map) { |
DCHECK(network_task_runner_->BelongsToCurrentThread()); |
- delegate_observer_.Call(FROM_HERE, |
- &NonBlockingInvalidator::OnIncomingInvalidation, |
- invalidation_map); |
+ delegate_observer_task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&NonBlockingInvalidator::OnIncomingInvalidation, |
+ delegate_observer_, |
+ invalidation_map)); |
} |
std::string NonBlockingInvalidator::Core::GetOwnerName() const { |
@@ -215,16 +228,21 @@ NonBlockingInvalidator::NonBlockingInvalidator( |
parent_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
network_task_runner_(request_context_getter->GetNetworkTaskRunner()), |
weak_ptr_factory_(this) { |
- core_ = new Core(MakeWeakHandle(weak_ptr_factory_.GetWeakPtr())); |
- |
- InitializeOptions initialize_options( |
- network_channel_creator, |
- invalidator_client_id, |
- saved_invalidations, |
- invalidation_bootstrap_data, |
- MakeWeakHandle(weak_ptr_factory_.GetWeakPtr()), |
- client_info, |
- request_context_getter); |
+ base::WeakPtr<NonBlockingInvalidator> weak_ptr_this = |
+ weak_ptr_factory_.GetWeakPtr(); |
+ weak_ptr_this.get(); // Bind to this thread. |
+ |
+ core_ = new Core(weak_ptr_this, |
+ base::MessageLoopProxy::current()); |
+ |
+ InitializeOptions initialize_options(network_channel_creator, |
+ invalidator_client_id, |
+ saved_invalidations, |
+ invalidation_bootstrap_data, |
+ weak_ptr_this, |
+ base::MessageLoopProxy::current(), |
+ client_info, |
+ request_context_getter); |
if (!network_task_runner_->PostTask( |
FROM_HERE, |