#include <stdio.h>
#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
#include <signal.h>
+#include <errno.h>
#include "thread.h"
void Thread::run()
{
should_stop = false;
+ int pipefd[2];
+ if (pipe2(pipefd, O_CLOEXEC) == -1) {
+ perror("pipe");
+ exit(1);
+ }
+ stop_fd_read = pipefd[0];
+ stop_fd_write = pipefd[1];
pthread_create(&worker_thread, NULL, &Thread::do_work_thunk, this);
}
void Thread::stop()
{
should_stop = true;
+ char ch = 0;
+ int err;
+ do {
+ err = write(stop_fd_write, &ch, 1);
+ } while (err == -1 && errno == EINTR);
+
+ if (err == -1) {
+ perror("write");
+ exit(1);
+ }
+
+ do {
+ err = close(stop_fd_write);
+ } while (err == -1 && errno == EINTR);
+
+ if (err == -1) {
+ perror("close");
+ // Can continue (we have close-on-exec).
+ }
+
pthread_kill(worker_thread, SIGHUP);
if (pthread_join(worker_thread, NULL) == -1) {
perror("pthread_join");
exit(1);
}
+
+ do {
+ err = close(stop_fd_read);
+ } while (err == -1 && errno == EINTR);
+
+ if (err == -1) {
+ perror("close");
+ // Can continue (we have close-on-exec).
+ }
}
void *Thread::do_work_thunk(void *arg)