mirror of
https://github.com/paulscherrerinstitute/sf_daq_buffer.git
synced 2026-04-30 06:12:23 +02:00
Improving writer manager
This commit is contained in:
+36
-2
@@ -5,7 +5,7 @@
|
||||
using namespace std;
|
||||
|
||||
WriterManager::WriterManager(map<string, DATA_TYPE>* 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<string, uint64_t> WriterManager::get_statistics()
|
||||
return result;
|
||||
}
|
||||
|
||||
map<string, boost::any>& WriterManager::get_parameters(){
|
||||
map<string, boost::any> WriterManager::get_parameters(){
|
||||
return parameters;
|
||||
}
|
||||
|
||||
void WriterManager::set_parameters(map<string, boost::any>& new_parameters)
|
||||
{
|
||||
lock_guard<mutex> 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<mutex> lock(parameters_mutex);
|
||||
|
||||
for (auto parameter : *parameters_type) {
|
||||
auto parameter_name = parameter.first;
|
||||
|
||||
if (parameters.count(parameter_name) == 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -4,29 +4,36 @@
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <atomic>
|
||||
#include <mutex>
|
||||
#include <boost/any.hpp>
|
||||
|
||||
#include "H5Format.hpp"
|
||||
|
||||
class WriterManager
|
||||
{
|
||||
|
||||
std::map<std::string, boost::any> parameters = {};
|
||||
std::mutex parameters_mutex;
|
||||
|
||||
// Initialize in constructor.
|
||||
std::map<std::string, DATA_TYPE>* parameters_type;
|
||||
size_t n_images;
|
||||
std::atomic_bool running_flag;
|
||||
std::atomic_bool killed_flag;
|
||||
std::atomic<uint64_t> n_received_frames;
|
||||
std::atomic<uint64_t> n_written_frames;
|
||||
|
||||
public:
|
||||
WriterManager(std::map<std::string, DATA_TYPE>* 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<std::string, DATA_TYPE>* get_parameters_type();
|
||||
std::map<std::string, boost::any>& get_parameters();
|
||||
std::map<std::string, boost::any> get_parameters();
|
||||
void set_parameters(std::map<std::string, boost::any>& new_parameters);
|
||||
|
||||
std::map<std::string, uint64_t> get_statistics();
|
||||
|
||||
Reference in New Issue
Block a user