]> git.sesse.net Git - cubemap/blobdiff - input_stats.cpp
Support input from pipes (subprocesses).
[cubemap] / input_stats.cpp
index 1edfbde52379b062407dfd8e31804e51733ef64a..eee597b273d42cb4b83b2c530bb9913254fe788c 100644 (file)
@@ -5,12 +5,12 @@
 #include <string.h>
 #include <time.h>
 #include <unistd.h>
+#include <math.h>
 #include <vector>
 
-#include "client.h"
-#include "log.h"
 #include "input.h"
 #include "input_stats.h"
+#include "log.h"
 #include "util.h"
 
 using namespace std;
@@ -27,10 +27,11 @@ void InputStatsThread::do_work()
        while (!should_stop()) {
                int fd;
                FILE *fp;
+               time_t now;
 
                // Open a new, temporary file.
                char *filename = strdup((stats_file + ".new.XXXXXX").c_str());
-               fd = mkostemp(filename, O_WRONLY);
+               fd = mkostemp(filename, O_WRONLY | O_CLOEXEC);
                if (fd == -1) {
                        log_perror(filename);
                        free(filename);
@@ -38,7 +39,7 @@ void InputStatsThread::do_work()
                }
 
                fp = fdopen(fd, "w");
-               if (fp == NULL) {
+               if (fp == nullptr) {
                        log_perror("fdopen");
                        safe_close(fd);
                        if (unlink(filename) == -1) {
@@ -48,11 +49,24 @@ void InputStatsThread::do_work()
                        goto sleep;
                }
 
+               now = time(nullptr);
                for (size_t i = 0; i < inputs.size(); ++i) {
                        InputStats stats = inputs[i]->get_stats();
-                       fprintf(fp, "%s %llu %llu\n", stats.url.c_str(),
+                       fprintf(fp, "%s %llu %llu", stats.url.c_str(),
                                (long long unsigned)(stats.bytes_received),
                                (long long unsigned)(stats.data_bytes_received));
+                       if (stats.connect_time == -1) {
+                               fprintf(fp, " -");
+                       } else {
+                               fprintf(fp, " %d", int(now - stats.connect_time));
+                       }
+                       fprintf(fp, " %llu", (long long unsigned)(stats.metadata_bytes_received));
+                       if (!isfinite(stats.latency_sec)) {
+                               fprintf(fp, " -");
+                       } else {
+                               fprintf(fp, " %.6f", stats.latency_sec);
+                       }
+                       fprintf(fp, "\n");
                }
                if (fclose(fp) == EOF) {
                        log_perror("fclose");