160ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan// 260ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan// Copyright (C) 2016 The Android Open Source Project 360ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan// 460ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan// Licensed under the Apache License, Version 2.0 (the "License"); 560ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan// you may not use this file except in compliance with the License. 660ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan// You may obtain a copy of the License at 760ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan// 860ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan// http://www.apache.org/licenses/LICENSE-2.0 960ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan// 1060ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan// Unless required by applicable law or agreed to in writing, software 1160ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan// distributed under the License is distributed on an "AS IS" BASIS, 1260ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1360ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan// See the License for the specific language governing permissions and 1460ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan// limitations under the License. 1560ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan// 1660ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan 1760ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan#include "shill/shill_daemon.h" 1860ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan 1960ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan#include <sysexits.h> 2060ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan 2160ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan#include <base/bind.h> 2260ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan 2360ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tanusing base::Bind; 2460ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tanusing base::Unretained; 2560ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan 2660ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tannamespace shill { 2760ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan 2860ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel TanShillDaemon::ShillDaemon(const base::Closure& startup_callback, 2959b397b6ac7fa39edf26d8e0ff2ecac6ac8ebc5bSamuel Tan const shill::DaemonTask::Settings& settings, 3060ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan Config* config) 3159b397b6ac7fa39edf26d8e0ff2ecac6ac8ebc5bSamuel Tan : DaemonTask(settings, config), startup_callback_(startup_callback) {} 3260ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan 3360ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel TanShillDaemon::~ShillDaemon() {} 3460ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan 3560ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tanint ShillDaemon::OnInit() { 3660ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan // Manager DBus interface will get registered as part of this init call. 3760ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan int return_code = brillo::Daemon::OnInit(); 3860ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan if (return_code != EX_OK) { 3960ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan return return_code; 4060ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan } 4160ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan 4260ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan Init(); 4360ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan 4460ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan // Signal that we've acquired all resources. 4560ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan startup_callback_.Run(); 4660ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan 4760ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan return EX_OK; 4860ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan} 4960ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan 5060ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tanvoid ShillDaemon::OnShutdown(int* return_code) { 5159b397b6ac7fa39edf26d8e0ff2ecac6ac8ebc5bSamuel Tan if (!DaemonTask::Quit(base::Bind(&DaemonTask::BreakTerminationLoop, 5259b397b6ac7fa39edf26d8e0ff2ecac6ac8ebc5bSamuel Tan base::Unretained(this)))) { 5360ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan // Run a message loop to allow shill to complete its termination 5460ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan // procedures. This is different from the secondary loop in 5560ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan // brillo::Daemon. This loop will run until we explicitly 5660ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan // breakout of the loop, whereas the secondary loop in 5760ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan // brillo::Daemon will run until no more tasks are posted on the 5860ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan // loop. This allows asynchronous D-Bus method calls to complete 5960ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan // before exiting. 6060ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan brillo::MessageLoop::current()->Run(); 6160ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan } 6260ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan 6360ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan brillo::Daemon::OnShutdown(return_code); 6460ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan} 6560ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan 6660ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan} // namespace shill 67