mirror of
https://github.com/polybar/polybar.git
synced 2024-11-18 13:55:11 -05:00
refactor(eventloop): Pipe handling
This commit is contained in:
parent
266705e016
commit
3bc408e3cf
5 changed files with 26 additions and 17 deletions
|
@ -29,8 +29,6 @@ class EventLoop
|
|||
int fd_stdout = STDOUT_FILENO;
|
||||
std::string pipe_filename;
|
||||
|
||||
sigset_t wait_mask;
|
||||
|
||||
// <tag, module_name>
|
||||
// std::map<std::string, std::string> stdin_subs;
|
||||
std::vector<std::string> stdin_subs;
|
||||
|
|
|
@ -31,6 +31,7 @@ namespace proc
|
|||
pid_t wait(int *status);
|
||||
pid_t wait_for_completion(pid_t pid, int *status, int options = 0);
|
||||
pid_t wait_for_completion(int *status, int options = 0);
|
||||
pid_t wait_for_completion(pid_t pid);
|
||||
pid_t wait_for_completion_nohang(pid_t pid, int *status);
|
||||
pid_t wait_for_completion_nohang(int *status);
|
||||
pid_t wait_for_completion_nohang();
|
||||
|
|
|
@ -75,16 +75,20 @@ void EventLoop::wait()
|
|||
|
||||
int sig = 0;
|
||||
|
||||
sigemptyset(&this->wait_mask);
|
||||
sigaddset(&this->wait_mask, SIGINT);
|
||||
sigaddset(&this->wait_mask, SIGQUIT);
|
||||
sigaddset(&this->wait_mask, SIGTERM);
|
||||
sigset_t wait_mask;
|
||||
sigemptyset(&wait_mask);
|
||||
sigaddset(&wait_mask, SIGINT);
|
||||
sigaddset(&wait_mask, SIGQUIT);
|
||||
sigaddset(&wait_mask, SIGTERM);
|
||||
|
||||
if (pthread_sigmask(SIG_BLOCK, &this->wait_mask, nullptr) == -1)
|
||||
if (pthread_sigmask(SIG_BLOCK, &wait_mask, nullptr) == -1)
|
||||
logger->fatal(StrErrno());
|
||||
|
||||
// Ignore SIGPIPE since we'll handle it manually
|
||||
signal(SIGPIPE, SIG_IGN);
|
||||
|
||||
// Wait for termination signal
|
||||
sigwait(&this->wait_mask, &sig);
|
||||
sigwait(&wait_mask, &sig);
|
||||
|
||||
this->logger->info("Termination signal received... Shutting down");
|
||||
}
|
||||
|
@ -134,6 +138,11 @@ void EventLoop::loop_write()
|
|||
this->write_stdout();
|
||||
} catch (Exception &e) {
|
||||
this->logger->error(e.what());
|
||||
|
||||
auto pid = proc::get_process_id();
|
||||
proc::kill(pid, SIGTERM);
|
||||
proc::wait_for_completion(pid);
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -207,11 +216,10 @@ void EventLoop::write_stdout()
|
|||
if (!this->running())
|
||||
return;
|
||||
|
||||
// dprintf(this->fd_stdout, "\033[2J\033[1;1H\033[0mCleared! \033[35;1m %s\n", data.c_str());
|
||||
dprintf(this->fd_stdout, "%s\n", data.c_str());
|
||||
if (dprintf(this->fd_stdout, "%s\n", data.c_str()) == -1)
|
||||
throw EventLoopTerminate("Failed to write to stdout");
|
||||
} catch (RegistryError &e) {
|
||||
this->logger->error(e.what());
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -51,12 +51,6 @@ int main(int argc, char **argv)
|
|||
int retval = EXIT_SUCCESS;
|
||||
auto logger = get_logger();
|
||||
|
||||
sigset_t pipe_mask;
|
||||
sigemptyset(&pipe_mask);
|
||||
sigaddset(&pipe_mask, SIGPIPE);
|
||||
if (pthread_sigmask(SIG_BLOCK, &pipe_mask, nullptr) == -1)
|
||||
logger->fatal(StrErrno());
|
||||
|
||||
try {
|
||||
auto usage = "Usage: "+ std::string(argv[0]) + " bar_name [OPTION...]";
|
||||
|
||||
|
@ -201,5 +195,7 @@ int main(int argc, char **argv)
|
|||
|
||||
while (proc::wait_for_completion_nohang() > 0);
|
||||
|
||||
log_trace("Reached end of application");
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
|
|
@ -95,6 +95,12 @@ namespace proc
|
|||
return wait_for_completion(-1, status, options);
|
||||
}
|
||||
|
||||
pid_t wait_for_completion(pid_t pid)
|
||||
{
|
||||
int status;
|
||||
return wait_for_completion(pid, &status);
|
||||
}
|
||||
|
||||
pid_t wait_for_completion_nohang(pid_t pid, int *status) {
|
||||
return wait_for_completion(pid, status, WNOHANG);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue