]> git.sesse.net Git - nageru/blobdiff - disk_space_estimator.cpp
Fix an issue where the mixer lagging too much behind CEF would cause us to display...
[nageru] / disk_space_estimator.cpp
index cacc8117ac5a8e324453ff86dcdb988c5ae0da99..86e5e877f65aeaad39cd7423cc3c0577ed499a94 100644 (file)
@@ -5,11 +5,13 @@
 #include <sys/statfs.h>
 #include <memory>
 
+#include "metrics.h"
 #include "timebase.h"
 
 DiskSpaceEstimator::DiskSpaceEstimator(DiskSpaceEstimator::callback_t callback)
        : callback(callback)
 {
+       global_metrics.add("disk_free_bytes", &metric_disk_free_bytes, Metrics::TYPE_GAUGE);
 }
 
 void DiskSpaceEstimator::report_write(const std::string &filename, uint64_t pts)
@@ -41,12 +43,19 @@ void DiskSpaceEstimator::report_write(const std::string &filename, uint64_t pts)
                return;
        }
 
+       off_t free_bytes = off_t(fst.f_bavail) * fst.f_frsize;
+       metric_disk_free_bytes = free_bytes;
+
        if (!measure_points.empty()) {
-               off_t free_bytes = off_t(fst.f_bavail) * fst.f_frsize;
                double bytes_per_second = double(st.st_size - measure_points.front().size) /
                        (pts - measure_points.front().pts) * TIMEBASE;
                double seconds_left = free_bytes / bytes_per_second;
-               callback(free_bytes, seconds_left);
+
+               // Only report every second, since updating the UI can be expensive.
+               if (last_pts_reported == 0 || pts - last_pts_reported >= TIMEBASE) {
+                       callback(free_bytes, seconds_left);
+                       last_pts_reported = pts;
+               }
        }
 
        measure_points.push_back({ pts, st.st_size });