OLD | NEW |
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 #include "remoting/host/daemon_process.h" | 5 #include "remoting/host/daemon_process.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
11 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" |
12 #include "base/callback_helpers.h" | 12 #include "base/callback_helpers.h" |
13 #include "base/command_line.h" | 13 #include "base/command_line.h" |
14 #include "base/files/file_path.h" | 14 #include "base/files/file_path.h" |
15 #include "base/files/file_util.h" | 15 #include "base/files/file_util.h" |
16 #include "base/location.h" | 16 #include "base/location.h" |
17 #include "base/single_thread_task_runner.h" | 17 #include "base/single_thread_task_runner.h" |
18 #include "remoting/base/auto_thread_task_runner.h" | 18 #include "remoting/base/auto_thread_task_runner.h" |
| 19 #include "remoting/base/constants.h" |
19 #include "remoting/host/branding.h" | 20 #include "remoting/host/branding.h" |
20 #include "remoting/host/chromoting_messages.h" | 21 #include "remoting/host/chromoting_messages.h" |
21 #include "remoting/host/config_file_watcher.h" | 22 #include "remoting/host/config_file_watcher.h" |
22 #include "remoting/host/desktop_session.h" | 23 #include "remoting/host/desktop_session.h" |
23 #include "remoting/host/host_event_logger.h" | 24 #include "remoting/host/host_event_logger.h" |
24 #include "remoting/host/host_exit_codes.h" | 25 #include "remoting/host/host_exit_codes.h" |
25 #include "remoting/host/host_status_observer.h" | 26 #include "remoting/host/host_status_observer.h" |
| 27 #include "remoting/host/process_stats_sender.h" |
26 #include "remoting/host/screen_resolution.h" | 28 #include "remoting/host/screen_resolution.h" |
27 #include "remoting/protocol/transport.h" | 29 #include "remoting/protocol/transport.h" |
28 | 30 |
29 namespace remoting { | 31 namespace remoting { |
30 | 32 |
31 namespace { | 33 namespace { |
32 | 34 |
33 // This is used for tagging system event logs. | 35 // This is used for tagging system event logs. |
34 const char kApplicationName[] = "chromoting"; | 36 const char kApplicationName[] = "chromoting"; |
35 | 37 |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
113 IPC_MESSAGE_HANDLER(ChromotingNetworkDaemonMsg_ClientConnected, | 115 IPC_MESSAGE_HANDLER(ChromotingNetworkDaemonMsg_ClientConnected, |
114 OnClientConnected) | 116 OnClientConnected) |
115 IPC_MESSAGE_HANDLER(ChromotingNetworkDaemonMsg_ClientDisconnected, | 117 IPC_MESSAGE_HANDLER(ChromotingNetworkDaemonMsg_ClientDisconnected, |
116 OnClientDisconnected) | 118 OnClientDisconnected) |
117 IPC_MESSAGE_HANDLER(ChromotingNetworkDaemonMsg_ClientRouteChange, | 119 IPC_MESSAGE_HANDLER(ChromotingNetworkDaemonMsg_ClientRouteChange, |
118 OnClientRouteChange) | 120 OnClientRouteChange) |
119 IPC_MESSAGE_HANDLER(ChromotingNetworkDaemonMsg_HostStarted, | 121 IPC_MESSAGE_HANDLER(ChromotingNetworkDaemonMsg_HostStarted, |
120 OnHostStarted) | 122 OnHostStarted) |
121 IPC_MESSAGE_HANDLER(ChromotingNetworkDaemonMsg_HostShutdown, | 123 IPC_MESSAGE_HANDLER(ChromotingNetworkDaemonMsg_HostShutdown, |
122 OnHostShutdown) | 124 OnHostShutdown) |
| 125 IPC_MESSAGE_HANDLER(ChromotingNetworkToAnyMsg_StartProcessStatsReport, |
| 126 StartProcessStatsReport) |
| 127 IPC_MESSAGE_HANDLER(ChromotingNetworkToAnyMsg_StopProcessStatsReport, |
| 128 StopProcessStatsReport) |
123 IPC_MESSAGE_UNHANDLED(handled = false) | 129 IPC_MESSAGE_UNHANDLED(handled = false) |
124 IPC_END_MESSAGE_MAP() | 130 IPC_END_MESSAGE_MAP() |
125 | 131 |
126 if (!handled) { | 132 if (!handled) { |
127 LOG(ERROR) << "Received unexpected IPC type: " << message.type(); | 133 LOG(ERROR) << "Received unexpected IPC type: " << message.type(); |
128 CrashNetworkProcess(FROM_HERE); | 134 CrashNetworkProcess(FROM_HERE); |
129 } | 135 } |
130 | 136 |
131 return handled; | 137 return handled; |
132 } | 138 } |
133 | 139 |
134 void DaemonProcess::OnPermanentError(int exit_code) { | 140 void DaemonProcess::OnPermanentError(int exit_code) { |
135 DCHECK(caller_task_runner()->BelongsToCurrentThread()); | 141 DCHECK(caller_task_runner()->BelongsToCurrentThread()); |
136 DCHECK(kMinPermanentErrorExitCode <= exit_code && | 142 DCHECK(kMinPermanentErrorExitCode <= exit_code && |
137 exit_code <= kMaxPermanentErrorExitCode); | 143 exit_code <= kMaxPermanentErrorExitCode); |
138 | 144 |
139 Stop(); | 145 Stop(); |
140 } | 146 } |
141 | 147 |
| 148 void DaemonProcess::OnWorkerProcessStopped() { |
| 149 process_stats_request_count_ = 0; |
| 150 stats_sender_.reset(); |
| 151 } |
| 152 |
142 void DaemonProcess::CloseDesktopSession(int terminal_id) { | 153 void DaemonProcess::CloseDesktopSession(int terminal_id) { |
143 DCHECK(caller_task_runner()->BelongsToCurrentThread()); | 154 DCHECK(caller_task_runner()->BelongsToCurrentThread()); |
144 | 155 |
145 // Validate the supplied terminal ID. An attempt to use a desktop session ID | 156 // Validate the supplied terminal ID. An attempt to use a desktop session ID |
146 // that couldn't possibly have been allocated is considered a protocol error | 157 // that couldn't possibly have been allocated is considered a protocol error |
147 // and the network process will be restarted. | 158 // and the network process will be restarted. |
148 if (!WasTerminalIdAllocated(terminal_id)) { | 159 if (!WasTerminalIdAllocated(terminal_id)) { |
149 LOG(ERROR) << "Invalid terminal ID: " << terminal_id; | 160 LOG(ERROR) << "Invalid terminal ID: " << terminal_id; |
150 CrashNetworkProcess(FROM_HERE); | 161 CrashNetworkProcess(FROM_HERE); |
151 return; | 162 return; |
(...skipping 21 matching lines...) Expand all Loading... |
173 } | 184 } |
174 | 185 |
175 DaemonProcess::DaemonProcess( | 186 DaemonProcess::DaemonProcess( |
176 scoped_refptr<AutoThreadTaskRunner> caller_task_runner, | 187 scoped_refptr<AutoThreadTaskRunner> caller_task_runner, |
177 scoped_refptr<AutoThreadTaskRunner> io_task_runner, | 188 scoped_refptr<AutoThreadTaskRunner> io_task_runner, |
178 const base::Closure& stopped_callback) | 189 const base::Closure& stopped_callback) |
179 : caller_task_runner_(caller_task_runner), | 190 : caller_task_runner_(caller_task_runner), |
180 io_task_runner_(io_task_runner), | 191 io_task_runner_(io_task_runner), |
181 next_terminal_id_(0), | 192 next_terminal_id_(0), |
182 stopped_callback_(stopped_callback), | 193 stopped_callback_(stopped_callback), |
| 194 current_process_stats_("DaemonProcess"), |
183 weak_factory_(this) { | 195 weak_factory_(this) { |
184 DCHECK(caller_task_runner->BelongsToCurrentThread()); | 196 DCHECK(caller_task_runner->BelongsToCurrentThread()); |
185 // TODO(sammc): On OSX, mojo::edk::SetMachPortProvider() should be called with | 197 // TODO(sammc): On OSX, mojo::edk::SetMachPortProvider() should be called with |
186 // a base::PortProvider implementation. Add it here when this code is used on | 198 // a base::PortProvider implementation. Add it here when this code is used on |
187 // OSX. | 199 // OSX. |
188 } | 200 } |
189 | 201 |
190 void DaemonProcess::CreateDesktopSession(int terminal_id, | 202 void DaemonProcess::CreateDesktopSession(int terminal_id, |
191 const ScreenResolution& resolution, | 203 const ScreenResolution& resolution, |
192 bool virtual_terminal) { | 204 bool virtual_terminal) { |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
280 host_event_logger_ = | 292 host_event_logger_ = |
281 HostEventLogger::Create(weak_factory_.GetWeakPtr(), kApplicationName); | 293 HostEventLogger::Create(weak_factory_.GetWeakPtr(), kApplicationName); |
282 | 294 |
283 // Launch the process. | 295 // Launch the process. |
284 LaunchNetworkProcess(); | 296 LaunchNetworkProcess(); |
285 } | 297 } |
286 | 298 |
287 void DaemonProcess::Stop() { | 299 void DaemonProcess::Stop() { |
288 DCHECK(caller_task_runner()->BelongsToCurrentThread()); | 300 DCHECK(caller_task_runner()->BelongsToCurrentThread()); |
289 | 301 |
| 302 OnWorkerProcessStopped(); |
| 303 |
290 if (!stopped_callback_.is_null()) { | 304 if (!stopped_callback_.is_null()) { |
291 base::ResetAndReturn(&stopped_callback_).Run(); | 305 base::ResetAndReturn(&stopped_callback_).Run(); |
292 } | 306 } |
293 } | 307 } |
294 | 308 |
295 bool DaemonProcess::WasTerminalIdAllocated(int terminal_id) { | 309 bool DaemonProcess::WasTerminalIdAllocated(int terminal_id) { |
296 return terminal_id < next_terminal_id_; | 310 return terminal_id < next_terminal_id_; |
297 } | 311 } |
298 | 312 |
299 void DaemonProcess::OnAccessDenied(const std::string& jid) { | 313 void DaemonProcess::OnAccessDenied(const std::string& jid) { |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
358 observer.OnShutdown(); | 372 observer.OnShutdown(); |
359 } | 373 } |
360 | 374 |
361 void DaemonProcess::DeleteAllDesktopSessions() { | 375 void DaemonProcess::DeleteAllDesktopSessions() { |
362 while (!desktop_sessions_.empty()) { | 376 while (!desktop_sessions_.empty()) { |
363 delete desktop_sessions_.front(); | 377 delete desktop_sessions_.front(); |
364 desktop_sessions_.pop_front(); | 378 desktop_sessions_.pop_front(); |
365 } | 379 } |
366 } | 380 } |
367 | 381 |
| 382 void DaemonProcess::StartProcessStatsReport(base::TimeDelta interval) { |
| 383 DCHECK(caller_task_runner()->BelongsToCurrentThread()); |
| 384 if (interval <= base::TimeDelta::FromSeconds(0)) { |
| 385 interval = kDefaultProcessStatsInterval; |
| 386 } |
| 387 |
| 388 process_stats_request_count_++; |
| 389 DCHECK_GT(process_stats_request_count_, 0); |
| 390 if (process_stats_request_count_ == 1 || |
| 391 stats_sender_->interval() > interval) { |
| 392 DCHECK_EQ(process_stats_request_count_ == 1, !stats_sender_); |
| 393 stats_sender_.reset(new ProcessStatsSender( |
| 394 this, |
| 395 interval, |
| 396 { ¤t_process_stats_ })); |
| 397 } |
| 398 } |
| 399 |
| 400 void DaemonProcess::StopProcessStatsReport() { |
| 401 DCHECK(caller_task_runner()->BelongsToCurrentThread()); |
| 402 process_stats_request_count_--; |
| 403 DCHECK_GE(process_stats_request_count_, 0); |
| 404 if (process_stats_request_count_ == 0) { |
| 405 DCHECK(stats_sender_); |
| 406 stats_sender_.reset(); |
| 407 } |
| 408 } |
| 409 |
| 410 void DaemonProcess::OnProcessStats( |
| 411 const protocol::AggregatedProcessResourceUsage& usage) { |
| 412 SendToNetwork(new ChromotingAnyToNetworkMsg_ReportProcessStats(usage)); |
| 413 } |
| 414 |
368 } // namespace remoting | 415 } // namespace remoting |
OLD | NEW |