From 5de7877d74fded76954df070ca4c539113f487d8 Mon Sep 17 00:00:00 2001 From: uvos Date: Mon, 3 Apr 2023 21:34:00 +0200 Subject: [PATCH] Make exit not racey --- main.cpp | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/main.cpp b/main.cpp index 1a6ccec..7964879 100644 --- a/main.cpp +++ b/main.cpp @@ -22,14 +22,14 @@ void intHandler(int dummy) static void printUsage() { - std::cout<<"usage mulitplexer [option]\n\ - Available options:\n\ - -h, --help print this help\n\ - -p, --serialport serial port device to use\n\ - -P, --port tcp port to use\n\ - -b, --baud set baud rate with termios id\n\ - -r, --rates list Available baud rates\n\ - -s, --sinkless run without serial port\n"; + std::cout<<"usage mulitplexer [option]\n" + <<"Available options:\n" + <<"-h, --help print this help\n" + <<"-p, --serialport serial port device to use\n" + <<"-P, --port tcp port to use\n" + <<"-b, --baud set baud rate with termios id\n" + <<"-r, --rates list Available baud rates\n" + <<"-s, --sinkless run without serial port\n"; } @@ -69,7 +69,7 @@ static int parseCmdArgs(int argc, char** argv, Config *config) return 0; } -void recvThreadFunction(int serial, int signal) +void recvThreadFunction(int serial, int exitfd) { int pollQue = epoll_create1(0); struct epoll_event ev = {}; @@ -78,14 +78,14 @@ void recvThreadFunction(int serial, int signal) ev.data.fd = serial; epoll_ctl(pollQue, EPOLL_CTL_ADD, serial, &ev); ev.events = EPOLLIN; - ev.data.fd = signal; - epoll_ctl(pollQue, EPOLL_CTL_ADD, signal, &ev); + ev.data.fd = exitfd; + epoll_ctl(pollQue, EPOLL_CTL_ADD, exitfd, &ev); struct epoll_event event; int ret; while((ret = epoll_wait(pollQue, &event, 1, -1)) > 0) { - if(event.data.fd == signal) + if(event.data.fd == exitfd) break; std::this_thread::sleep_for(std::chrono::milliseconds(100)); char buffer[4096]; @@ -148,7 +148,15 @@ int main(int argc, char* argv[]) signal(SIGTERM, intHandler); signal(SIGPIPE, SIG_IGN); - std::thread readThread(recvThreadFunction, serial, sigfd); + int exitPipe[2]; + int ret = pipe(exitPipe); + if(ret) + { + std::cout<<"Could not create pipe\n"; + return 3; + } + + std::thread readThread(recvThreadFunction, serial, exitPipe[0]); rl_catch_signals = 0; rl_callback_handler_install ("> ", cb_linehandler); @@ -163,13 +171,17 @@ int main(int argc, char* argv[]) epoll_ctl(pollQue, EPOLL_CTL_ADD, sigfd, &ev); struct epoll_event event; - int ret; while((ret = epoll_wait(pollQue, &event, 1, -1)) > 0) { if(event.data.fd == sigfd) + { + write(exitPipe[1], "\n", 1); break; + } else + { rl_callback_read_char(); + } } readThread.join();