]> git.sesse.net Git - cubemap/blobdiff - stats.cpp
Reinstate the new signal handling; revert the revert.
[cubemap] / stats.cpp
index b2bca75970f800a6cf3f21517e243e3aed89cacd..280f019edd9b2811d551cf018e62334cf00413bc 100644 (file)
--- a/stats.cpp
+++ b/stats.cpp
@@ -13,6 +13,7 @@
 #include "log.h"
 #include "serverpool.h"
 #include "stats.h"
+#include "util.h"
 
 using namespace std;
 
@@ -26,7 +27,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;
@@ -44,9 +45,7 @@ void StatsThread::do_work()
                fp = fdopen(fd, "w");
                if (fp == NULL) {
                        log_perror("fdopen");
-                       if (close(fd) == -1) {
-                               log_perror("close");
-                       }
+                       safe_close(fd);
                        if (unlink(filename) == -1) {
                                log_perror(filename);
                        }
@@ -85,25 +84,12 @@ void StatsThread::do_work()
                free(filename);
 
 sleep:
-               // Wait until the stop_fd pipe is closed, stats_interval timeout,
+               // Wait until we are asked to quit, stats_interval timeout,
                // or a spurious signal. (The latter will cause us to write stats
                // too often, but that's okay.)
-               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;
-               }
+               timespec timeout_ts;
+               timeout_ts.tv_sec = stats_interval;
+               timeout_ts.tv_nsec = 0;
+               wait_for_wakeup(&timeout_ts);
        }
 }