diff --git a/core-buffer/include/BinaryWriter.hpp b/core-buffer/include/BinaryWriter.hpp index 10f1154..b2aec14 100644 --- a/core-buffer/include/BinaryWriter.hpp +++ b/core-buffer/include/BinaryWriter.hpp @@ -9,8 +9,8 @@ class BinaryWriter { const std::string device_name_; const std::string root_folder_; - std::string current_filename_; - int output_fd_; + std::string current_output_filename_; + int output_file_fd_; std::string latest_filename_; public: @@ -18,8 +18,9 @@ public: const std::string& device_name, const std::string& root_folder); - void write(uint64_t pulse_id, const JFFileFormat& buffer); + void write(const uint64_t pulse_id, const JFFileFormat* buffer); + void open_file(const std::string& filename); void close_current_file(); }; diff --git a/core-buffer/src/BinaryWriter.cpp b/core-buffer/src/BinaryWriter.cpp index eaeb274..e953432 100644 --- a/core-buffer/src/BinaryWriter.cpp +++ b/core-buffer/src/BinaryWriter.cpp @@ -5,16 +5,17 @@ #include #include #include +#include using namespace std; BinaryWriter::BinaryWriter( const string& device_name, const string& root_folder) : - device_name_(device_name), - root_folder_(root_folder), - current_filename_(""), - output_fd_(-1) + device_name_(device_name), + root_folder_(root_folder), + current_output_filename_(""), + output_file_fd_(-1) { latest_filename_ = root_folder + "/" + device_name + "/LATEST"; @@ -31,15 +32,51 @@ BinaryWriter::BinaryWriter( #endif } -void BinaryWriter::write(uint64_t pulse_id, const JFFileFormat& buffer) +void BinaryWriter::write(uint64_t pulse_id, const JFFileFormat* buffer) { + auto current_frame_file = + get_filename(root_folder_, device_name_, pulse_id); + if (current_frame_file != current_output_filename_) { + close_current_file(); + open_file(current_frame_file); + } + + auto n_bytes = ::write(output_file_fd_, buffer, sizeof(JFFileFormat)); + if (n_bytes < sizeof(JFFileFormat)) { + stringstream err_msg; + + using namespace date; + using namespace chrono; + err_msg << "[" << system_clock::now() << "]"; + err_msg << "[BinaryWriter::write"; + err_msg << " Error while writing to file "; + err_msg << current_output_filename_ << ": "; + err_msg << strerror(errno) << endl; + + throw runtime_error(err_msg.str()); + } + + auto sync_result = ::fdatasync(output_file_fd_); + if (sync_result < 0) { + stringstream err_msg; + + using namespace date; + using namespace chrono; + err_msg << "[" << system_clock::now() << "]"; + err_msg << "[BinaryWriter::write"; + err_msg << " Error while fdatasync on file "; + err_msg << current_output_filename_ << ": "; + err_msg << strerror(errno) << endl; + + throw runtime_error(err_msg.str()); + } } void BinaryWriter::close_current_file() { - if (output_fd_ != -1) { - if (close(output_fd_) < 0) { + if (output_file_fd_ != -1) { + if (close(output_file_fd_) < 0) { stringstream err_msg; using namespace date; @@ -47,18 +84,22 @@ void BinaryWriter::close_current_file() err_msg << "[" << system_clock::now() << "]"; err_msg << "[BinaryWriter::close_current_file]"; err_msg << " Error while closing file "; - err_msg << current_filename_ << ": "; + err_msg << current_output_filename_ << ": "; err_msg << strerror(errno) << endl; throw runtime_error(err_msg.str()); } + output_file_fd_ = -1; + // TODO: Ugly hack, please please fix it. stringstream latest_command; - latest_command << "echo " << current_filename_; + latest_command << "echo " << current_output_filename_; latest_command << " > " << latest_filename_; auto str_latest_command = latest_command.str(); system(str_latest_command.c_str()); } + + current_output_filename_ = ""; } \ No newline at end of file