Files
Jungfraujoch/writer/jfjoch_writer.cpp
2024-01-30 20:34:30 +01:00

84 lines
2.1 KiB
C++

// Copyright (2019-2023) Paul Scherrer Institute
#include <csignal>
#include "../common/Logger.h"
#include "JFJochWriterHttp.h"
#include "StreamWriter.h"
static Pistache::Http::Endpoint *httpEndpoint;
static StreamWriter *writer;
volatile static bool quitok = false;
static void sigHandler (int sig){
switch(sig){
case SIGINT:
case SIGQUIT:
case SIGTERM:
case SIGHUP:
default:
httpEndpoint->shutdown();
quitok = true;
writer->Cancel();
break;
}
}
static void setUpUnixSignals(std::vector<int> quitSignals) {
sigset_t blocking_mask;
sigemptyset(&blocking_mask);
for (auto sig : quitSignals)
sigaddset(&blocking_mask, sig);
struct sigaction sa;
sa.sa_handler = sigHandler;
sa.sa_mask = blocking_mask;
sa.sa_flags = 0;
for (auto sig : quitSignals)
sigaction(sig, &sa, nullptr);
}
int main(int argc, char **argv) {
RegisterHDF5Filter();
static Logger logger("jfjoch_writer_http");
if ((argc != 3) && (argc != 4)) {
logger.Error("Usage ./jfjoch_writer_http <target ZMQ addr> <TCP port> {<repub ZMQ addr to bind>}");
exit(EXIT_FAILURE);
}
uint16_t http_port = atoi(argv[2]);
std::string repub_address;
if (argc == 4)
repub_address = argv[3];
ZMQContext context;
Pistache::Address addr(Pistache::Ipv4::any(), Pistache::Port(http_port));
writer = new StreamWriter(context, logger, argv[1], repub_address);
httpEndpoint = new Pistache::Http::Endpoint(addr);
auto router = std::make_shared<Pistache::Rest::Router>();
auto opts = Pistache::Http::Endpoint::options().threads(8);
opts.flags(Pistache::Tcp::Options::ReuseAddr);
httpEndpoint->init(opts);
std::vector<int> sigs{SIGQUIT, SIGINT, SIGTERM, SIGHUP};
setUpUnixSignals(sigs);
std::thread writer_thread([] {
while (!quitok)
writer->Run();
});
JFJochWriterHttp writer_http(*writer, router);
httpEndpoint->setHandler(router->handler());
httpEndpoint->serve();
writer_thread.join();
logger.Info("Clean stop");
exit(EXIT_SUCCESS);
}