X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=thread.cpp;h=f719eacb95c5379a2d664f23c49c04e0b50b767b;hp=03bfd9d8931bf9e0970ecc0878bc079b3921173d;hb=0d72f384a1de672824298262ba5c427ec0aee2d6;hpb=e1722a5c0341fd541ce57f1eed4dc76cbd3efe07 diff --git a/thread.cpp b/thread.cpp index 03bfd9d..f719eac 100644 --- a/thread.cpp +++ b/thread.cpp @@ -1,23 +1,65 @@ #include #include +#include +#include #include +#include +#include "log.h" #include "thread.h" + +Thread::~Thread() {} void Thread::run() { should_stop = false; + int pipefd[2]; + if (pipe2(pipefd, O_CLOEXEC) == -1) { + log_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) { + log_perror("write"); + exit(1); + } + + do { + err = close(stop_fd_write); + } while (err == -1 && errno == EINTR); + + if (err == -1) { + log_perror("close"); + // Can continue (we have close-on-exec). + } + pthread_kill(worker_thread, SIGHUP); if (pthread_join(worker_thread, NULL) == -1) { - perror("pthread_join"); + log_perror("pthread_join"); exit(1); } + + do { + err = close(stop_fd_read); + } while (err == -1 && errno == EINTR); + + if (err == -1) { + log_perror("close"); + // Can continue (we have close-on-exec). + } } void *Thread::do_work_thunk(void *arg)