From de01a75cab51ca4d0a4327b6f654f8729ceb2616 Mon Sep 17 00:00:00 2001 From: Andrej Babic Date: Mon, 6 Apr 2020 16:21:30 +0200 Subject: [PATCH] Remove try catch around errors we cannot recover from --- core-writer/include/H5WriteModule.hpp | 1 + core-writer/src/module/H5WriteModule.cpp | 197 +++++++++++------------ 2 files changed, 97 insertions(+), 101 deletions(-) diff --git a/core-writer/include/H5WriteModule.hpp b/core-writer/include/H5WriteModule.hpp index f0cbbe7..6858445 100644 --- a/core-writer/include/H5WriteModule.hpp +++ b/core-writer/include/H5WriteModule.hpp @@ -32,6 +32,7 @@ public: const int n_frames = 0, const int user_id = -1 ); + void stop_writing(); }; diff --git a/core-writer/src/module/H5WriteModule.cpp b/core-writer/src/module/H5WriteModule.cpp index c09302e..0613913 100644 --- a/core-writer/src/module/H5WriteModule.cpp +++ b/core-writer/src/module/H5WriteModule.cpp @@ -85,123 +85,118 @@ void H5WriteModule::write_thread( auto raw_frames_dataset_name = config::raw_image_dataset_name; - try { + writer.create_file(); + uint64_t last_pulse_id = 0; - writer.create_file(); - uint64_t last_pulse_id = 0; + while(is_writing_.load(memory_order_relaxed)) { - while(is_writing_.load(memory_order_relaxed)) { + auto received_data = ring_buffer_.read(); - auto received_data = ring_buffer_.read(); + // .first is nullptr if ringbuffer is empty. + if(received_data.first == nullptr) { + this_thread::sleep_for(chrono::milliseconds( + config::ring_buffer_read_retry_interval)); + continue; + } - // .first is nullptr if ringbuffer is empty. - if(received_data.first == nullptr) { - this_thread::sleep_for(chrono::milliseconds( - config::ring_buffer_read_retry_interval)); - continue; - } + // Write file format before rolling to next file. + if (!writer.is_data_for_current_file( + received_data.first->frame_index)) { - // Write file format before rolling to next file. - if (!writer.is_data_for_current_file( - received_data.first->frame_index)) { + #ifdef DEBUG_OUTPUT + using namespace date; + using namespace chrono; - #ifdef DEBUG_OUTPUT - using namespace date; - using namespace chrono; + cout << "[" << system_clock::now() << "]"; + cout << "[H5WriteModule::write_thread] Frame index "; + cout << received_data.first->frame_index; + cout << " does not belong to current file. "; + cout << " Write format before switching file." << endl; + #endif - cout << "[" << system_clock::now() << "]"; - cout << "[H5WriteModule::write_thread] Frame index "; - cout << received_data.first->frame_index; - cout << " does not belong to current file. "; - cout << " Write format before switching file." << endl; - #endif + writer.write_metadata_to_file(); + H5FormatUtils::write_format(writer.get_h5_file(), format_, {}); + } - writer.write_metadata_to_file(); - write_h5_format(writer.get_h5_file()); - } + #ifdef PERF_OUTPUT + using namespace date; + using namespace chrono; - #ifdef PERF_OUTPUT - using namespace date; - using namespace chrono; + auto start_time_frame = system_clock::now(); + #endif - auto start_time_frame = system_clock::now(); - #endif + // Write image data. + writer.write_data( + raw_frames_dataset_name, + received_data.first->frame_index, + received_data.second, + received_data.first->frame_shape, + received_data.first->frame_bytes_size, + received_data.first->type, + received_data.first->endianness); - // Write image data. - writer.write_data( - raw_frames_dataset_name, + #ifdef PERF_OUTPUT + using namespace date; + using namespace chrono; + + auto frame_time_difference = system_clock::now() - start_time_frame; + + auto frame_diff_ms = + duration(frame_time_difference).count(); + + cout << "[" << system_clock::now() << "]"; + cout << "[H5WriteModule::write_thread] Frame index "; + cout << received_data.first->frame_index; + cout << " written in " << frame_diff_ms << " ms." << endl; + #endif + + ring_buffer_.release(received_data.first->buffer_slot_index); + + #ifdef PERF_OUTPUT + using namespace date; + using namespace chrono; + + auto start_time_metadata = system_clock::now(); + #endif + + for (const auto& header_type : header_values_) { + + auto& name = header_type.first; + auto value = received_data.first->header_values.at(name); + + writer.cache_metadata( + name, received_data.first->frame_index, - received_data.second, - received_data.first->frame_shape, - received_data.first->frame_bytes_size, - received_data.first->type, - received_data.first->endianness); - - #ifdef PERF_OUTPUT - using namespace date; - using namespace chrono; - - auto frame_time_difference = system_clock::now() - start_time_frame; - - auto frame_diff_ms = - duration(frame_time_difference).count(); - - cout << "[" << system_clock::now() << "]"; - cout << "[H5WriteModule::write_thread] Frame index "; - cout << received_data.first->frame_index; - cout << " written in " << frame_diff_ms << " ms." << endl; - #endif - - ring_buffer_.release(received_data.first->buffer_slot_index); - - #ifdef PERF_OUTPUT - using namespace date; - using namespace chrono; - - auto start_time_metadata = system_clock::now(); - #endif - - for (const auto& header_type : header_values_) { - - auto& name = header_type.first; - auto value = received_data.first->header_values.at(name); - - writer.cache_metadata( - name, - received_data.first->frame_index, - value.get()); - } - - #ifdef PERF_OUTPUT - using namespace date; - using namespace chrono; - - auto metadata_time_difference = system_clock::now() - start_time_metadata; - auto metadata_diff_ms = duration(metadata_time_difference).count(); - - cout << "[" << system_clock::now() << "]"; - cout << "[H5WriteModule::write_thread] Frame metadata index "; - cout << received_data.first->frame_index << " written in " << metadata_diff_ms << " ms." << endl; - #endif + value.get()); } - if (writer.is_file_open()) { - #ifdef DEBUG_OUTPUT - using namespace date; - using namespace chrono; + #ifdef PERF_OUTPUT + using namespace date; + using namespace chrono; - cout << "[" << system_clock::now() << "]"; - cout << "[H5WriteModule::write_thread]"; - cout << " Writing file format." << endl; - #endif + auto metadata_time_difference = system_clock::now() - start_time_metadata; + auto metadata_diff_ms = duration(metadata_time_difference).count(); - writer.write_metadata_to_file(); + cout << "[" << system_clock::now() << "]"; + cout << "[H5WriteModule::write_thread] Frame metadata index "; + cout << received_data.first->frame_index << " written in " << metadata_diff_ms << " ms." << endl; + #endif + } - write_h5_format(writer.get_h5_file()); - writer.close_file(); - } - } catch (const exception& ex) { - writing_error(ex.what()); + if (writer.is_file_open()) { + #ifdef DEBUG_OUTPUT + using namespace date; + using namespace chrono; + + cout << "[" << system_clock::now() << "]"; + cout << "[H5WriteModule::write_thread]"; + cout << " Writing file format." << endl; + #endif + + writer.write_metadata_to_file(); + H5FormatUtils::write_format(writer.get_h5_file(), format_, {}); + + writer.close_file(); } #ifdef DEBUG_OUTPUT @@ -210,6 +205,6 @@ void H5WriteModule::write_thread( cout << "[" << system_clock::now() << "]"; cout << "[H5WriteModule::write_thread]"; - cout << " Write thread stopped." << endl; + cout << " Writer thread stopped." << endl; #endif }