blob: 250ee74e5018c4939aa4da9691b47490b67fa57d [file] [log] [blame]
//
// Copyright (C) 2016 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#include "shill/shill_daemon.h"
#include "shill/logging.h"
#include <sysexits.h>
#include <base/bind.h>
namespace shill {
ShillDaemon::ShillDaemon(const base::Closure& startup_callback,
const shill::DaemonTask::Settings& settings,
Config* config)
: daemon_task_(settings, config), startup_callback_(startup_callback) {}
ShillDaemon::~ShillDaemon() {}
int ShillDaemon::OnInit() {
// Manager DBus interface will get registered as part of this init call.
int return_code = brillo::Daemon::OnInit();
if (return_code != EX_OK) {
return return_code;
}
daemon_task_.Init();
// Signal that we've acquired all resources.
startup_callback_.Run();
return EX_OK;
}
void ShillDaemon::OnShutdown(int* return_code) {
LOG(INFO) << "ShillDaemon received shutdown.";
if (!daemon_task_.Quit(base::Bind(&DaemonTask::BreakTerminationLoop,
base::Unretained(&daemon_task_)))) {
// Run a message loop to allow shill to complete its termination
// procedures. This is different from the secondary loop in
// brillo::Daemon. This loop will run until we explicitly
// breakout of the loop, whereas the secondary loop in
// brillo::Daemon will run until no more tasks are posted on the
// loop. This allows asynchronous D-Bus method calls to complete
// before exiting.
brillo::MessageLoop::current()->Run();
}
brillo::Daemon::OnShutdown(return_code);
}
} // namespace shill