]> git.sesse.net Git - cubemap/blobdiff - thread.cpp
Signal thread stop through a pipe; fixes issues where the statistics thread would...
[cubemap] / thread.cpp
index 7aded3bb8cda25790550a3818a4b3a40ff205496..b263be649147e5f44952e1a3161bb6a5fb989e68 100644 (file)
@@ -1,6 +1,9 @@
 #include <stdio.h>
 #include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
 #include <signal.h>
+#include <errno.h>
 
 #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)