X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=main.cpp;h=e270141e62941f6c33202d34f15786d62fca9200;hp=dc52bdc29a17ab85f1ad1d5c8f23ef34a54c0604;hb=ac50b1104f5f525e838f80fa6dc50be13f7d35b6;hpb=3b2b74d6be17096c2fe830bfa07fbcecb4460b81 diff --git a/main.cpp b/main.cpp index dc52bdc..e270141 100644 --- a/main.cpp +++ b/main.cpp @@ -25,6 +25,7 @@ #include "server.h" #include "serverpool.h" #include "input.h" +#include "stats.h" #include "state.pb.h" using namespace std; @@ -37,68 +38,6 @@ void hup(int ignored) hupped = true; } -struct StatsThreadParameters { - string stats_file; - int stats_interval; -}; - -void *stats_thread_run(void *arg) -{ - const StatsThreadParameters *parms = reinterpret_cast(arg); - while (!hupped) { - int fd; - FILE *fp; - time_t now; - vector client_stats; - - // Open a new, temporary file. - char *filename = strdup((parms->stats_file + ".new.XXXXXX").c_str()); - fd = mkostemp(filename, O_WRONLY); - if (fd == -1) { - perror(filename); - free(filename); - goto sleep; - } - - fp = fdopen(fd, "w"); - if (fp == NULL) { - perror("fdopen"); - close(fd); - unlink(filename); - free(filename); - goto sleep; - } - - 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", - 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)); - } - if (fclose(fp) == EOF) { - perror("fclose"); - unlink(filename); - free(filename); - goto sleep; - } - - if (rename(filename, parms->stats_file.c_str()) == -1) { - perror("rename"); - unlink(filename); - } - -sleep: - int left_to_sleep = parms->stats_interval; - do { - left_to_sleep = sleep(left_to_sleep); - } while (left_to_sleep > 0 && !hupped); - } - return NULL; -} - // Serialize the given state to a file descriptor, and return the (still open) // descriptor. int make_tempfile(const CubemapStateProto &state) @@ -319,6 +258,10 @@ int main(int argc, char **argv) if (stats_interval != -1 && stats_file.empty()) { fprintf(stderr, "WARNING: 'stats_interval' given, but no 'stats_file'. No statistics will be written.\n"); } + StatsThread *stats_thread = NULL; + if (!stats_file.empty()) { + stats_thread = new StatsThread(stats_file, stats_interval); + } servers->run(); @@ -372,12 +315,8 @@ int main(int argc, char **argv) assert(deserialized_inputs.empty()); // Start writing statistics. - pthread_t stats_thread; - StatsThreadParameters stats_parameters; // Must live for as long as the stats thread does. - if (!stats_file.empty()) { - stats_parameters.stats_file = stats_file; - stats_parameters.stats_interval = stats_interval; - pthread_create(&stats_thread, NULL, stats_thread_run, &stats_parameters); + if (stats_thread != NULL) { + stats_thread->run(); } signal(SIGHUP, hup); @@ -400,12 +339,8 @@ int main(int argc, char **argv) // OK, we've been HUPed. Time to shut down everything, serialize, and re-exec. gettimeofday(&serialize_start, NULL); - if (!stats_file.empty()) { - pthread_kill(stats_thread, SIGHUP); - if (pthread_join(stats_thread, NULL) == -1) { - perror("pthread_join"); - exit(1); - } + if (stats_thread != NULL) { + stats_thread->stop(); } pthread_kill(acceptor_thread, SIGHUP); if (pthread_join(acceptor_thread, NULL) == -1) {