diff options
author | Vernon Mauery <vernon.mauery@linux.intel.com> | 2019-03-13 13:11:25 -0700 |
---|---|---|
committer | Vernon Mauery <vernon.mauery@linux.intel.com> | 2019-03-20 13:26:06 -0700 |
commit | 1b7f6f2d01b955cecb79eea8cc21f6fe387ce1f1 (patch) | |
tree | b1f7d52984c4466c3637709d4a59a70f0fcce03a /ipmid-new.cpp | |
parent | 3719c2fc50d33dbe407eb5351d94252406ccec9e (diff) | |
download | phosphor-host-ipmid-1b7f6f2d01b955cecb79eea8cc21f6fe387ce1f1.tar.gz phosphor-host-ipmid-1b7f6f2d01b955cecb79eea8cc21f6fe387ce1f1.zip |
make ipmid respond to SIGTERM and SIGINT for clean shutdown
On some systems ipmid was not responding to SIGTERM so systemd
could not shut it down in a clean manner, resorting to SIGKILL
after a long timeout. This adds code to respond to SIGTERM and
SIGINT and safely unwind all the provider libraries on exit.
Tested-by: running ipmid; in another shell, and running
'killall -15 ipmid' or 'killall -2 ipmid' to send
SIGTERM or SIGINT and watch that ipmid shuts down
in a controlled and timely manner.
Change-Id: I690846796523bebea1a08845c0d17e1df2a94fee
Signed-off-by: Vernon Mauery <vernon.mauery@linux.intel.com>
Diffstat (limited to 'ipmid-new.cpp')
-rw-r--r-- | ipmid-new.cpp | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/ipmid-new.cpp b/ipmid-new.cpp index bf7795c..24d1ce5 100644 --- a/ipmid-new.cpp +++ b/ipmid-new.cpp @@ -63,9 +63,6 @@ namespace fs = std::filesystem; using namespace phosphor::logging; -// Global timer for network changes -std::unique_ptr<phosphor::Timer> networkTimer = nullptr; - // IPMI Spec, shared Reservation ID. static unsigned short selReservationID = 0xFFFF; static bool selReservationValid = false; @@ -560,7 +557,7 @@ using CommandHandler = phosphor::host::command::CommandHandler; std::unique_ptr<phosphor::host::command::Manager> cmdManager; void ipmid_send_cmd_to_host(CommandHandler&& cmd) { - return cmdManager->execute(std::move(cmd)); + return cmdManager->execute(std::forward<CommandHandler>(cmd)); } std::unique_ptr<phosphor::host::command::Manager>& ipmid_get_host_cmd_manager() @@ -619,9 +616,26 @@ int main(int argc, char* argv[]) handleLegacyIpmiCommand); #endif /* ALLOW_DEPRECATED_API */ + // set up boost::asio signal handling + std::function<SignalResponse(int)> stopAsioRunLoop = + [&io](int signalNumber) { + log<level::INFO>("Received signal; quitting", + entry("SIGNAL=%d", signalNumber)); + io->stop(); + return SignalResponse::breakExecution; + }; + registerSignalHandler(ipmi::prioOpenBmcBase, SIGINT, stopAsioRunLoop); + registerSignalHandler(ipmi::prioOpenBmcBase, SIGTERM, stopAsioRunLoop); + io->run(); - // This avoids a warning about unused variables + // destroy all the IPMI handlers so the providers can unload safely + ipmi::handlerMap.clear(); + ipmi::groupHandlerMap.clear(); + ipmi::oemHandlerMap.clear(); + ipmi::filterList.clear(); + // unload the provider libraries handles.clear(); + return 0; } |