Setup a SIGINT handler

This commit is contained in:
Patrik Dahlström 2020-03-29 20:23:56 +02:00
parent 5b1a71198d
commit ee76a2e854

View File

@ -9,13 +9,18 @@
#include <log4cpp/PatternLayout.hh>
#include <execinfo.h>
#include <memory>
#include "main.hpp"
namespace {
std::weak_ptr<boost::asio::io_service> g_ioService;
/*
* Code from http://stackoverflow.com/a/77336/5419223
*/
static void sigsegv_handler(int sig) {
void sigsegv_handler(int sig) {
constexpr int STACK_DEPTH = 10;
void *array[STACK_DEPTH];
@ -26,8 +31,36 @@ static void sigsegv_handler(int sig) {
exit(1);
}
void sigint_handler(int sig)
{
fprintf(stderr, "Caught SIGINT, trying to stop\n");
if (auto io = g_ioService.lock()) {
io->stop();
}
}
void SetupSignalHandlers()
{
struct sigaction sigIntHandler;
sigIntHandler.sa_handler = sigsegv_handler;
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;
sigaction(SIGSEGV, &sigIntHandler, NULL);
memset(&sigIntHandler, 0, sizeof(sigIntHandler));
sigIntHandler.sa_handler = sigint_handler;
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;
sigaction(SIGINT, &sigIntHandler, NULL);
}
} // anonymous namespace
int main(int argc, char *argv[]) {
signal(SIGSEGV, sigsegv_handler);
SetupSignalHandlers();
int max_calls;
log4cpp::OstreamAppender appender("console", &std::cout);
@ -50,7 +83,8 @@ int main(int argc, char *argv[]) {
sip::IncomingConnectionValidator connectionValidator(conf.getString("sip.validUriExpression"));
boost::asio::io_service ioService;
auto ioService = std::make_shared<boost::asio::io_service>();
g_ioService = ioService;
try {
max_calls = conf.getInt("sip.max_calls");
@ -136,7 +170,7 @@ int main(int argc, char *argv[]) {
for (int i = 0; i<max_calls; i++) {
auto *mumcom = new mumble::MumbleCommunicator(ioService);
auto *mumcom = new mumble::MumbleCommunicator(*ioService);
mumcom->callId = i;
using namespace std::placeholders;
@ -247,7 +281,7 @@ int main(int argc, char *argv[]) {
logger.info("Application started.");
ioService.run();
ioService->run();
return 0;
}