OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "chrome/service/service_process.h" | 5 #include "chrome/service/service_process.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 OnServiceEnabled(); | 203 OnServiceEnabled(); |
204 } | 204 } |
205 | 205 |
206 VLOG(1) << "Starting Service Process IPC Server"; | 206 VLOG(1) << "Starting Service Process IPC Server"; |
207 ipc_server_.reset(new ServiceIPCServer( | 207 ipc_server_.reset(new ServiceIPCServer( |
208 service_process_state_->GetServiceProcessChannel())); | 208 service_process_state_->GetServiceProcessChannel())); |
209 ipc_server_->Init(); | 209 ipc_server_->Init(); |
210 | 210 |
211 // After the IPC server has started we signal that the service process is | 211 // After the IPC server has started we signal that the service process is |
212 // ready. | 212 // ready. |
213 if (!state->SignalReady(io_thread_->message_loop_proxy(), | 213 if (!service_process_state_->SignalReady( |
214 NewRunnableMethod(this, &ServiceProcess::Shutdown))) { | 214 io_thread_->message_loop_proxy(), |
| 215 NewRunnableMethod(this, &ServiceProcess::Terminate))) { |
215 return false; | 216 return false; |
216 } | 217 } |
217 | 218 |
218 // See if we need to stay running. | 219 // See if we need to stay running. |
219 ScheduleShutdownCheck(); | 220 ScheduleShutdownCheck(); |
220 return true; | 221 return true; |
221 } | 222 } |
222 | 223 |
223 bool ServiceProcess::Teardown() { | 224 bool ServiceProcess::Teardown() { |
224 service_prefs_.reset(); | 225 service_prefs_.reset(); |
225 cloud_print_proxy_.reset(); | 226 cloud_print_proxy_.reset(); |
226 | 227 |
227 ipc_server_.reset(); | 228 ipc_server_.reset(); |
228 // Signal this event before shutting down the service process. That way all | 229 // Signal this event before shutting down the service process. That way all |
229 // background threads can cleanup. | 230 // background threads can cleanup. |
230 shutdown_event_.Signal(); | 231 shutdown_event_.Signal(); |
231 io_thread_.reset(); | 232 io_thread_.reset(); |
232 file_thread_.reset(); | 233 file_thread_.reset(); |
233 // The NetworkChangeNotifier must be destroyed after all other threads that | 234 // The NetworkChangeNotifier must be destroyed after all other threads that |
234 // might use it have been shut down. | 235 // might use it have been shut down. |
235 network_change_notifier_.reset(); | 236 network_change_notifier_.reset(); |
236 | 237 |
237 service_process_state_->SignalStopped(); | 238 service_process_state_->SignalStopped(); |
238 return true; | 239 return true; |
239 } | 240 } |
240 | 241 |
241 // This method is called when a shutdown command is received from IPC channel | 242 // This method is called when a shutdown command is received from IPC channel |
242 // or there was an error in the IPC channel. | 243 // or there was an error in the IPC channel. |
243 void ServiceProcess::Shutdown() { | 244 void ServiceProcess::Shutdown() { |
244 // Quit the main message loop. | 245 #if defined(OS_MACOSX) |
| 246 // On MacOS X the service must be removed from the launchd job list. |
| 247 // http://www.chromium.org/developers/design-documents/service-processes |
| 248 // The best way to do that is to go through the ForceServiceProcessShutdown |
| 249 // path. If it succeeds Terminate() will be called from the handler registered |
| 250 // via service_process_state_->SignalReady(). |
| 251 // On failure call Terminate() directly to force the process to actually |
| 252 // terminate. |
| 253 if (!ForceServiceProcessShutdown("", 0)) { |
| 254 Terminate(); |
| 255 } |
| 256 #else |
| 257 Terminate(); |
| 258 #endif |
| 259 } |
| 260 |
| 261 void ServiceProcess::Terminate() { |
245 main_message_loop_->PostTask(FROM_HERE, new MessageLoop::QuitTask()); | 262 main_message_loop_->PostTask(FROM_HERE, new MessageLoop::QuitTask()); |
246 } | 263 } |
247 | 264 |
248 bool ServiceProcess::HandleClientDisconnect() { | 265 bool ServiceProcess::HandleClientDisconnect() { |
249 // If there are no enabled services or if there is an update available | 266 // If there are no enabled services or if there is an update available |
250 // we want to shutdown right away. Else we want to keep listening for | 267 // we want to shutdown right away. Else we want to keep listening for |
251 // new connections. | 268 // new connections. |
252 if (!enabled_services_ || update_available()) { | 269 if (!enabled_services_ || update_available()) { |
253 Shutdown(); | 270 Shutdown(); |
254 return false; | 271 return false; |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
345 } else { | 362 } else { |
346 Shutdown(); | 363 Shutdown(); |
347 } | 364 } |
348 } | 365 } |
349 } | 366 } |
350 | 367 |
351 ServiceProcess::~ServiceProcess() { | 368 ServiceProcess::~ServiceProcess() { |
352 Teardown(); | 369 Teardown(); |
353 g_service_process = NULL; | 370 g_service_process = NULL; |
354 } | 371 } |
OLD | NEW |