X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=thread.cpp;fp=thread.cpp;h=b263be649147e5f44952e1a3161bb6a5fb989e68;hp=7aded3bb8cda25790550a3818a4b3a40ff205496;hb=76d52250fd5d7a84d9ae535fd7725d3a466bbb36;hpb=dad4769b3bf91bb45f577625c753994131df8a58 diff --git a/thread.cpp b/thread.cpp index 7aded3b..b263be6 100644 --- a/thread.cpp +++ b/thread.cpp @@ -1,6 +1,9 @@ #include #include +#include +#include #include +#include #include "thread.h" @@ -9,17 +12,53 @@ Thread::~Thread() {} 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)