Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(758)

Side by Side Diff: google_apis/gaia/oauth2_token_service_request.cc

Issue 317773003: Ensure OAuth2TokenServiceRequest::Core is destroyed on owner thread. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Run loop in TearDown to ensure core is freed before unit test terminates. Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | google_apis/gaia/oauth2_token_service_request_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "google_apis/gaia/oauth2_token_service_request.h" 5 #include "google_apis/gaia/oauth2_token_service_request.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/memory/ref_counted.h" 8 #include "base/memory/ref_counted.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/single_thread_task_runner.h" 10 #include "base/single_thread_task_runner.h"
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 // Called on the token service thread. 64 // Called on the token service thread.
65 virtual void StopOnTokenServiceThread() = 0; 65 virtual void StopOnTokenServiceThread() = 0;
66 66
67 base::SingleThreadTaskRunner* token_service_task_runner(); 67 base::SingleThreadTaskRunner* token_service_task_runner();
68 OAuth2TokenService* token_service(); 68 OAuth2TokenService* token_service();
69 OAuth2TokenServiceRequest* owner(); 69 OAuth2TokenServiceRequest* owner();
70 70
71 private: 71 private:
72 friend class base::RefCountedThreadSafe<OAuth2TokenServiceRequest::Core>; 72 friend class base::RefCountedThreadSafe<OAuth2TokenServiceRequest::Core>;
73 73
74 void DoNothing();
75
74 scoped_refptr<base::SingleThreadTaskRunner> token_service_task_runner_; 76 scoped_refptr<base::SingleThreadTaskRunner> token_service_task_runner_;
75 OAuth2TokenServiceRequest* owner_; 77 OAuth2TokenServiceRequest* owner_;
76 TokenServiceProvider* provider_; 78 TokenServiceProvider* provider_;
77 DISALLOW_COPY_AND_ASSIGN(Core); 79 DISALLOW_COPY_AND_ASSIGN(Core);
78 }; 80 };
79 81
80 OAuth2TokenServiceRequest::Core::Core(OAuth2TokenServiceRequest* owner, 82 OAuth2TokenServiceRequest::Core::Core(OAuth2TokenServiceRequest* owner,
81 TokenServiceProvider* provider) 83 TokenServiceProvider* provider)
82 : owner_(owner), provider_(provider) { 84 : owner_(owner), provider_(provider) {
83 DCHECK(owner_); 85 DCHECK(owner_);
(...skipping 13 matching lines...) Expand all
97 this)); 99 this));
98 } 100 }
99 101
100 void OAuth2TokenServiceRequest::Core::Stop() { 102 void OAuth2TokenServiceRequest::Core::Stop() {
101 DCHECK(CalledOnValidThread()); 103 DCHECK(CalledOnValidThread());
102 DCHECK(!IsStopped()); 104 DCHECK(!IsStopped());
103 105
104 // Detaches |owner_| from this instance so |owner_| will be called back only 106 // Detaches |owner_| from this instance so |owner_| will be called back only
105 // if |Stop()| has never been called. 107 // if |Stop()| has never been called.
106 owner_ = NULL; 108 owner_ = NULL;
107 token_service_task_runner_->PostTask( 109
110 // We are stopping and will likely be destroyed soon. Use a reply closure
111 // (DoNothing) to retain "this" and ensure we are destroyed in the owner
112 // thread, not the task runner thread. PostTaskAndReply guarantees that the
113 // reply closure will execute after StopOnTokenServiceThread has completed.
114 token_service_task_runner_->PostTaskAndReply(
108 FROM_HERE, 115 FROM_HERE,
109 base::Bind(&OAuth2TokenServiceRequest::Core::StopOnTokenServiceThread, 116 base::Bind(&OAuth2TokenServiceRequest::Core::StopOnTokenServiceThread,
110 this)); 117 this),
118 base::Bind(&OAuth2TokenServiceRequest::Core::DoNothing, this));
111 } 119 }
112 120
113 bool OAuth2TokenServiceRequest::Core::IsStopped() const { 121 bool OAuth2TokenServiceRequest::Core::IsStopped() const {
114 DCHECK(CalledOnValidThread()); 122 DCHECK(CalledOnValidThread());
115 return owner_ == NULL; 123 return owner_ == NULL;
116 } 124 }
117 125
118 base::SingleThreadTaskRunner* 126 base::SingleThreadTaskRunner*
119 OAuth2TokenServiceRequest::Core::token_service_task_runner() { 127 OAuth2TokenServiceRequest::Core::token_service_task_runner() {
120 return token_service_task_runner_; 128 return token_service_task_runner_;
121 } 129 }
122 130
123 OAuth2TokenService* OAuth2TokenServiceRequest::Core::token_service() { 131 OAuth2TokenService* OAuth2TokenServiceRequest::Core::token_service() {
124 DCHECK(token_service_task_runner_->BelongsToCurrentThread()); 132 DCHECK(token_service_task_runner_->BelongsToCurrentThread());
125 return provider_->GetTokenService(); 133 return provider_->GetTokenService();
126 } 134 }
127 135
128 OAuth2TokenServiceRequest* OAuth2TokenServiceRequest::Core::owner() { 136 OAuth2TokenServiceRequest* OAuth2TokenServiceRequest::Core::owner() {
129 DCHECK(CalledOnValidThread()); 137 DCHECK(CalledOnValidThread());
130 return owner_; 138 return owner_;
131 } 139 }
132 140
141 void OAuth2TokenServiceRequest::Core::DoNothing() {
142 DCHECK(CalledOnValidThread());
143 }
144
133 namespace { 145 namespace {
134 146
135 // An implementation of Core for getting an access token. 147 // An implementation of Core for getting an access token.
136 class RequestCore : public OAuth2TokenServiceRequest::Core, 148 class RequestCore : public OAuth2TokenServiceRequest::Core,
137 public OAuth2TokenService::Consumer { 149 public OAuth2TokenService::Consumer {
138 public: 150 public:
139 RequestCore(OAuth2TokenServiceRequest* owner, 151 RequestCore(OAuth2TokenServiceRequest* owner,
140 OAuth2TokenServiceRequest::TokenServiceProvider* provider, 152 OAuth2TokenServiceRequest::TokenServiceProvider* provider,
141 OAuth2TokenService::Consumer* consumer, 153 OAuth2TokenService::Consumer* consumer,
142 const std::string& account_id, 154 const std::string& account_id,
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
339 const std::string& account_id) 351 const std::string& account_id)
340 : account_id_(account_id) { 352 : account_id_(account_id) {
341 DCHECK(!account_id_.empty()); 353 DCHECK(!account_id_.empty());
342 } 354 }
343 355
344 void OAuth2TokenServiceRequest::StartWithCore(const scoped_refptr<Core>& core) { 356 void OAuth2TokenServiceRequest::StartWithCore(const scoped_refptr<Core>& core) {
345 DCHECK(core); 357 DCHECK(core);
346 core_ = core; 358 core_ = core;
347 core_->Start(); 359 core_->Start();
348 } 360 }
OLDNEW
« no previous file with comments | « no previous file | google_apis/gaia/oauth2_token_service_request_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698