summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorakalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-10 07:22:52 +0000
committerakalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-10 07:22:52 +0000
commit88fc983023fd50fc762137f594c7198ff07889ff (patch)
tree8b9e0ffad08cedf20c8f60016b826a297aeb58b7
parent36f608ea13b53d40f21042749eba3eee50755cd9 (diff)
downloadchromium_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
-rw-r--r--chrome/browser/sync/notifier/cache_invalidation_packet_handler.cc11
-rw-r--r--chrome/browser/sync/notifier/cache_invalidation_packet_handler.h13
-rw-r--r--chrome/browser/sync/notifier/chrome_invalidation_client.cc3
-rw-r--r--chrome/browser/sync/notifier/chrome_invalidation_client.h6
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();