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

Side by Side Diff: remoting/host/remoting_me2me_host.cc

Issue 10572005: Use SingleThreadTaskRunner instead of MessageLoopProxy in remoting/host. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 // This file implements a standalone host process for Me2Me. 5 // This file implements a standalone host process for Me2Me.
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/at_exit.h" 9 #include "base/at_exit.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 // Call ConfigUpdatedDelayed after a short delay, so that this object won't 136 // Call ConfigUpdatedDelayed after a short delay, so that this object won't
137 // try to read the updated configuration file before it has been 137 // try to read the updated configuration file before it has been
138 // completely written. 138 // completely written.
139 // If the writer moves the new configuration file into place atomically, 139 // If the writer moves the new configuration file into place atomically,
140 // this delay may not be necessary. 140 // this delay may not be necessary.
141 config_updated_timer_->Reset(); 141 config_updated_timer_->Reset();
142 } 142 }
143 143
144 void ConfigUpdatedDelayed() { 144 void ConfigUpdatedDelayed() {
145 if (LoadConfig()) { 145 if (LoadConfig()) {
146 context_->network_message_loop()->PostTask( 146 context_->network_task_runner()->PostTask(
147 FROM_HERE, 147 FROM_HERE,
148 base::Bind(&HostProcess::CreateAuthenticatorFactory, 148 base::Bind(&HostProcess::CreateAuthenticatorFactory,
149 base::Unretained(this))); 149 base::Unretained(this)));
150 } else { 150 } else {
151 LOG(ERROR) << "Invalid configuration."; 151 LOG(ERROR) << "Invalid configuration.";
152 } 152 }
153 } 153 }
154 154
155 #if defined(OS_WIN) 155 #if defined(OS_WIN)
156 class ConfigChangedDelegate : public base::files::FilePathWatcher::Delegate { 156 class ConfigChangedDelegate : public base::files::FilePathWatcher::Delegate {
157 public: 157 public:
158 ConfigChangedDelegate(base::MessageLoopProxy* message_loop, 158 ConfigChangedDelegate(
159 const base::Closure& callback) 159 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
160 : message_loop_(message_loop), 160 const base::Closure& callback)
161 : task_runner_(task_runner),
161 callback_(callback) { 162 callback_(callback) {
162 } 163 }
163 164
164 void OnFilePathChanged(const FilePath& path) OVERRIDE { 165 void OnFilePathChanged(const FilePath& path) OVERRIDE {
165 message_loop_->PostTask(FROM_HERE, callback_); 166 task_runner_->PostTask(FROM_HERE, callback_);
166 } 167 }
167 168
168 void OnFilePathError(const FilePath& path) OVERRIDE { 169 void OnFilePathError(const FilePath& path) OVERRIDE {
169 } 170 }
170 171
171 private: 172 private:
172 scoped_refptr<base::MessageLoopProxy> message_loop_; 173 scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
173 base::Closure callback_; 174 base::Closure callback_;
174 175
175 DISALLOW_COPY_AND_ASSIGN(ConfigChangedDelegate); 176 DISALLOW_COPY_AND_ASSIGN(ConfigChangedDelegate);
176 }; 177 };
177 #endif // defined(OS_WIN) 178 #endif // defined(OS_WIN)
178 179
179 void ListenForConfigChanges() { 180 void ListenForConfigChanges() {
180 #if defined(OS_MACOSX) 181 #if defined(OS_MACOSX)
181 remoting::RegisterHupSignalHandler( 182 remoting::RegisterHupSignalHandler(
182 base::Bind(&HostProcess::ConfigUpdatedDelayed, base::Unretained(this))); 183 base::Bind(&HostProcess::ConfigUpdatedDelayed, base::Unretained(this)));
(...skipping 22 matching lines...) Expand all
205 return kInvalidHostConfigurationExitCode; 206 return kInvalidHostConfigurationExitCode;
206 } 207 }
207 208
208 #if defined(OS_MACOSX) || defined(OS_WIN) 209 #if defined(OS_MACOSX) || defined(OS_WIN)
209 host_user_interface_.reset(new HostUserInterface(context_.get())); 210 host_user_interface_.reset(new HostUserInterface(context_.get()));
210 #endif 211 #endif
211 212
212 StartWatchingNatPolicy(); 213 StartWatchingNatPolicy();
213 214
214 #if defined(OS_MACOSX) || defined(OS_WIN) 215 #if defined(OS_MACOSX) || defined(OS_WIN)
215 context_->file_message_loop()->PostTask( 216 context_->file_task_runner()->PostTask(
216 FROM_HERE, 217 FROM_HERE,
217 base::Bind(&HostProcess::ListenForConfigChanges, 218 base::Bind(&HostProcess::ListenForConfigChanges,
218 base::Unretained(this))); 219 base::Unretained(this)));
219 #endif 220 #endif
220 message_loop_.Run(); 221 message_loop_.Run();
221 222
222 #if defined(OS_MACOSX) || defined(OS_WIN) 223 #if defined(OS_MACOSX) || defined(OS_WIN)
223 host_user_interface_.reset(); 224 host_user_interface_.reset();
224 #endif 225 #endif
225 226
226 base::WaitableEvent done_event(true, false); 227 base::WaitableEvent done_event(true, false);
227 nat_policy_->StopWatching(&done_event); 228 nat_policy_->StopWatching(&done_event);
228 done_event.Wait(); 229 done_event.Wait();
229 nat_policy_.reset(); 230 nat_policy_.reset();
230 231
231 return exit_code_; 232 return exit_code_;
232 } 233 }
233 234
234 // Overridden from HeartbeatSender::Listener 235 // Overridden from HeartbeatSender::Listener
235 virtual void OnUnknownHostIdError() OVERRIDE { 236 virtual void OnUnknownHostIdError() OVERRIDE {
236 LOG(ERROR) << "Host ID not found."; 237 LOG(ERROR) << "Host ID not found.";
237 Shutdown(kInvalidHostIdExitCode); 238 Shutdown(kInvalidHostIdExitCode);
238 } 239 }
239 240
240 private: 241 private:
241 void StartWatchingNatPolicy() { 242 void StartWatchingNatPolicy() {
242 nat_policy_.reset( 243 nat_policy_.reset(
243 policy_hack::NatPolicy::Create(context_->file_message_loop())); 244 policy_hack::NatPolicy::Create(context_->file_task_runner()));
244 nat_policy_->StartWatching( 245 nat_policy_->StartWatching(
245 base::Bind(&HostProcess::OnNatPolicyUpdate, base::Unretained(this))); 246 base::Bind(&HostProcess::OnNatPolicyUpdate, base::Unretained(this)));
246 } 247 }
247 248
248 // Read Host config from disk, returning true if successful. 249 // Read Host config from disk, returning true if successful.
249 bool LoadConfig() { 250 bool LoadConfig() {
250 JsonHostConfig host_config(host_config_path_); 251 JsonHostConfig host_config(host_config_path_);
251 JsonHostConfig auth_config(auth_config_path_); 252 JsonHostConfig auth_config(auth_config_path_);
252 253
253 FilePath failed_path; 254 FilePath failed_path;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 &xmpp_auth_service_)) { 305 &xmpp_auth_service_)) {
305 // For the me2me host, we default to ClientLogin token for chromiumsync 306 // For the me2me host, we default to ClientLogin token for chromiumsync
306 // because earlier versions of the host had no HTTP stack with which to 307 // because earlier versions of the host had no HTTP stack with which to
307 // request an OAuth2 access token. 308 // request an OAuth2 access token.
308 xmpp_auth_service_ = kChromotingTokenDefaultServiceName; 309 xmpp_auth_service_ = kChromotingTokenDefaultServiceName;
309 } 310 }
310 return true; 311 return true;
311 } 312 }
312 313
313 void OnNatPolicyUpdate(bool nat_traversal_enabled) { 314 void OnNatPolicyUpdate(bool nat_traversal_enabled) {
314 if (!context_->network_message_loop()->BelongsToCurrentThread()) { 315 if (!context_->network_task_runner()->BelongsToCurrentThread()) {
315 context_->network_message_loop()->PostTask(FROM_HERE, base::Bind( 316 context_->network_task_runner()->PostTask(FROM_HERE, base::Bind(
316 &HostProcess::OnNatPolicyUpdate, base::Unretained(this), 317 &HostProcess::OnNatPolicyUpdate, base::Unretained(this),
317 nat_traversal_enabled)); 318 nat_traversal_enabled));
318 return; 319 return;
319 } 320 }
320 321
321 bool policy_changed = allow_nat_traversal_ != nat_traversal_enabled; 322 bool policy_changed = allow_nat_traversal_ != nat_traversal_enabled;
322 allow_nat_traversal_ = nat_traversal_enabled; 323 allow_nat_traversal_ = nat_traversal_enabled;
323 324
324 if (host_) { 325 if (host_) {
325 // Restart the host if the policy has changed while the host was 326 // Restart the host if the policy has changed while the host was
326 // online. 327 // online.
327 if (policy_changed) 328 if (policy_changed)
328 RestartHost(); 329 RestartHost();
329 } else { 330 } else {
330 // Just start the host otherwise. 331 // Just start the host otherwise.
331 StartHost(); 332 StartHost();
332 } 333 }
333 } 334 }
334 335
335 void StartHost() { 336 void StartHost() {
336 DCHECK(context_->network_message_loop()->BelongsToCurrentThread()); 337 DCHECK(context_->network_task_runner()->BelongsToCurrentThread());
337 DCHECK(!host_); 338 DCHECK(!host_);
338 339
339 if (!signal_strategy_.get()) { 340 if (!signal_strategy_.get()) {
340 signal_strategy_.reset( 341 signal_strategy_.reset(
341 new XmppSignalStrategy(context_->jingle_thread(), xmpp_login_, 342 new XmppSignalStrategy(context_->jingle_thread(), xmpp_login_,
342 xmpp_auth_token_, xmpp_auth_service_)); 343 xmpp_auth_token_, xmpp_auth_service_));
343 344
344 signaling_connector_.reset(new SignalingConnector( 345 signaling_connector_.reset(new SignalingConnector(
345 signal_strategy_.get(), 346 signal_strategy_.get(),
346 base::Bind(&HostProcess::OnAuthFailed, base::Unretained(this)))); 347 base::Bind(&HostProcess::OnAuthFailed, base::Unretained(this))));
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 415
415 // Invoked when the user uses the Disconnect windows to terminate 416 // Invoked when the user uses the Disconnect windows to terminate
416 // the sessions. 417 // the sessions.
417 void OnDisconnectRequested() { 418 void OnDisconnectRequested() {
418 DCHECK(message_loop_.message_loop_proxy()->BelongsToCurrentThread()); 419 DCHECK(message_loop_.message_loop_proxy()->BelongsToCurrentThread());
419 420
420 host_->DisconnectAllClients(); 421 host_->DisconnectAllClients();
421 } 422 }
422 423
423 void RestartHost() { 424 void RestartHost() {
424 DCHECK(context_->network_message_loop()->BelongsToCurrentThread()); 425 DCHECK(context_->network_task_runner()->BelongsToCurrentThread());
425 426
426 if (restarting_ || shutting_down_) 427 if (restarting_ || shutting_down_)
427 return; 428 return;
428 429
429 restarting_ = true; 430 restarting_ = true;
430 host_->Shutdown(base::Bind( 431 host_->Shutdown(base::Bind(
431 &HostProcess::RestartOnHostShutdown, base::Unretained(this))); 432 &HostProcess::RestartOnHostShutdown, base::Unretained(this)));
432 } 433 }
433 434
434 void RestartOnHostShutdown() { 435 void RestartOnHostShutdown() {
435 DCHECK(context_->network_message_loop()->BelongsToCurrentThread()); 436 DCHECK(context_->network_task_runner()->BelongsToCurrentThread());
436 437
437 if (shutting_down_) 438 if (shutting_down_)
438 return; 439 return;
439 440
440 restarting_ = false; 441 restarting_ = false;
441 host_ = NULL; 442 host_ = NULL;
442 log_to_server_.reset(); 443 log_to_server_.reset();
443 host_event_logger_.reset(); 444 host_event_logger_.reset();
444 heartbeat_sender_.reset(); 445 heartbeat_sender_.reset();
445 446
446 StartHost(); 447 StartHost();
447 } 448 }
448 449
449 void Shutdown(int exit_code) { 450 void Shutdown(int exit_code) {
450 DCHECK(context_->network_message_loop()->BelongsToCurrentThread()); 451 DCHECK(context_->network_task_runner()->BelongsToCurrentThread());
451 452
452 if (shutting_down_) 453 if (shutting_down_)
453 return; 454 return;
454 455
455 shutting_down_ = true; 456 shutting_down_ = true;
456 exit_code_ = exit_code; 457 exit_code_ = exit_code;
457 host_->Shutdown(base::Bind( 458 host_->Shutdown(base::Bind(
458 &HostProcess::OnShutdownFinished, base::Unretained(this))); 459 &HostProcess::OnShutdownFinished, base::Unretained(this)));
459 } 460 }
460 461
461 void OnShutdownFinished() { 462 void OnShutdownFinished() {
462 DCHECK(context_->network_message_loop()->BelongsToCurrentThread()); 463 DCHECK(context_->network_task_runner()->BelongsToCurrentThread());
463 464
464 // Destroy networking objects while we are on the network thread. 465 // Destroy networking objects while we are on the network thread.
465 host_ = NULL; 466 host_ = NULL;
466 host_event_logger_.reset(); 467 host_event_logger_.reset();
467 log_to_server_.reset(); 468 log_to_server_.reset();
468 heartbeat_sender_.reset(); 469 heartbeat_sender_.reset();
469 signaling_connector_.reset(); 470 signaling_connector_.reset();
470 signal_strategy_.reset(); 471 signal_strategy_.reset();
471 472
472 message_loop_.PostTask(FROM_HERE, MessageLoop::QuitClosure()); 473 message_loop_.PostTask(FROM_HERE, MessageLoop::QuitClosure());
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 582
582 // Mark the process as DPI-aware, so Windows won't scale coordinates in APIs. 583 // Mark the process as DPI-aware, so Windows won't scale coordinates in APIs.
583 SetProcessDPIAware(); 584 SetProcessDPIAware();
584 585
585 // CommandLine::Init() ignores the passed |argc| and |argv| on Windows getting 586 // CommandLine::Init() ignores the passed |argc| and |argv| on Windows getting
586 // the command line from GetCommandLineW(), so we can safely pass NULL here. 587 // the command line from GetCommandLineW(), so we can safely pass NULL here.
587 return main(0, NULL); 588 return main(0, NULL);
588 } 589 }
589 590
590 #endif // defined(OS_WIN) 591 #endif // defined(OS_WIN)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698