Chromium Code Reviews| Index: remoting/host/remoting_me2me_host.cc |
| diff --git a/remoting/host/remoting_me2me_host.cc b/remoting/host/remoting_me2me_host.cc |
| index f2aa98331acea8f1f8076cf4540bed9a2c5220c0..9b7d9fda1b03b525aea8b204e3a51f53c6a89354 100644 |
| --- a/remoting/host/remoting_me2me_host.cc |
| +++ b/remoting/host/remoting_me2me_host.cc |
| @@ -14,6 +14,7 @@ |
| #include "base/files/file_path.h" |
| #include "base/files/file_util.h" |
| #include "base/memory/scoped_ptr.h" |
| +#include "base/memory/weak_ptr.h" |
| #include "base/message_loop/message_loop.h" |
| #include "base/single_thread_task_runner.h" |
| #include "base/strings/string_number_conversions.h" |
| @@ -26,7 +27,6 @@ |
| #include "ipc/ipc_channel_proxy.h" |
| #include "ipc/ipc_listener.h" |
| #include "media/base/media.h" |
| -#include "net/base/network_change_notifier.h" |
| #include "net/socket/client_socket_factory.h" |
| #include "net/socket/ssl_server_socket.h" |
| #include "net/url_request/url_fetcher.h" |
| @@ -45,8 +45,6 @@ |
| #include "remoting/host/config_watcher.h" |
| #include "remoting/host/desktop_environment.h" |
| #include "remoting/host/desktop_session_connector.h" |
| -#include "remoting/host/dns_blackhole_checker.h" |
| -#include "remoting/host/heartbeat_sender.h" |
| #include "remoting/host/host_change_notification_listener.h" |
| #include "remoting/host/host_config.h" |
| #include "remoting/host/host_event_logger.h" |
| @@ -58,10 +56,10 @@ |
| #include "remoting/host/ipc_host_event_logger.h" |
| #include "remoting/host/logging.h" |
| #include "remoting/host/me2me_desktop_environment.h" |
| +#include "remoting/host/minimum_heartbeat_supporter.h" |
| #include "remoting/host/pairing_registry_delegate.h" |
| #include "remoting/host/policy_hack/policy_watcher.h" |
| #include "remoting/host/session_manager_factory.h" |
| -#include "remoting/host/signaling_connector.h" |
| #include "remoting/host/single_window_desktop_environment.h" |
| #include "remoting/host/token_validator_factory_impl.h" |
| #include "remoting/host/usage_stats_consent.h" |
| @@ -240,6 +238,8 @@ class HostProcess |
| bool OnPairingPolicyUpdate(base::DictionaryValue* policies); |
| bool OnGnubbyAuthPolicyUpdate(base::DictionaryValue* policies); |
| + scoped_refptr<MinimumHeartbeatSupporter> CreateMinimumHeartbeatSupporter(); |
| + |
| void StartHost(); |
| void OnHeartbeatSuccessful(); |
| @@ -252,8 +252,6 @@ class HostProcess |
| // Stops the host and shuts down the process with the specified |exit_code|. |
| void ShutdownHost(HostExitCodes exit_code); |
| - void ScheduleHostShutdown(); |
| - |
| void ShutdownOnNetworkThread(); |
| void OnPolicyWatcherShutdown(); |
| @@ -267,9 +265,6 @@ class HostProcess |
| scoped_ptr<ChromotingHostContext> context_; |
| - // Created on the UI thread but used from the network thread. |
| - scoped_ptr<net::NetworkChangeNotifier> network_change_notifier_; |
| - |
| // Accessed on the UI thread. |
| scoped_ptr<IPC::ChannelProxy> daemon_channel_; |
| @@ -319,10 +314,7 @@ class HostProcess |
| // Used to specify which window to stream, if enabled. |
| webrtc::WindowId window_id_; |
| - scoped_ptr<OAuthTokenGetter> oauth_token_getter_; |
| - scoped_ptr<XmppSignalStrategy> signal_strategy_; |
| - scoped_ptr<SignalingConnector> signaling_connector_; |
| - scoped_ptr<HeartbeatSender> heartbeat_sender_; |
| + scoped_refptr<MinimumHeartbeatSupporter> minimum_heartbeat_supporter_; |
| scoped_ptr<HostChangeNotificationListener> host_change_notification_listener_; |
| scoped_ptr<HostStatusLogger> host_status_logger_; |
| scoped_ptr<HostEventLogger> host_event_logger_; |
| @@ -340,6 +332,7 @@ class HostProcess |
| bool signal_parent_; |
| scoped_ptr<PairingRegistry::Delegate> pairing_registry_delegate_; |
| + base::WeakPtrFactory<HostProcess> weak_factory_for_network_task_runner_; |
|
Lambros
2014/12/05 22:19:49
It seems strange to move network_task_runner_ into
Łukasz Anforowicz
2014/12/05 23:59:28
This is here to stay for the long term.
1. networ
|
| }; |
| HostProcess::HostProcess(scoped_ptr<ChromotingHostContext> context, |
| @@ -364,7 +357,8 @@ HostProcess::HostProcess(scoped_ptr<ChromotingHostContext> context, |
| #endif // defined(REMOTING_MULTI_PROCESS) |
| self_(this), |
| exit_code_out_(exit_code_out), |
| - signal_parent_(false) { |
| + signal_parent_(false), |
| + weak_factory_for_network_task_runner_(this) { |
| StartOnUiThread(); |
| } |
| @@ -746,7 +740,6 @@ void HostProcess::ShutdownOnUiThread() { |
| DCHECK(context_->ui_task_runner()->BelongsToCurrentThread()); |
| // Tear down resources that need to be torn down on the UI thread. |
| - network_change_notifier_.reset(); |
| daemon_channel_.reset(); |
| desktop_environment_factory_.reset(); |
| @@ -762,7 +755,6 @@ void HostProcess::ShutdownOnUiThread() { |
| #endif |
| } |
| -// Overridden from HeartbeatSender::Listener |
| void HostProcess::OnUnknownHostIdError() { |
| LOG(ERROR) << "Host ID not found."; |
| ShutdownHost(kInvalidHostIdExitCode); |
| @@ -849,7 +841,8 @@ bool HostProcess::ApplyConfig(const base::DictionaryValue& config) { |
| } |
| if (!oauth_refresh_token_.empty()) { |
| - // SignalingConnector is responsible for getting OAuth token. |
| + // SignalingConnector (inside MinimumHeartbeatSupporter) is responsible for |
| + // getting OAuth token. |
| xmpp_server_config_.auth_token = ""; |
| xmpp_server_config_.auth_service = "oauth2"; |
| } else if (!config.GetString(kXmppAuthServiceConfigPath, |
| @@ -1229,44 +1222,30 @@ bool HostProcess::OnGnubbyAuthPolicyUpdate(base::DictionaryValue* policies) { |
| return true; |
| } |
| +scoped_refptr<MinimumHeartbeatSupporter> |
| +HostProcess::CreateMinimumHeartbeatSupporter() { |
| + DCHECK(!host_id_.empty()); // Assumming |ApplyConfig| has already been run. |
| + return MinimumHeartbeatSupporter::Create( |
| + base::Bind(&HostProcess::OnHeartbeatSuccessful, |
| + weak_factory_for_network_task_runner_.GetWeakPtr()), |
| + base::Bind(&HostProcess::OnUnknownHostIdError, |
| + weak_factory_for_network_task_runner_.GetWeakPtr()), |
| + base::Bind(&HostProcess::OnAuthFailed, |
| + weak_factory_for_network_task_runner_.GetWeakPtr()), |
| + *context_, xmpp_server_config_, talkgadget_prefix_, host_id_, key_pair_, |
| + directory_bot_jid_, oauth_refresh_token_, use_service_account_); |
| +} |
| + |
| void HostProcess::StartHost() { |
| DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| DCHECK(!host_); |
| - DCHECK(!signal_strategy_.get()); |
| + DCHECK(!minimum_heartbeat_supporter_.get()); |
| + |
| DCHECK(state_ == HOST_INITIALIZING || state_ == HOST_STOPPING_TO_RESTART || |
| state_ == HOST_STOPPED) << state_; |
| state_ = HOST_STARTED; |
| - signal_strategy_.reset( |
| - new XmppSignalStrategy(net::ClientSocketFactory::GetDefaultFactory(), |
| - context_->url_request_context_getter(), |
| - xmpp_server_config_)); |
| - |
| - scoped_ptr<DnsBlackholeChecker> dns_blackhole_checker( |
| - new DnsBlackholeChecker(context_->url_request_context_getter(), |
| - talkgadget_prefix_)); |
| - |
| - // Create a NetworkChangeNotifier for use by the signaling connector. |
| - network_change_notifier_.reset(net::NetworkChangeNotifier::Create()); |
| - |
| - signaling_connector_.reset(new SignalingConnector( |
| - signal_strategy_.get(), |
| - dns_blackhole_checker.Pass(), |
| - base::Bind(&HostProcess::OnAuthFailed, this))); |
| - |
| - if (!oauth_refresh_token_.empty()) { |
| - scoped_ptr<OAuthTokenGetter::OAuthCredentials> oauth_credentials; |
| - oauth_credentials.reset( |
| - new OAuthTokenGetter::OAuthCredentials( |
| - xmpp_server_config_.username, oauth_refresh_token_, |
| - use_service_account_)); |
| - |
| - oauth_token_getter_.reset(new OAuthTokenGetter( |
| - oauth_credentials.Pass(), context_->url_request_context_getter(), |
| - false)); |
| - |
| - signaling_connector_->EnableOAuth(oauth_token_getter_.get()); |
| - } |
| + minimum_heartbeat_supporter_ = CreateMinimumHeartbeatSupporter(); |
| uint32 network_flags = 0; |
| if (allow_nat_traversal_) { |
| @@ -1290,15 +1269,14 @@ void HostProcess::StartHost() { |
| } |
| host_.reset(new ChromotingHost( |
| - signal_strategy_.get(), |
| + minimum_heartbeat_supporter_->signal_strategy(), |
| desktop_environment_factory_.get(), |
| - CreateHostSessionManager(signal_strategy_.get(), network_settings, |
| + CreateHostSessionManager(minimum_heartbeat_supporter_->signal_strategy(), |
| + network_settings, |
| context_->url_request_context_getter()), |
| - context_->audio_task_runner(), |
| - context_->input_task_runner(), |
| + context_->audio_task_runner(), context_->input_task_runner(), |
| context_->video_capture_task_runner(), |
| - context_->video_encode_task_runner(), |
| - context_->network_task_runner(), |
| + context_->video_encode_task_runner(), context_->network_task_runner(), |
| context_->ui_task_runner())); |
| if (enable_vp9_) { |
| @@ -1320,17 +1298,13 @@ void HostProcess::StartHost() { |
| host_->SetMaximumSessionDuration(base::TimeDelta::FromHours(20)); |
| #endif |
| - heartbeat_sender_.reset(new HeartbeatSender( |
| - base::Bind(&HostProcess::OnHeartbeatSuccessful, base::Unretained(this)), |
| - base::Bind(&HostProcess::OnUnknownHostIdError, base::Unretained(this)), |
| - host_id_, signal_strategy_.get(), key_pair_, directory_bot_jid_)); |
| - |
| host_change_notification_listener_.reset(new HostChangeNotificationListener( |
| - this, host_id_, signal_strategy_.get(), directory_bot_jid_)); |
| + this, host_id_, minimum_heartbeat_supporter_->signal_strategy(), |
| + directory_bot_jid_)); |
| - host_status_logger_.reset( |
| - new HostStatusLogger(host_->AsWeakPtr(), ServerLogEntry::ME2ME, |
| - signal_strategy_.get(), directory_bot_jid_)); |
| + host_status_logger_.reset(new HostStatusLogger( |
| + host_->AsWeakPtr(), ServerLogEntry::ME2ME, |
| + minimum_heartbeat_supporter_->signal_strategy(), directory_bot_jid_)); |
| // Set up reporting the host status notifications. |
| #if defined(REMOTING_MULTI_PROCESS) |
| @@ -1367,14 +1341,23 @@ void HostProcess::ShutdownHost(HostExitCodes exit_code) { |
| switch (state_) { |
| case HOST_INITIALIZING: |
| state_ = HOST_STOPPING; |
| + { |
| + DCHECK(!minimum_heartbeat_supporter_.get()); |
| + scoped_refptr<MinimumHeartbeatSupporter> tmpHeartbeatSupporter = |
| + CreateMinimumHeartbeatSupporter(); |
| + tmpHeartbeatSupporter->SendHostOfflineReason( |
| + ExitCodeToString(exit_code), |
| + base::TimeDelta::FromSeconds(30) /* timeout */); |
|
Lambros
2014/12/05 22:19:49
30s feels much too long to be delaying process exi
Łukasz Anforowicz
2014/12/05 23:59:28
I'll change this to 10 seconds.
Note that this ti
Lambros
2014/12/06 01:25:05
No, there is an actual interaction. The Python scr
|
| + } |
| ShutdownOnNetworkThread(); |
| break; |
| case HOST_STARTED: |
| state_ = HOST_STOPPING; |
| - heartbeat_sender_->SetHostOfflineReason( |
| - ExitCodeToString(exit_code), base::Bind(base::DoNothing)); |
| - ScheduleHostShutdown(); |
| + minimum_heartbeat_supporter_->SendHostOfflineReason( |
| + ExitCodeToString(exit_code), |
| + base::TimeDelta::FromSeconds(30) /* timeout */); |
|
Lambros
2014/12/05 22:19:48
Same here.
Łukasz Anforowicz
2014/12/05 23:59:28
Done.
|
| + ShutdownOnNetworkThread(); |
| break; |
| case HOST_STOPPING_TO_RESTART: |
| @@ -1388,28 +1371,17 @@ void HostProcess::ShutdownHost(HostExitCodes exit_code) { |
| } |
| } |
| -// TODO(weitaosu): shut down the host once we get an ACK for the offline status |
| -// XMPP message. |
| -void HostProcess::ScheduleHostShutdown() { |
| - // Delay the shutdown by 2 second to allow SendOfflineStatus to complete. |
| - context_->network_task_runner()->PostDelayedTask( |
| - FROM_HERE, |
| - base::Bind(&HostProcess::ShutdownOnNetworkThread, base::Unretained(this)), |
| - base::TimeDelta::FromSeconds(2)); |
| -} |
| - |
| void HostProcess::ShutdownOnNetworkThread() { |
| DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
| + // Need to invalidate WeakPtrs on the same thread where they are dereferenced. |
| + weak_factory_for_network_task_runner_.InvalidateWeakPtrs(); |
| + |
| host_.reset(); |
| host_event_logger_.reset(); |
| host_status_logger_.reset(); |
| - heartbeat_sender_.reset(); |
| + minimum_heartbeat_supporter_ = nullptr; |
| host_change_notification_listener_.reset(); |
| - signaling_connector_.reset(); |
| - oauth_token_getter_.reset(); |
| - signal_strategy_.reset(); |
| - network_change_notifier_.reset(); |
| if (state_ == HOST_STOPPING_TO_RESTART) { |
| StartHost(); |