From c5140fef68d27b694eca33ac86c996762decf256 Mon Sep 17 00:00:00 2001 From: Andrej Babic Date: Wed, 24 Jan 2018 16:21:46 +0100 Subject: [PATCH] Improving writer manager --- src/WriterManager.cpp | 38 ++++++++++++++++++++++++++++++++++++-- src/WriterManager.hpp | 11 +++++++++-- 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src/WriterManager.cpp b/src/WriterManager.cpp index ef6c5ba..ad528ff 100644 --- a/src/WriterManager.cpp +++ b/src/WriterManager.cpp @@ -5,7 +5,7 @@ using namespace std; WriterManager::WriterManager(map* parameters_type, uint64_t n_images): - parameters_type(parameters_type), n_images(n_images), running_flag(true), n_received_frames(0), n_written_frames(0) + parameters_type(parameters_type), n_images(n_images), running_flag(true), killed_flag(false), n_received_frames(0), n_written_frames(0) { #ifdef DEBUG_OUTPUT cout << "[WriterManager::WriterManager] Writer manager for n_images " << n_images << endl; @@ -21,12 +21,25 @@ void WriterManager::stop() running_flag = false; } +void WriterManager::kill() +{ + #ifdef DEBUG_OUTPUT + cout << "[WriterManager::kills] Killing writer manager." << endl; + #endif + + killed_flag = true; + + stop(); +} + string WriterManager::get_status() { if (running_flag) { return "receiving"; } else if (n_received_frames > n_written_frames) { return "writing"; + } else if (!are_all_parameters_set()) { + return "waiting for parameters"; } else { return "finished"; } @@ -41,12 +54,14 @@ map WriterManager::get_statistics() return result; } -map& WriterManager::get_parameters(){ +map WriterManager::get_parameters(){ return parameters; } void WriterManager::set_parameters(map& new_parameters) { + lock_guard lock(parameters_mutex); + for (auto parameter : new_parameters) { string parameter_name = parameter.first; auto parameter_value = parameter.second; @@ -69,6 +84,11 @@ bool WriterManager::is_running() return running_flag.load(); } +bool WriterManager::is_killed() +{ + return killed_flag.load(); +} + void WriterManager::received_frame(size_t frame_index) { n_received_frames++; @@ -77,4 +97,18 @@ void WriterManager::received_frame(size_t frame_index) void WriterManager::written_frame(size_t frame_index) { n_written_frames++; +} + +bool WriterManager::are_all_parameters_set() { + lock_guard lock(parameters_mutex); + + for (auto parameter : *parameters_type) { + auto parameter_name = parameter.first; + + if (parameters.count(parameter_name) == 0) { + return false; + } + } + + return true; } \ No newline at end of file diff --git a/src/WriterManager.hpp b/src/WriterManager.hpp index 710d445..af336c2 100644 --- a/src/WriterManager.hpp +++ b/src/WriterManager.hpp @@ -4,29 +4,36 @@ #include #include #include +#include #include #include "H5Format.hpp" class WriterManager { + std::map parameters = {}; + std::mutex parameters_mutex; // Initialize in constructor. std::map* parameters_type; size_t n_images; std::atomic_bool running_flag; + std::atomic_bool killed_flag; std::atomic n_received_frames; std::atomic n_written_frames; public: WriterManager(std::map* parameters_type, uint64_t n_images=0); void stop(); + void kill(); bool is_running(); + bool is_killed(); std::string get_status(); - + bool are_all_parameters_set(); + std::map* get_parameters_type(); - std::map& get_parameters(); + std::map get_parameters(); void set_parameters(std::map& new_parameters); std::map get_statistics();