X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=stats.cpp;h=9e3f72c2d065613c2a783336c9980c05785eea22;hp=fa483bf3a617fbed566ac1d053ac21e6e115c858;hb=562cf44b96b5c0260d1a1ab18b2dd2408b6d1fc8;hpb=6942bd4c7da1379565817ae82e6ace259abf4492 diff --git a/stats.cpp b/stats.cpp index fa483bf..9e3f72c 100644 --- a/stats.cpp +++ b/stats.cpp @@ -5,14 +5,13 @@ #include #include #include -#include -#include #include #include "client.h" #include "log.h" #include "serverpool.h" #include "stats.h" +#include "util.h" using namespace std; @@ -26,7 +25,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,8 +43,10 @@ void StatsThread::do_work() fp = fdopen(fd, "w"); if (fp == NULL) { log_perror("fdopen"); - close(fd); - unlink(filename); + safe_close(fd); + if (unlink(filename) == -1) { + log_perror(filename); + } free(filename); goto sleep; } @@ -57,7 +58,7 @@ void StatsThread::do_work() client_stats[i].remote_addr.c_str(), client_stats[i].sock, client_stats[i].fwmark, - client_stats[i].stream_id.c_str(), + client_stats[i].url.c_str(), int(now - client_stats[i].connect_time), (long long unsigned)(client_stats[i].bytes_sent), (long long unsigned)(client_stats[i].bytes_lost), @@ -65,36 +66,28 @@ void StatsThread::do_work() } if (fclose(fp) == EOF) { log_perror("fclose"); - unlink(filename); + if (unlink(filename) == -1) { + log_perror(filename); + } free(filename); goto sleep; } if (rename(filename, stats_file.c_str()) == -1) { log_perror("rename"); - unlink(filename); + if (unlink(filename) == -1) { + log_perror(filename); + } } + 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); } }