Index: remoting/host/win/host_service.cc |
diff --git a/remoting/host/win/host_service.cc b/remoting/host/win/host_service.cc |
index 00fb718ec6b24cf9ba0a505832761286cabd8db5..3523921d5d5721d30ef173aaea3b53ac1a8ca911 100644 |
--- a/remoting/host/win/host_service.cc |
+++ b/remoting/host/win/host_service.cc |
@@ -27,15 +27,26 @@ |
#include "remoting/base/scoped_sc_handle_win.h" |
#include "remoting/base/stoppable.h" |
#include "remoting/host/branding.h" |
+ |
+#if defined(REMOTING_MULTI_PROCESS) |
+#include "remoting/host/daemon_process.h" |
+#endif // defined(REMOTING_MULTI_PROCESS) |
+ |
#include "remoting/host/usage_stats_consent.h" |
#include "remoting/host/win/host_service_resource.h" |
#include "remoting/host/win/wts_console_observer.h" |
+ |
+#if !defined(REMOTING_MULTI_PROCESS) |
#include "remoting/host/win/wts_session_process_launcher.h" |
+#endif // !defined(REMOTING_MULTI_PROCESS) |
using base::StringPrintf; |
namespace { |
+// Session id that does not represent any session. |
+const uint32 kInvalidSessionId = 0xffffffffu; |
+ |
const char kIoThreadName[] = "I/O thread"; |
// A window class for the session change notifications window. |
@@ -100,8 +111,8 @@ void HostService::RemoveWtsConsoleObserver(WtsConsoleObserver* observer) { |
console_observers_.RemoveObserver(observer); |
} |
-void HostService::OnLauncherShutdown() { |
- launcher_.reset(NULL); |
+void HostService::OnChildStopped() { |
+ child_.reset(NULL); |
main_task_runner_->PostTask(FROM_HERE, MessageLoop::QuitClosure()); |
} |
@@ -138,8 +149,7 @@ BOOL WINAPI HostService::ConsoleControlHandler(DWORD event) { |
case CTRL_LOGOFF_EVENT: |
case CTRL_SHUTDOWN_EVENT: |
self->main_task_runner_->PostTask(FROM_HERE, base::Bind( |
- &WtsSessionProcessLauncher::Stop, |
- base::Unretained(self->launcher_.get()))); |
+ &Stoppable::Stop, base::Unretained(self->child_.get()))); |
self->stopped_event_.Wait(); |
return TRUE; |
@@ -182,22 +192,33 @@ int HostService::Run() { |
} |
void HostService::RunMessageLoop(MessageLoop* message_loop) { |
+#if defined(REMOTING_MULTI_PROCESS) |
+ |
+ child_ = DaemonProcess::Create( |
+ main_task_runner_, |
+ base::Bind(&HostService::OnChildStopped, |
+ base::Unretained(this))).PassAs<Stoppable>(); |
+ |
+#else // !defined(REMOTING_MULTI_PROCESS) |
+ |
// Launch the I/O thread. |
base::Thread io_thread(kIoThreadName); |
base::Thread::Options io_thread_options(MessageLoop::TYPE_IO, 0); |
if (!io_thread.StartWithOptions(io_thread_options)) { |
- LOG(FATAL) << "Failed to start the I/O thread"; |
+ LOG(ERROR) << "Failed to start the I/O thread"; |
stopped_event_.Signal(); |
return; |
} |
// Create the session process launcher. |
- launcher_.reset(new WtsSessionProcessLauncher( |
- base::Bind(&HostService::OnLauncherShutdown, base::Unretained(this)), |
+ child_.reset(new WtsSessionProcessLauncher( |
+ base::Bind(&HostService::OnChildStopped, base::Unretained(this)), |
this, |
main_task_runner_, |
io_thread.message_loop_proxy())); |
+#endif // !defined(REMOTING_MULTI_PROCESS) |
+ |
// Run the service. |
message_loop->Run(); |
@@ -304,8 +325,7 @@ DWORD WINAPI HostService::ServiceControlHandler(DWORD control, |
case SERVICE_CONTROL_SHUTDOWN: |
case SERVICE_CONTROL_STOP: |
self->main_task_runner_->PostTask(FROM_HERE, base::Bind( |
- &WtsSessionProcessLauncher::Stop, |
- base::Unretained(self->launcher_.get()))); |
+ &Stoppable::Stop, base::Unretained(self->child_.get()))); |
self->stopped_event_.Wait(); |
return NO_ERROR; |