From 1e6900afa22f7a650a1a6801017b597cb1656407 Mon Sep 17 00:00:00 2001
From: bubnikv <bubnikv@gmail.com>
Date: Tue, 18 Dec 2018 15:55:45 +0100
Subject: [PATCH] Logging of memory usage for the GCodeAnalyzer and
 GCodePreviewData.

---
 src/libslic3r/GCode.cpp              |  7 +++--
 src/libslic3r/GCode/Analyzer.cpp     | 11 ++++++++
 src/libslic3r/GCode/Analyzer.hpp     |  3 +++
 src/libslic3r/GCode/PreviewData.cpp  | 38 ++++++++++++++++++++++++++++
 src/libslic3r/GCode/PreviewData.hpp  | 12 +++++++++
 src/libslic3r/GCodeTimeEstimator.cpp | 10 ++------
 src/libslic3r/Utils.hpp              |  7 ++++-
 7 files changed, 77 insertions(+), 11 deletions(-)

diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp
index ef143a3e8..e738662cb 100644
--- a/src/libslic3r/GCode.cpp
+++ b/src/libslic3r/GCode.cpp
@@ -1644,8 +1644,11 @@ void GCode::process_layer(
     // printf("G-code after filter:\n%s\n", out.c_str());
     
     _write(file, gcode);
-    BOOST_LOG_TRIVIAL(trace) << "Exported layer " << layer.id() << " print_z " << print_z << ", time estimator memory: " + 
-        format_memsize_MB(m_normal_time_estimator.memory_used() + m_silent_time_estimator_enabled ? m_silent_time_estimator.memory_used() : 0);
+    BOOST_LOG_TRIVIAL(trace) << "Exported layer " << layer.id() << " print_z " << print_z << 
+        ", time estimator memory: " <<
+            format_memsize_MB(m_normal_time_estimator.memory_used() + m_silent_time_estimator_enabled ? m_silent_time_estimator.memory_used() : 0) <<
+        ", analyzer memory: " <<
+            format_memsize_MB(m_analyzer.memory_used());
 }
 
 void GCode::apply_print_config(const PrintConfig &print_config)
diff --git a/src/libslic3r/GCode/Analyzer.cpp b/src/libslic3r/GCode/Analyzer.cpp
index c56f02753..8212b1703 100644
--- a/src/libslic3r/GCode/Analyzer.cpp
+++ b/src/libslic3r/GCode/Analyzer.cpp
@@ -4,6 +4,7 @@
 
 #include "../libslic3r.h"
 #include "../PrintConfig.hpp"
+#include "../Utils.hpp"
 #include "Print.hpp"
 
 #include "Analyzer.hpp"
@@ -852,6 +853,16 @@ void GCodeAnalyzer::_calc_gcode_preview_unretractions(GCodePreviewData& preview_
     }
 }
 
+// Return an estimate of the memory consumed by the time estimator.
+size_t GCodeAnalyzer::memory_used() const
+{
+    size_t out = sizeof(*this);
+    for (const std::pair<GCodeMove::EType, GCodeMovesList> &kvp : m_moves_map)
+        out += sizeof(kvp) + SLIC3R_STDVEC_MEMSIZE(kvp.second, GCodeMove);
+    out += m_process_output.size();
+    return out;
+}
+
 GCodePreviewData::Color operator + (const GCodePreviewData::Color& c1, const GCodePreviewData::Color& c2)
 {
     return GCodePreviewData::Color(clamp(0.0f, 1.0f, c1.rgba[0] + c2.rgba[0]),
diff --git a/src/libslic3r/GCode/Analyzer.hpp b/src/libslic3r/GCode/Analyzer.hpp
index f50138b56..389c11cec 100644
--- a/src/libslic3r/GCode/Analyzer.hpp
+++ b/src/libslic3r/GCode/Analyzer.hpp
@@ -120,6 +120,9 @@ public:
     // Calculates all data needed for gcode visualization
     void calc_gcode_preview_data(GCodePreviewData& preview_data);
 
+    // Return an estimate of the memory consumed by the time estimator.
+    size_t memory_used() const;
+
     static bool is_valid_extrusion_role(ExtrusionRole role);
 
 private:
diff --git a/src/libslic3r/GCode/PreviewData.cpp b/src/libslic3r/GCode/PreviewData.cpp
index 3f2df9532..d4aa9bc02 100644
--- a/src/libslic3r/GCode/PreviewData.cpp
+++ b/src/libslic3r/GCode/PreviewData.cpp
@@ -2,6 +2,7 @@
 #include "PreviewData.hpp"
 #include <float.h>
 #include <I18N.hpp>
+#include "Utils.hpp"
 
 #include <boost/format.hpp>
 
@@ -205,6 +206,18 @@ bool GCodePreviewData::Extrusion::is_role_flag_set(unsigned int flags, Extrusion
     return GCodeAnalyzer::is_valid_extrusion_role(role) && (flags & (1 << (role - erPerimeter))) != 0;
 }
 
+size_t GCodePreviewData::Extrusion::memory_used() const
+{
+    size_t out = sizeof(*this);
+    out += SLIC3R_STDVEC_MEMSIZE(this->layers, Layer);
+    for (const Layer &layer : this->layers) {
+        out += SLIC3R_STDVEC_MEMSIZE(layer.paths, ExtrusionPath);
+        for (const ExtrusionPath &path : layer.paths)
+			out += SLIC3R_STDVEC_MEMSIZE(path.polyline.points, Point);
+    }
+	return out;
+}
+
 const float GCodePreviewData::Travel::Default_Width = 0.075f;
 const float GCodePreviewData::Travel::Default_Height = 0.075f;
 const GCodePreviewData::Color GCodePreviewData::Travel::Default_Type_Colors[Num_Types] =
@@ -224,6 +237,15 @@ void GCodePreviewData::Travel::set_default()
     is_visible = false;
 }
 
+size_t GCodePreviewData::Travel::memory_used() const
+{
+    size_t out = sizeof(*this);
+    out += SLIC3R_STDVEC_MEMSIZE(this->polylines, Polyline);
+	for (const Polyline &polyline : this->polylines)
+		out += SLIC3R_STDVEC_MEMSIZE(polyline.polyline.points, Vec3crd);
+    return out;
+}
+
 const GCodePreviewData::Color GCodePreviewData::Retraction::Default_Color = GCodePreviewData::Color(1.0f, 1.0f, 1.0f, 1.0f);
 
 GCodePreviewData::Retraction::Position::Position(const Vec3crd& position, float width, float height)
@@ -239,6 +261,11 @@ void GCodePreviewData::Retraction::set_default()
     is_visible = false;
 }
 
+size_t GCodePreviewData::Retraction::memory_used() const
+{
+	return sizeof(*this) + SLIC3R_STDVEC_MEMSIZE(this->positions, Position);
+}
+
 void GCodePreviewData::Shell::set_default()
 {
     is_visible = false;
@@ -483,4 +510,15 @@ GCodePreviewData::LegendItemsList GCodePreviewData::get_legend_items(const std::
     return items;
 }
 
+// Return an estimate of the memory consumed by the time estimator.
+size_t GCodePreviewData::memory_used() const
+{
+    return 
+        this->extrusion.memory_used() + 
+        this->travel.memory_used() + 
+        this->retraction.memory_used() + 
+        this->unretraction.memory_used() + 
+        sizeof(shell) + sizeof(ranges);
+}
+
 } // namespace Slic3r
diff --git a/src/libslic3r/GCode/PreviewData.hpp b/src/libslic3r/GCode/PreviewData.hpp
index 9f882788d..8ed5e91c7 100644
--- a/src/libslic3r/GCode/PreviewData.hpp
+++ b/src/libslic3r/GCode/PreviewData.hpp
@@ -99,6 +99,9 @@ public:
         void set_default();
         bool is_role_flag_set(ExtrusionRole role) const;
 
+        // Return an estimate of the memory consumed by the time estimator.
+        size_t memory_used() const;
+
         static bool is_role_flag_set(unsigned int flags, ExtrusionRole role);
     };
 
@@ -144,6 +147,9 @@ public:
         size_t color_print_idx;
 
         void set_default();
+
+        // Return an estimate of the memory consumed by the time estimator.
+        size_t memory_used() const;
     };
 
     struct Retraction
@@ -166,6 +172,9 @@ public:
         bool is_visible;
 
         void set_default();
+
+        // Return an estimate of the memory consumed by the time estimator.
+        size_t memory_used() const;
     };
 
     struct Shell
@@ -199,6 +208,9 @@ public:
 
     std::string get_legend_title() const;
     LegendItemsList get_legend_items(const std::vector<float>& tool_colors, const std::vector</*double*/std::pair<double, double>>& cp_values) const;
+
+    // Return an estimate of the memory consumed by the time estimator.
+    size_t memory_used() const;
 };
 
 GCodePreviewData::Color operator + (const GCodePreviewData::Color& c1, const GCodePreviewData::Color& c2);
diff --git a/src/libslic3r/GCodeTimeEstimator.cpp b/src/libslic3r/GCodeTimeEstimator.cpp
index 0ab49a345..81119c513 100644
--- a/src/libslic3r/GCodeTimeEstimator.cpp
+++ b/src/libslic3r/GCodeTimeEstimator.cpp
@@ -672,14 +672,8 @@ namespace Slic3r {
 	size_t GCodeTimeEstimator::memory_used() const
     {
         size_t out = sizeof(*this);
-#if WIN32
-	#define STDVEC_MEMSIZE(NAME, TYPE) NAME.capacity() * ((sizeof(TYPE) + __alignof(TYPE) - 1) / __alignof(TYPE)) * __alignof(TYPE)
-#else
-	#define STDVEC_MEMSIZE(NAME, TYPE) NAME.capacity() * ((sizeof(TYPE) + alignof(TYPE) - 1) / alignof(TYPE)) * alignof(TYPE)
-#endif
-		out += STDVEC_MEMSIZE(this->_blocks, Block);
-		out += STDVEC_MEMSIZE(this->_g1_line_ids, G1LineIdToBlockId);
-#undef STDVEC_MEMSIZE
+		out += SLIC3R_STDVEC_MEMSIZE(this->_blocks, Block);
+		out += SLIC3R_STDVEC_MEMSIZE(this->_g1_line_ids, G1LineIdToBlockId);
         return out;
     }
 
diff --git a/src/libslic3r/Utils.hpp b/src/libslic3r/Utils.hpp
index f4f05ae66..047e03bf2 100644
--- a/src/libslic3r/Utils.hpp
+++ b/src/libslic3r/Utils.hpp
@@ -187,7 +187,12 @@ public:
     void reset() { closure = Closure(); }
 };
 
-
 } // namespace Slic3r
 
+#if WIN32
+    #define SLIC3R_STDVEC_MEMSIZE(NAME, TYPE) NAME.capacity() * ((sizeof(TYPE) + __alignof(TYPE) - 1) / __alignof(TYPE)) * __alignof(TYPE)
+#else
+    #define SLIC3R_STDVEC_MEMSIZE(NAME, TYPE) NAME.capacity() * ((sizeof(TYPE) + alignof(TYPE) - 1) / alignof(TYPE)) * alignof(TYPE)
+#endif
+
 #endif // slic3r_Utils_hpp_