summaryrefslogtreecommitdiff
path: root/AudioManagerDaemon
diff options
context:
space:
mode:
authorAleksandar Donchev <Aleksander.Donchev@partner.bmw.de>2017-05-19 11:55:01 +0200
committerJacqueline Molz <Jacqueline.Molz@bmw.de>2017-07-10 12:35:05 +0200
commitbe63615585049aa4045f13e91291d64b0a9ed5a3 (patch)
tree9baabfbf751e85d0980f74e55e8332f6e20c379f /AudioManagerDaemon
parent375dc7b81795da9bfd8372f629d7fcef704a6d58 (diff)
downloadaudiomanager-be63615585049aa4045f13e91291d64b0a9ed5a3.tar.gz
The primary signals SIGINT and SIGQUIT are handled on top level in
contrast to secondary signals SIGHUP, SIGTERM, SIGCHLD, which are handled in the SocketHandler. Signed-off-by: Christian Linke <christian.linke@bmw.de> Change-Id: I8c5d3c436ac9fcd61c76a26145c731b427cab1e6
Diffstat (limited to 'AudioManagerDaemon')
-rwxr-xr-xAudioManagerDaemon/src/main.cpp54
1 files changed, 43 insertions, 11 deletions
diff --git a/AudioManagerDaemon/src/main.cpp b/AudioManagerDaemon/src/main.cpp
index 4e8ca47..5c0582e 100755
--- a/AudioManagerDaemon/src/main.cpp
+++ b/AudioManagerDaemon/src/main.cpp
@@ -179,6 +179,36 @@ void printCmdInformation()
exit(0);
}
+/**
+ * the signal handler
+ * @param sig
+ * @param siginfo
+ * @param context
+ */
+static void signalHandler(int sig, siginfo_t *siginfo, void *context)
+{
+ (void) sig;
+ (void) siginfo;
+ (void) context;
+ logInfo("signal handler was called, signal",sig);
+
+ switch (sig)
+ {
+ /*ctl +c lets call direct controllerRundown, because we might be blocked at the moment.
+ But there is the risk of interrupting something important */
+ case SIGINT:
+ CAmControlSender::CallsetControllerRundown(sig);
+ break;
+
+ /* huch- we are getting killed. Better take the fast but risky way: */
+ case SIGQUIT:
+ CAmControlSender::CallsetControllerRundown(sig);
+ break;
+ default:
+ break;
+ }
+}
+
void mainProgram(int argc, char *argv[])
{
@@ -220,6 +250,11 @@ void mainProgram(int argc, char *argv[])
{
throw std::runtime_error(std::string("CAmSocketHandler: Could not create pipe or file descriptor is invalid."));
}
+
+ if( E_OK!=iSocketHandler.listenToSignals({SIGHUP, SIGTERM, SIGCHLD}) )
+ {
+ logWarning("CAmSocketHandler failed to register itself as signal handler.");
+ }
//Register signal handler
sh_pollHandle_t signalHandler;
iSocketHandler.addSignalHandler([&](const sh_pollHandle_t handle, const signalfd_siginfo & info, void* userData){
@@ -231,17 +266,6 @@ void mainProgram(int argc, char *argv[])
switch (sig)
{
- /*ctl +c lets call direct controllerRundown, because we might be blocked at the moment.
- But there is the risk of interrupting something important */
- case SIGINT:
- CAmControlSender::CallsetControllerRundown(sig);
- break;
-
- /* huch- we are getting killed. Better take the fast but risky way: */
- case SIGQUIT:
- CAmControlSender::CallsetControllerRundown(sig);
- break;
-
/* more friendly here assuming systemd wants to stop us, so we can use the mainloop */
case SIGTERM:
CAmControlSender::CallsetControllerRundownSafe(sig);
@@ -364,6 +388,14 @@ int main(int argc, char *argv[], char** envp)
listCommandPluginDirs.push_back(std::string(DEFAULT_PLUGIN_COMMAND_DIR));
listRoutingPluginDirs.push_back(std::string(DEFAULT_PLUGIN_ROUTING_DIR));
+ //critical signals are registered here:
+ struct sigaction signalAction;
+ memset(&signalAction, '\0', sizeof(signalAction));
+ signalAction.sa_sigaction = &signalHandler;
+ signalAction.sa_flags = SA_SIGINFO;
+ sigaction(SIGINT, &signalAction, NULL);
+ sigaction(SIGQUIT, &signalAction, NULL);
+
//register new out of memory handler
std::set_new_handler(&OutOfMemoryHandler);