From: Steinar H. Gunderson Date: Wed, 10 Apr 2013 21:36:56 +0000 (+0200) Subject: Factor statistics writing into its own class and file. X-Git-Tag: 1.0.0~159 X-Git-Url: https://git.sesse.net/?p=cubemap;a=commitdiff_plain;h=733fa6455f39af91b105b82968f88a0165a66f08 Factor statistics writing into its own class and file. --- diff --git a/Makefile b/Makefile index 11adc8b..f2e37ac 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ PROTOC=protoc CXXFLAGS=-Wall -O2 -g LDLIBS=-lpthread -lprotobuf -OBJS=main.o server.o serverpool.o mutexlock.o input.o parse.o markpool.o acceptor.o state.pb.o +OBJS=main.o server.o serverpool.o mutexlock.o input.o parse.o markpool.o acceptor.o stats.o state.pb.o all: cubemap diff --git a/main.cpp b/main.cpp index a4a4dbe..4853518 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) @@ -315,6 +254,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(); @@ -368,12 +311,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); @@ -396,12 +335,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) {