From 64c649b37a344f3fb5bc5183a5a4a9131c0ff4a2 Mon Sep 17 00:00:00 2001 From: mueller Date: Sat, 11 Mar 2023 11:29:53 +0100 Subject: [PATCH 1/8] Fixed an API design flaw which made it impossible to change the settings of the collector in some factory methods. --- .../include/power_overwhelming/collector.h | 42 +++++-- .../include/power_overwhelming/collector.inl | 9 +- .../power_overwhelming/collector_settings.h | 109 ++++++++++++++++++ power_overwhelming/src/collector.cpp | 23 +--- power_overwhelming/src/collector_impl.cpp | 21 ++++ power_overwhelming/src/collector_impl.h | 7 ++ power_overwhelming/src/collector_settings.cpp | 96 +++++++++++++++ test/collector_test.cpp | 8 +- 8 files changed, 280 insertions(+), 35 deletions(-) create mode 100644 power_overwhelming/include/power_overwhelming/collector_settings.h create mode 100644 power_overwhelming/src/collector_settings.cpp diff --git a/power_overwhelming/include/power_overwhelming/collector.h b/power_overwhelming/include/power_overwhelming/collector.h index 27789b39..47588c8a 100644 --- a/power_overwhelming/include/power_overwhelming/collector.h +++ b/power_overwhelming/include/power_overwhelming/collector.h @@ -13,7 +13,7 @@ #include #include -#include "power_overwhelming/sensor.h" +#include "power_overwhelming/collector_settings.h" namespace visus { @@ -30,6 +30,15 @@ namespace power_overwhelming { public: + /// + /// Creates a collector for all sensors that could be found and + /// instantiated on the machine. + /// + /// The general settings for the collector, + /// including the sampling interval. + /// A collector for all available sensors. + static collector for_all(const collector_settings& settings); + /// /// Creates a collector for all sensors that could be found and /// instantiated on the machne. @@ -37,11 +46,16 @@ namespace power_overwhelming { /// The path where the collector should write /// the output to. /// The sampling interval for the sensors - /// in microseconds. This parameter defaults to 5000 microseconds. - /// + /// in microseconds. /// A collector for all available sensors. - static collector for_all(const wchar_t *output_path, - const sensor::microseconds_type sampling_interval = 5000); + /// If + /// is nullptr. + inline static collector for_all(const wchar_t *output_path, + const sensor::microseconds_type sampling_interval + = collector_settings::default_sampling_interval) { + return for_all(collector_settings().output_path(output_path) + .sampling_interval(sampling_interval)); + } /// /// Create a collector for the configuration template generated by @@ -65,10 +79,13 @@ namespace power_overwhelming { /// The types of the lists of sensors, /// which must be STL collection types (with begin and /// end) or sensors. + /// The general settings for the collector, + /// including the sampling interval. /// The lists of sensors. /// template - static collector from_sensor_lists(TSensorLists&&... sensors); + static collector from_sensor_lists(const collector_settings& settings, + TSensorLists&&... sensors); /// /// Initialise a new instance from the given compile-time list of @@ -76,12 +93,15 @@ namespace power_overwhelming { /// /// The general settings for the collector, + /// including the sampling interval. /// A compile-time list of sensors. The new /// instance will take ownership of these sensors, ie they will be /// disposed by moving them once the method returns. /// A new collector using the given sensors. template - static collector from_sensors(TSensors&&... sensors); + static collector from_sensors(const collector_settings& settings, + TSensors&&... sensors); /// /// Creates a configuration file for all sensors currently attached to @@ -183,12 +203,14 @@ namespace power_overwhelming { TSensorList&& sensors); /// - /// Creates a new collector that has no sensors, reserved space for the - /// given number of sensors. + /// Creates a new collector that has no sensors, but reserved space for + /// the given number of sensors. /// + /// /// /// A new collector without sensors. - static collector prepare(const std::size_t capacity); + static collector prepare(const collector_settings& settings, + const std::size_t capacity); /// /// Initialise a new instance. diff --git a/power_overwhelming/include/power_overwhelming/collector.inl b/power_overwhelming/include/power_overwhelming/collector.inl index 036c185b..2a6cc01f 100644 --- a/power_overwhelming/include/power_overwhelming/collector.inl +++ b/power_overwhelming/include/power_overwhelming/collector.inl @@ -10,7 +10,7 @@ template visus::power_overwhelming::collector visus::power_overwhelming::collector::from_sensor_lists( - TSensorLists&&... sensors) { + const collector_settings& settings, TSensorLists&&... sensors) { std::array>, sizeof...(sensors)> instances = { move_to_heap(sensors)... }; @@ -20,7 +20,7 @@ visus::power_overwhelming::collector::from_sensor_lists( return std::size(v) + s; }); - auto retval = collector::prepare(cnt); + auto retval = collector::prepare(settings, cnt); for (auto& l : instances) { for (auto& i : l) { @@ -37,13 +37,14 @@ visus::power_overwhelming::collector::from_sensor_lists( */ template visus::power_overwhelming::collector -visus::power_overwhelming::collector::from_sensors(TSensors&&... sensors) { +visus::power_overwhelming::collector::from_sensors( + const collector_settings& settings, TSensors&&... sensors) { std::array, sizeof...(sensors)> instances = { std::unique_ptr(new typename std::decay::type( std::move(sensors)))... }; - auto retval = collector::prepare(instances.size()); + auto retval = collector::prepare(settings, instances.size()); for (auto& i : instances) { // Note: We release this on purpose as the library and the calling code diff --git a/power_overwhelming/include/power_overwhelming/collector_settings.h b/power_overwhelming/include/power_overwhelming/collector_settings.h new file mode 100644 index 00000000..272dd701 --- /dev/null +++ b/power_overwhelming/include/power_overwhelming/collector_settings.h @@ -0,0 +1,109 @@ +// +// Copyright © 2023 Visualisierungsinstitut der Universität Stuttgart. Alle Rechte vorbehalten. +// +// Christoph Müller + +#pragma once + +#include + +#include "power_overwhelming/sensor.h" + + +namespace visus { +namespace power_overwhelming { + + /// + /// Enapsulates the settings of a + /// . + /// + class POWER_OVERWHELMING_API collector_settings final { + + public: + + /// + /// The type used to specify sampling intervals in (microseconds). + /// + typedef sensor::microseconds_type sampling_interval_type; + + /// + /// The default output path. + /// + static constexpr const wchar_t *default_output_path = L"output.csv"; + + /// + /// The default sampling interval of 5 milliseconds (or 5000 + /// microseconds). + /// + static constexpr sampling_interval_type default_sampling_interval + = 5000; + + /// + /// Initialises a new instance. + /// + /// + collector_settings(void); + + /// + /// Clone . + /// + /// The object to be cloned. + collector_settings(const collector_settings& rhs); + + /// + /// Finalises the instance. + /// + ~collector_settings(void); + + /// + /// Gets the path to the file where the collector should write its + /// output to. + /// + /// The path to the output file. + inline const wchar_t *output_path(void) const noexcept { + return this->_output_path; + } + + /// + /// Sets the path to the file where the collector should write its + /// output to. + /// + /// The path to the output file. + /// *this. + /// If + /// is nullptr. + collector_settings& output_path(const wchar_t *path); + + /// + /// Gets the time interval in which the collector should sample the + /// sensors. + /// + /// The sampling interval. + inline sampling_interval_type sampling_interval(void) const noexcept { + return this->_sampling_interval; + } + + /// + /// Sets the interval in which the collector should sample the sensors. + /// + /// The sampling interval. + /// *this. + collector_settings& sampling_interval( + const sampling_interval_type interval); + + /// + /// Assignment. + /// + /// The right hand side operand. + /// *this. + collector_settings& operator =(const collector_settings& rhs); + + private: + + wchar_t *_output_path; + sampling_interval_type _sampling_interval; + + }; + +} /* namespace power_overwhelming */ +} /* namespace visus */ diff --git a/power_overwhelming/src/collector.cpp b/power_overwhelming/src/collector.cpp index 9cc3c6f3..8b6a5540 100644 --- a/power_overwhelming/src/collector.cpp +++ b/power_overwhelming/src/collector.cpp @@ -78,24 +78,11 @@ namespace detail { * visus::power_overwhelming::collector::for_all */ visus::power_overwhelming::collector -visus::power_overwhelming::collector::for_all(const wchar_t *output_path, - const sensor::microseconds_type sampling_interval) { - if (output_path == nullptr) { - throw std::invalid_argument("The output path of a collector cannot be " - "null."); - } - +visus::power_overwhelming::collector::for_all( + const collector_settings& settings) { auto retval = collector(new detail::collector_impl()); + retval._impl->apply(settings); retval._impl->sensors = detail::get_all_sensors(); -#if defined(_WIN32) - retval._impl->stream = std::wofstream(output_path, std::ofstream::trunc); -#else /* defined(_WIN32) */ - auto p = convert_string(output_path); - retval._impl->stream = std::wofstream(p, std::ofstream::trunc); -#endif /* defined(_WIN32) */ - retval._impl->sampling_interval = std::chrono::microseconds( - sampling_interval); - return retval; } @@ -217,9 +204,11 @@ visus::power_overwhelming::collector::operator bool(void) const noexcept { * visus::power_overwhelming::collector::prepare */ visus::power_overwhelming::collector -visus::power_overwhelming::collector::prepare(const std::size_t capacity) { +visus::power_overwhelming::collector::prepare( + const collector_settings& settings, const std::size_t capacity) { auto retval = collector(new detail::collector_impl()); retval._impl->sensors.reserve(capacity); + retval._impl->apply(settings); return retval; } diff --git a/power_overwhelming/src/collector_impl.cpp b/power_overwhelming/src/collector_impl.cpp index 37e71a41..26a04fef 100644 --- a/power_overwhelming/src/collector_impl.cpp +++ b/power_overwhelming/src/collector_impl.cpp @@ -5,6 +5,7 @@ #include "collector_impl.h" +#include #include #include "power_overwhelming/adl_sensor.h" @@ -47,6 +48,26 @@ visus::power_overwhelming::detail::collector_impl::~collector_impl(void) { } +/* + * visus::power_overwhelming::detail::collector_impl::apply + */ +void visus::power_overwhelming::detail::collector_impl::apply( + const collector_settings& settings) { + assert(settings.output_path() != nullptr); + auto output_path = settings.output_path(); + +#if defined(_WIN32) + this->stream = std::wofstream(output_path, std::ofstream::trunc); +#else /* defined(_WIN32) */ + auto p = convert_string(output_path); + retval._impl->stream = std::wofstream(p, std::ofstream::trunc); +#endif /* defined(_WIN32) */ + + this->sampling_interval = std::chrono::microseconds( + settings.sampling_interval()); +} + + /* * visus::power_overwhelming::detail::collector_impl::can_buffer */ diff --git a/power_overwhelming/src/collector_impl.h b/power_overwhelming/src/collector_impl.h index d4edba95..50c42ab0 100644 --- a/power_overwhelming/src/collector_impl.h +++ b/power_overwhelming/src/collector_impl.h @@ -18,6 +18,7 @@ #include #endif /* defined(_WIN32) */ +#include "power_overwhelming/collector_settings.h" #include "power_overwhelming/event.h" @@ -134,6 +135,12 @@ namespace detail { /// ~collector_impl(void); + /// + /// Applies the given settings. + /// + /// + void apply(const collector_settings& settings); + /// /// Answer whether data can be written to the buffer. /// diff --git a/power_overwhelming/src/collector_settings.cpp b/power_overwhelming/src/collector_settings.cpp new file mode 100644 index 00000000..c5d1c082 --- /dev/null +++ b/power_overwhelming/src/collector_settings.cpp @@ -0,0 +1,96 @@ +// +// Copyright © 2023 Visualisierungsinstitut der Universität Stuttgart. Alle Rechte vorbehalten. +// +// Christoph Müller + +#include "power_overwhelming/collector_settings.h" + +#include +#include +#include +#include + + +/* + * visus::power_overwhelming::collector_settings::default_output_path + */ +constexpr const wchar_t *visus::power_overwhelming::collector_settings +::default_output_path; + + +/* + * visus::power_overwhelming::collector_settings::collector_settings + */ +visus::power_overwhelming::collector_settings::collector_settings(void) + : _output_path(nullptr), _sampling_interval(default_sampling_interval) { + this->output_path(default_output_path); +} + + +/* + * visus::power_overwhelming::collector_settings::collector_settings + */ +visus::power_overwhelming::collector_settings::collector_settings( + const collector_settings& rhs) : _output_path(nullptr) { + *this = rhs; +} + + +/* + * visus::power_overwhelming::collector_settings::~collector_settings + */ +visus::power_overwhelming::collector_settings::~collector_settings(void) { + if (this->_output_path != nullptr) { + ::free(this->_output_path); + } +} + + +/* + * visus::power_overwhelming::collector_settings::output_path + */ +visus::power_overwhelming::collector_settings& +visus::power_overwhelming::collector_settings::output_path( + const wchar_t *path) { + if (path == nullptr) { + throw std::invalid_argument("The output path must be a valid string."); + } + + if (this->_output_path != nullptr) { + ::free(this->_output_path); + } + + this->_output_path = ::wcsdup(path); + + if (this->_output_path == nullptr) { + throw std::bad_alloc(); + } + + return *this; +} + + +/* + * visus::power_overwhelming::collector_settings::sampling_interval + */ +visus::power_overwhelming::collector_settings& +visus::power_overwhelming::collector_settings::sampling_interval( + const sampling_interval_type interval) { + this->_sampling_interval = interval; + return *this; +} + + +/* + * visus::power_overwhelming::collector_settings::operator = + */ +visus::power_overwhelming::collector_settings& +visus::power_overwhelming::collector_settings::operator =( + const collector_settings& rhs) { + if (this != std::addressof(rhs)) { + this->output_path(rhs._output_path); + this->sampling_interval(rhs._sampling_interval); + } + + return *this; +} diff --git a/test/collector_test.cpp b/test/collector_test.cpp index d795457b..f2203e2b 100644 --- a/test/collector_test.cpp +++ b/test/collector_test.cpp @@ -35,7 +35,7 @@ namespace test { std::vector nvml_sensors(nvml_sensor::for_all(nullptr, 0)); nvml_sensor::for_all(nvml_sensors.data(), nvml_sensors.size()); - auto collector = collector::from_sensor_lists(adl_sensors, emi_sensors, nvml_sensors); + auto collector = collector::from_sensor_lists(collector_settings(), adl_sensors, emi_sensors, nvml_sensors); Assert::IsTrue(bool(collector), L"New collector is valid.", LINE_INFO()); Assert::IsTrue(std::none_of(adl_sensors.begin(), adl_sensors.end(), [](const adl_sensor& s) {return bool(s); }), L"ADL sensors have been moved.", LINE_INFO()); @@ -51,7 +51,7 @@ namespace test { adl_sensor::for_all(sensors.data(), sensors.size()); if (!sensors.empty()) { - auto collector = collector::from_sensors(sensors[0]); + auto collector = collector::from_sensors(collector_settings(), sensors[0]); Assert::IsTrue(bool(collector), L"New collector is valid.", LINE_INFO()); Assert::IsFalse(bool(sensors[0]), L"Sensor has been moved.", LINE_INFO()); } @@ -62,7 +62,7 @@ namespace test { emi_sensor::for_all(sensors.data(), sensors.size()); if (!sensors.empty()) { - auto collector = collector::from_sensors(sensors[0]); + auto collector = collector::from_sensors(collector_settings(), sensors[0]); Assert::IsTrue(bool(collector), L"New collector is valid.", LINE_INFO()); Assert::IsFalse(bool(sensors[0]), L"Sensor has been moved.", LINE_INFO()); } @@ -73,7 +73,7 @@ namespace test { nvml_sensor::for_all(sensors.data(), sensors.size()); if (!sensors.empty()) { - auto collector = collector::from_sensors(sensors[0]); + auto collector = collector::from_sensors(collector_settings(), sensors[0]); Assert::IsTrue(bool(collector), L"New collector is valid.", LINE_INFO()); Assert::IsFalse(bool(sensors[0]), L"Sensor has been moved.", LINE_INFO()); } From abcb07a7aba17160340c1126eb6d8a3b0acf8548 Mon Sep 17 00:00:00 2001 From: mueller Date: Sat, 11 Mar 2023 11:36:34 +0100 Subject: [PATCH 2/8] Added Linux job in az pipe --- azure-pipelines.yml | 92 +++++++++++++++++++++++++++++---------------- 1 file changed, 59 insertions(+), 33 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 4c79b8fe..d8c4b093 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -18,36 +18,62 @@ schedules: - master always: true -pool: - vmImage: 'windows-2022' - -variables: - buildPlatform: 'x64' - buildConfiguration: 'Release' - generator: 'Visual Studio 17 2022' - -steps: -- task: NuGetToolInstaller@0 - -- task: CMake@1 - displayName: 'CMake' - inputs: - workingDirectory: '_build' - cmakeArgs: .. -G"$(generator)" -A"$(buildPlatform)" - -#- task: NuGetCommand@2 -# inputs: -# restoreSolution: '$(solution)' - -- task: VSBuild@1 - displayName: 'Build' - inputs: - solution: '_build/*.sln' - platform: '$(buildPlatform)' - configuration: '$(buildConfiguration)' - -- task: VSTest@2 - displayName: 'Tests' - inputs: - platform: '$(buildPlatform)' - configuration: '$(buildConfiguration)' + +jobs: +- job: Windows + + variables: + buildPlatform: 'x64' + buildConfiguration: 'Release' + generator: 'Visual Studio 17 2022' + + pool: + vmImage: 'windows-2022' + + steps: + - task: NuGetToolInstaller@0 + + - task: CMake@1 + displayName: 'Configure' + inputs: + workingDirectory: '_build' + cmakeArgs: '.. -G"$(generator)" -A"$(buildPlatform)"' + + #- task: NuGetCommand@2 + # inputs: + # restoreSolution: '$(solution)' + + - task: VSBuild@1 + displayName: 'Build' + inputs: + solution: '_build/*.sln' + platform: '$(buildPlatform)' + configuration: '$(buildConfiguration)' + + - task: VSTest@2 + displayName: 'Tests' + inputs: + platform: '$(buildPlatform)' + configuration: '$(buildConfiguration)' + + +- job: Linux + + variables: + buildConfiguration: 'Release' + generator: 'Unix Makefiles' + + pool: + vmImage: 'ubuntu-22.04' + + steps: + - task: CMake@1 + displayName: 'Configure' + inputs: + workingDirectory: '_build' + cmakeArgs: '.. -G"$(generator)" -DCMAKE_BUILD_TYPE="$(buildConfiguration)"' + + - task: CMake@1 + displayName: 'Build' + workingDirectory: '_build' + cmakeArgs: '--build' From 55f9543e315a6bde8cb8a7d9fa17232d678cd8e0 Mon Sep 17 00:00:00 2001 From: mueller Date: Sat, 11 Mar 2023 11:42:43 +0100 Subject: [PATCH 3/8] Fixed syntax error. --- azure-pipelines.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index d8c4b093..dc7049fe 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -75,5 +75,6 @@ jobs: - task: CMake@1 displayName: 'Build' + inputs: workingDirectory: '_build' cmakeArgs: '--build' From 6e2ba04af46058c1d93b8fb979f496f65512ec19 Mon Sep 17 00:00:00 2001 From: mueller Date: Sat, 11 Mar 2023 11:44:56 +0100 Subject: [PATCH 4/8] Fix Linux build step --- azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index dc7049fe..88834ec5 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -77,4 +77,4 @@ jobs: displayName: 'Build' inputs: workingDirectory: '_build' - cmakeArgs: '--build' + cmakeArgs: '--build .' From 93f99411899714853b1b8915c81b3858f8b6adbb Mon Sep 17 00:00:00 2001 From: mueller Date: Sat, 11 Mar 2023 11:49:32 +0100 Subject: [PATCH 5/8] Added missing typename --- power_overwhelming/include/power_overwhelming/collector.inl | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/power_overwhelming/include/power_overwhelming/collector.inl b/power_overwhelming/include/power_overwhelming/collector.inl index 2a6cc01f..b6367cdc 100644 --- a/power_overwhelming/include/power_overwhelming/collector.inl +++ b/power_overwhelming/include/power_overwhelming/collector.inl @@ -13,10 +13,11 @@ visus::power_overwhelming::collector::from_sensor_lists( const collector_settings& settings, TSensorLists&&... sensors) { std::array>, sizeof...(sensors)> instances = { move_to_heap(sensors)... }; + typedef typename decltype(instances)::value_type sensor_type; const auto cnt = std::accumulate(instances.begin(), instances.end(), static_cast(0), - [](const std::size_t s, const decltype(instances)::value_type& v) { + [](const std::size_t s, const sensor_type& v) { return std::size(v) + s; }); @@ -71,7 +72,7 @@ visus::power_overwhelming::collector::move_to_heap(TSensorList&& sensors) { std::transform(sensors.begin(), sensors.end(), std::back_inserter(retval), [](typename sensor_type& s) { - return std::unique_ptr(new typename sensor_type(std::move(s))); + return std::unique_ptr(new sensor_type(std::move(s))); }); return retval; From 8f11c9e1a44f95bd86b8896726d51ee98e3623db Mon Sep 17 00:00:00 2001 From: mueller Date: Sat, 11 Mar 2023 11:55:50 +0100 Subject: [PATCH 6/8] Added test for collector_settings. --- .../include/power_overwhelming/collector.inl | 2 +- test/collector_test.cpp | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/power_overwhelming/include/power_overwhelming/collector.inl b/power_overwhelming/include/power_overwhelming/collector.inl index b6367cdc..2d42c3a5 100644 --- a/power_overwhelming/include/power_overwhelming/collector.inl +++ b/power_overwhelming/include/power_overwhelming/collector.inl @@ -71,7 +71,7 @@ visus::power_overwhelming::collector::move_to_heap(TSensorList&& sensors) { retval.reserve(std::size(sensors)); std::transform(sensors.begin(), sensors.end(), std::back_inserter(retval), - [](typename sensor_type& s) { + [](sensor_type& s) { return std::unique_ptr(new sensor_type(std::move(s))); }); diff --git a/test/collector_test.cpp b/test/collector_test.cpp index f2203e2b..4ea9a66b 100644 --- a/test/collector_test.cpp +++ b/test/collector_test.cpp @@ -17,6 +17,20 @@ namespace test { public: + TEST_METHOD(test_settings) { + collector_settings settings; + Assert::AreEqual(collector_settings::default_output_path, settings.output_path(), L"Default for output_path", LINE_INFO()); + Assert::AreEqual(collector_settings::default_sampling_interval, settings.sampling_interval(), L"Default for sampling_interval", LINE_INFO()); + + settings.output_path(L"bla.txt").sampling_interval(42); + Assert::AreEqual(L"bla.txt", settings.output_path(), L"Set output_path", LINE_INFO()); + Assert::AreEqual(collector_settings::sampling_interval_type(42), settings.sampling_interval(), L"Set sampling_interval", LINE_INFO()); + + auto copy = settings; + Assert::AreEqual(settings.output_path(), copy.output_path(), L"Copy output_path", LINE_INFO()); + Assert::AreEqual(settings.sampling_interval(), copy.sampling_interval(), L"Copy sampling_interval", LINE_INFO()); + } + TEST_METHOD(test_for_all) { auto collector = collector::for_all(L"test.csv"); Assert::IsTrue(bool(collector), L"New collector is valid.", LINE_INFO()); From e2ff6752e0ab9472191218ef48f34b0f6551bfee Mon Sep 17 00:00:00 2001 From: mueller Date: Sat, 11 Mar 2023 11:58:06 +0100 Subject: [PATCH 7/8] Fix copy-paste on Linux --- power_overwhelming/src/collector_impl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/power_overwhelming/src/collector_impl.cpp b/power_overwhelming/src/collector_impl.cpp index 26a04fef..5c534942 100644 --- a/power_overwhelming/src/collector_impl.cpp +++ b/power_overwhelming/src/collector_impl.cpp @@ -60,7 +60,7 @@ void visus::power_overwhelming::detail::collector_impl::apply( this->stream = std::wofstream(output_path, std::ofstream::trunc); #else /* defined(_WIN32) */ auto p = convert_string(output_path); - retval._impl->stream = std::wofstream(p, std::ofstream::trunc); + this->stream = std::wofstream(p, std::ofstream::trunc); #endif /* defined(_WIN32) */ this->sampling_interval = std::chrono::microseconds( From 559822b36ce128f2f2d469b4fb4644cbf7773e47 Mon Sep 17 00:00:00 2001 From: mueller Date: Sat, 11 Mar 2023 12:00:15 +0100 Subject: [PATCH 8/8] Fixed another copy-paste --- power_overwhelming/src/collector_impl.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/power_overwhelming/src/collector_impl.cpp b/power_overwhelming/src/collector_impl.cpp index 5c534942..2f4eaa01 100644 --- a/power_overwhelming/src/collector_impl.cpp +++ b/power_overwhelming/src/collector_impl.cpp @@ -11,6 +11,7 @@ #include "power_overwhelming/adl_sensor.h" #include "power_overwhelming/emi_sensor.h" #include "power_overwhelming/collector.h" +#include "power_overwhelming/convert_string.h" #include "power_overwhelming/nvml_sensor.h" #include "power_overwhelming/hmc8015_sensor.h" #include "power_overwhelming/tinkerforge_sensor.h" @@ -59,7 +60,7 @@ void visus::power_overwhelming::detail::collector_impl::apply( #if defined(_WIN32) this->stream = std::wofstream(output_path, std::ofstream::trunc); #else /* defined(_WIN32) */ - auto p = convert_string(output_path); + auto p = power_overwhelming::convert_string(output_path); this->stream = std::wofstream(p, std::ofstream::trunc); #endif /* defined(_WIN32) */