Index: google_apis/gaia/oauth2_token_service_request.cc |
diff --git a/google_apis/gaia/oauth2_token_service_request.cc b/google_apis/gaia/oauth2_token_service_request.cc |
index c946fde088e89f31d7edbf1206bfe22adbbe1e4a..672015241779a45d4e8f1dea882947d0844c3011 100644 |
--- a/google_apis/gaia/oauth2_token_service_request.cc |
+++ b/google_apis/gaia/oauth2_token_service_request.cc |
@@ -71,6 +71,8 @@ class OAuth2TokenServiceRequest::Core |
private: |
friend class base::RefCountedThreadSafe<OAuth2TokenServiceRequest::Core>; |
+ void DoNothing(); |
+ |
scoped_refptr<base::SingleThreadTaskRunner> token_service_task_runner_; |
OAuth2TokenServiceRequest* owner_; |
TokenServiceProvider* provider_; |
@@ -104,10 +106,16 @@ void OAuth2TokenServiceRequest::Core::Stop() { |
// Detaches |owner_| from this instance so |owner_| will be called back only |
// if |Stop()| has never been called. |
owner_ = NULL; |
- token_service_task_runner_->PostTask( |
+ |
+ // We are stopping and will likely be destroyed soon. Use a reply closure |
+ // (DoNothing) to retain "this" and ensure we are destroyed in the owner |
+ // thread, not the task runner thread. PostTaskAndReply guarantees that the |
+ // reply closure will execute after StopOnTokenServiceThread has completed. |
+ token_service_task_runner_->PostTaskAndReply( |
FROM_HERE, |
base::Bind(&OAuth2TokenServiceRequest::Core::StopOnTokenServiceThread, |
- this)); |
+ this), |
+ base::Bind(&OAuth2TokenServiceRequest::Core::DoNothing, this)); |
} |
bool OAuth2TokenServiceRequest::Core::IsStopped() const { |
@@ -130,6 +138,10 @@ OAuth2TokenServiceRequest* OAuth2TokenServiceRequest::Core::owner() { |
return owner_; |
} |
+void OAuth2TokenServiceRequest::Core::DoNothing() { |
+ DCHECK(CalledOnValidThread()); |
+} |
+ |
namespace { |
// An implementation of Core for getting an access token. |