X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=stats.cpp;h=f5916edf2fb696530fe081cad9eee503457c8a70;hp=445bae7f3317d8e31bfecaa4a8143d873fb9c367;hb=bb0f713d1bc0b41d6a22e9990816ab4d11e642ed;hpb=e8eff7cedea352b618b114a4d88bb8110d787e4c diff --git a/stats.cpp b/stats.cpp index 445bae7..f5916ed 100644 --- a/stats.cpp +++ b/stats.cpp @@ -1,10 +1,15 @@ +#include +#include #include -#include #include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include "client.h" #include "serverpool.h" #include "stats.h" @@ -18,29 +23,6 @@ StatsThread::StatsThread(const std::string &stats_file, int stats_interval) { } -void StatsThread::run() -{ - should_stop = false; - pthread_create(&worker_thread, NULL, do_work_thunk, this); -} - -void StatsThread::stop() -{ - should_stop = true; - pthread_kill(worker_thread, SIGHUP); - if (pthread_join(worker_thread, NULL) == -1) { - perror("pthread_join"); - exit(1); - } -} - -void *StatsThread::do_work_thunk(void *arg) -{ - StatsThread *stats_thread = reinterpret_cast(arg); - stats_thread->do_work(); - return NULL; -} - void StatsThread::do_work() { while (!should_stop) { @@ -70,11 +52,13 @@ void StatsThread::do_work() now = time(NULL); client_stats = servers->get_client_stats(); for (size_t i = 0; i < client_stats.size(); ++i) { - fprintf(fp, "%s %s %d %llu\n", + fprintf(fp, "%s %s %d %llu %llu %llu\n", client_stats[i].remote_addr.c_str(), client_stats[i].stream_id.c_str(), int(now - client_stats[i].connect_time), - (long long unsigned)(client_stats[i].bytes_sent)); + (long long unsigned)(client_stats[i].bytes_sent), + (long long unsigned)(client_stats[i].bytes_lost), + (long long unsigned)(client_stats[i].num_loss_events)); } if (fclose(fp) == EOF) { perror("fclose"); @@ -89,9 +73,25 @@ void StatsThread::do_work() } sleep: - int left_to_sleep = stats_interval; - do { - left_to_sleep = sleep(left_to_sleep); - } while (left_to_sleep > 0 && !should_stop); + // 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.) + 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) { + perror("poll"); + usleep(100000); + continue; + } } }