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