| 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.
|
|
|