Revert "Rewrite the entire internal signal handling/wakeup."
[cubemap] / stats.cpp
index 280f019..b2bca75 100644 (file)
--- a/stats.cpp
+++ b/stats.cpp
@@ -13,7 +13,6 @@
 #include "log.h"
 #include "serverpool.h"
 #include "stats.h"
-#include "util.h"
 
 using namespace std;
 
@@ -27,7 +26,7 @@ StatsThread::StatsThread(const std::string &stats_file, int stats_interval)
 
 void StatsThread::do_work()
 {
-       while (!should_stop()) {
+       while (!should_stop) {
                int fd;
                FILE *fp;
                time_t now;
@@ -45,7 +44,9 @@ void StatsThread::do_work()
                fp = fdopen(fd, "w");
                if (fp == NULL) {
                        log_perror("fdopen");
-                       safe_close(fd);
+                       if (close(fd) == -1) {
+                               log_perror("close");
+                       }
                        if (unlink(filename) == -1) {
                                log_perror(filename);
                        }
@@ -84,12 +85,25 @@ void StatsThread::do_work()
                free(filename);
 
 sleep:
-               // Wait until we are asked to quit, stats_interval timeout,
+               // Wait until the stop_fd pipe is closed, stats_interval timeout,
                // or a spurious signal. (The latter will cause us to write stats
                // too often, but that's okay.)
-               timespec timeout_ts;
-               timeout_ts.tv_sec = stats_interval;
-               timeout_ts.tv_nsec = 0;
-               wait_for_wakeup(&timeout_ts);
+               pollfd pfd;
+               pfd.fd = stop_fd_read;
+               pfd.events = POLLIN | POLLRDHUP;
+
+               int nfds = poll(&pfd, 1, stats_interval * 1000);
+               if (nfds == 0 || (nfds == -1 && errno == EINTR)) {
+                       continue;
+               }
+               if (nfds == 1) {
+                       // Should stop.
+                       break;
+               }
+               if (nfds == -1) {
+                       log_perror("poll");
+                       usleep(100000);
+                       continue;
+               }
        }
 }