diff options
author | akalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-10 07:22:52 +0000 |
---|---|---|
committer | akalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-10 07:22:52 +0000 |
commit | 88fc983023fd50fc762137f594c7198ff07889ff (patch) | |
tree | 8b9e0ffad08cedf20c8f60016b826a297aeb58b7 | |
parent | 36f608ea13b53d40f21042749eba3eee50755cd9 (diff) | |
download | chromium_src-88fc983023fd50fc762137f594c7198ff07889ff.zip chromium_src-88fc983023fd50fc762137f594c7198ff07889ff.tar.gz chromium_src-88fc983023fd50fc762137f594c7198ff07889ff.tar.bz2 |
[Sync] Propagate use of base::WeakPtr for base_task.
Speculative fix for crash described in the bug.
Implicit conversions are evil. :(
BUG=49274
TEST=None :(
Review URL: http://codereview.chromium.org/3569019
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@62110 0039d316-1c4b-4281-b951-d872f2087c98
4 files changed, 20 insertions, 13 deletions
diff --git a/chrome/browser/sync/notifier/cache_invalidation_packet_handler.cc b/chrome/browser/sync/notifier/cache_invalidation_packet_handler.cc index d2930f3..dc1e7a3 100644 --- a/chrome/browser/sync/notifier/cache_invalidation_packet_handler.cc +++ b/chrome/browser/sync/notifier/cache_invalidation_packet_handler.cc @@ -195,14 +195,14 @@ std::string MakeSid() { } // namespace CacheInvalidationPacketHandler::CacheInvalidationPacketHandler( - talk_base::Task* base_task, + base::WeakPtr<talk_base::Task> base_task, invalidation::InvalidationClient* invalidation_client) : scoped_callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), base_task_(base_task), invalidation_client_(invalidation_client), seq_(0), sid_(MakeSid()) { - CHECK(base_task_); + CHECK(base_task_.get()); CHECK(invalidation_client_); invalidation::NetworkEndpoint* network_endpoint = invalidation_client_->network_endpoint(); @@ -213,7 +213,7 @@ CacheInvalidationPacketHandler::CacheInvalidationPacketHandler( // Owned by base_task. CacheInvalidationListenTask* listen_task = new CacheInvalidationListenTask( - base_task, scoped_callback_factory_.NewCallback( + base_task_, scoped_callback_factory_.NewCallback( &CacheInvalidationPacketHandler::HandleInboundPacket)); listen_task->Start(); } @@ -227,6 +227,9 @@ CacheInvalidationPacketHandler::~CacheInvalidationPacketHandler() { void CacheInvalidationPacketHandler::HandleOutboundPacket( invalidation::NetworkEndpoint* const& network_endpoint) { + if (!base_task_.get()) { + return; + } CHECK_EQ(network_endpoint, invalidation_client_->network_endpoint()); invalidation::string message; network_endpoint->TakeOutboundMessage(&message); @@ -236,7 +239,7 @@ void CacheInvalidationPacketHandler::HandleOutboundPacket( << message; return; } - // Owned by base_task. + // Owned by base_task_. CacheInvalidationSendMessageTask* send_message_task = new CacheInvalidationSendMessageTask(base_task_, buzz::Jid(kBotJid), diff --git a/chrome/browser/sync/notifier/cache_invalidation_packet_handler.h b/chrome/browser/sync/notifier/cache_invalidation_packet_handler.h index 6d94c5f..3c3bfec 100644 --- a/chrome/browser/sync/notifier/cache_invalidation_packet_handler.h +++ b/chrome/browser/sync/notifier/cache_invalidation_packet_handler.h @@ -13,6 +13,7 @@ #include "base/basictypes.h" #include "base/scoped_callback_factory.h" +#include "base/weak_ptr.h" #include "talk/xmpp/jid.h" namespace invalidation { @@ -30,12 +31,12 @@ namespace sync_notifier { class CacheInvalidationPacketHandler { public: - // Starts routing packets from |invalidation_client| through - // |xmpp_client|. |invalidation_client| must not already be routing - // packets through something. Does not take ownership of - // |xmpp_client| or |invalidation_client|. + // Starts routing packets from |invalidation_client| using + // |base_task|. |base_task.get()| must still be non-NULL. + // |invalidation_client| must not already be routing packets through + // something. Does not take ownership of |invalidation_client|. CacheInvalidationPacketHandler( - talk_base::Task* base_task, + base::WeakPtr<talk_base::Task> base_task, invalidation::InvalidationClient* invalidation_client); // Makes the invalidation client passed into the constructor not @@ -52,7 +53,7 @@ class CacheInvalidationPacketHandler { base::ScopedCallbackFactory<CacheInvalidationPacketHandler> scoped_callback_factory_; - talk_base::Task* base_task_; + base::WeakPtr<talk_base::Task> base_task_; invalidation::InvalidationClient* invalidation_client_; // Parameters for sent messages. diff --git a/chrome/browser/sync/notifier/chrome_invalidation_client.cc b/chrome/browser/sync/notifier/chrome_invalidation_client.cc index 89f5bde..c2505c2 100644 --- a/chrome/browser/sync/notifier/chrome_invalidation_client.cc +++ b/chrome/browser/sync/notifier/chrome_invalidation_client.cc @@ -31,8 +31,9 @@ ChromeInvalidationClient::~ChromeInvalidationClient() { void ChromeInvalidationClient::Start( const std::string& client_id, Listener* listener, - talk_base::Task* base_task) { + base::WeakPtr<talk_base::Task> base_task) { DCHECK(non_thread_safe_.CalledOnValidThread()); + DCHECK(base_task.get()); Stop(); chrome_system_resources_.StartScheduler(); diff --git a/chrome/browser/sync/notifier/chrome_invalidation_client.h b/chrome/browser/sync/notifier/chrome_invalidation_client.h index cc47ce6..6d87d70 100644 --- a/chrome/browser/sync/notifier/chrome_invalidation_client.h +++ b/chrome/browser/sync/notifier/chrome_invalidation_client.h @@ -14,6 +14,7 @@ #include "base/basictypes.h" #include "base/non_thread_safe.h" #include "base/scoped_ptr.h" +#include "base/weak_ptr.h" #include "chrome/browser/sync/notifier/chrome_system_resources.h" #include "chrome/browser/sync/syncable/model_type.h" #include "google/cacheinvalidation/invalidation-client.h" @@ -46,10 +47,11 @@ class ChromeInvalidationClient : public invalidation::InvalidationListener { // Calls Stop(). virtual ~ChromeInvalidationClient(); - // Does not take ownership of |listener| nor |base_task|. + // Does not take ownership of |listener|. |base_task| must still be + // non-NULL. void Start( const std::string& client_id, Listener* listener, - talk_base::Task* base_task); + base::WeakPtr<talk_base::Task> base_task); void Stop(); |