From c2b59145f63c68b130b6a70aa53a09f05cd17b86 Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Tue, 14 Apr 2026 15:43:51 +0200 Subject: [PATCH] Fixes for thread-safety and logic issues --- acquisition_device/AcquisitionCounters.cpp | 18 ++---------------- acquisition_device/AcquisitionCounters.h | 4 ---- acquisition_device/AcquisitionDevice.cpp | 4 ++-- acquisition_device/FPGAAcquisitionDevice.cpp | 2 +- 4 files changed, 5 insertions(+), 23 deletions(-) diff --git a/acquisition_device/AcquisitionCounters.cpp b/acquisition_device/AcquisitionCounters.cpp index 1ef54d1c..96675170 100644 --- a/acquisition_device/AcquisitionCounters.cpp +++ b/acquisition_device/AcquisitionCounters.cpp @@ -31,9 +31,7 @@ void AcquisitionCounters::Reset(const DiffractionExperiment &experiment, uint16_ curr_frame_number[i] = 0; handle_for_frame = std::vector(expected_frames * nmodules, HandleNotFound); - handle_for_pedestal = std::vector(nmodules * 16, HandleNotFound); // 16 = storage cells packets_collected = std::vector(expected_frames * nmodules); - saved_completions = std::vector(expected_frames * nmodules); packets_per_module = std::vector(nmodules); total_packets = 0; expected_packets_per_module = 512 * experiment.GetFPGASummation(); @@ -76,7 +74,6 @@ void AcquisitionCounters::UpdateCounters(const Completion *c) { packets_collected.at(c->frame_number * nmodules + c->module_number) = c->packet_count; handle_for_frame.at(c->frame_number * nmodules + c->module_number) = c->handle; - saved_completions.at(c->frame_number * nmodules + c->module_number) = *c; total_packets += c->packet_count; packets_per_module[c->module_number] += c->packet_count; @@ -91,6 +88,7 @@ void AcquisitionCounters::SetAcquisitionFinished() { } uint64_t AcquisitionCounters::GetBufferHandle(size_t frame, uint16_t module_number) const { + std::shared_lock sl(m); if (frame >= expected_frames) throw JFJochException(JFJochExceptionCategory::ArrayOutOfBounds, "GetBufferHandle Wrong frame number: " + std::to_string(frame)); @@ -115,18 +113,6 @@ uint64_t AcquisitionCounters::GetBufferHandleAndClear(size_t frame, uint16_t mod return ret_val; } -uint64_t AcquisitionCounters::GetPedestalBufferHandle(size_t storage_cell, uint16_t module_number) const { - std::unique_lock ul(m); - if (storage_cell >= 16) - throw JFJochException(JFJochExceptionCategory::ArrayOutOfBounds, - "GetBufferHandleAndClear Wrong frame number: " + std::to_string(storage_cell)); - if (module_number >= nmodules) - throw JFJochException(JFJochExceptionCategory::ArrayOutOfBounds, - "GetBufferHandleAndClear Wrong module number: " + std::to_string(module_number) - + " for SC " + std::to_string(storage_cell)); - return handle_for_pedestal.at(storage_cell * nmodules + module_number); -} - uint64_t AcquisitionCounters::GetCurrFrameNumber(uint16_t module_number) const { if (module_number >= max_modules) throw JFJochException(JFJochExceptionCategory::ArrayOutOfBounds, @@ -207,7 +193,7 @@ uint64_t AcquisitionCounters::GetTotalPackets() const { } uint64_t AcquisitionCounters::GetTotalPackets(uint16_t module_number) const { - std::unique_lock ul(m); + std::shared_lock sl(m); if (module_number >= nmodules) throw JFJochException(JFJochExceptionCategory::ArrayOutOfBounds, diff --git a/acquisition_device/AcquisitionCounters.h b/acquisition_device/AcquisitionCounters.h index 622f2a06..4222d328 100644 --- a/acquisition_device/AcquisitionCounters.h +++ b/acquisition_device/AcquisitionCounters.h @@ -22,11 +22,8 @@ class AcquisitionCounters { mutable std::condition_variable_any data_updated; std::vector handle_for_frame; - std::vector handle_for_pedestal; std::vector packets_collected; - std::vector saved_completions; - uint64_t total_packets; std::vector packets_per_module; @@ -56,7 +53,6 @@ public: void WaitForFrame(size_t curr_frame, uint16_t module_number = UINT16_MAX) const; int64_t CalculateDelay(size_t curr_frame, uint16_t module_number = UINT16_MAX) const; // mutex acquired indirectly uint64_t GetBufferHandle(size_t frame, uint16_t module_number) const; - uint64_t GetPedestalBufferHandle(size_t storage_cell, uint16_t module_number) const; bool IsFullModuleCollected(size_t frame, uint16_t module_number) const; bool IsAnyPacketCollected(size_t frame, uint16_t module_number) const; bool IsAcquisitionFinished() const; diff --git a/acquisition_device/AcquisitionDevice.cpp b/acquisition_device/AcquisitionDevice.cpp index a087b2aa..c252376d 100644 --- a/acquisition_device/AcquisitionDevice.cpp +++ b/acquisition_device/AcquisitionDevice.cpp @@ -294,8 +294,8 @@ DeviceStatus AcquisitionDevice::GetDeviceStatus() const { AcquisitionDeviceStatistics AcquisitionDevice::GetStatistics() const { AcquisitionDeviceStatistics ret{}; ret.bytes_received = GetBytesReceived(); - ret.start_timestamp = start_time.time_since_epoch().count(); - ret.end_timestamp = end_time.time_since_epoch().count(); + ret.start_timestamp = std::chrono::system_clock::to_time_t(start_time); + ret.end_timestamp = std::chrono::system_clock::to_time_t(end_time); ret.packets_expected = counters.GetTotalExpectedPackets(); ret.good_packets = counters.GetTotalPackets(); diff --git a/acquisition_device/FPGAAcquisitionDevice.cpp b/acquisition_device/FPGAAcquisitionDevice.cpp index 72f8687a..87bda00b 100644 --- a/acquisition_device/FPGAAcquisitionDevice.cpp +++ b/acquisition_device/FPGAAcquisitionDevice.cpp @@ -123,7 +123,7 @@ void FPGAAcquisitionDevice::InitializeIntegrationMap(const uint16_t *map, const } void FPGAAcquisitionDevice::SetInternalGeneratorFrame(const uint16_t *input, size_t module_number) { - memcpy(buffer_device[0], input, RAW_MODULE_SIZE * sizeof(uint16_t)); + memcpy(buffer_device[0]->pixels, input, RAW_MODULE_SIZE * sizeof(uint16_t)); buffer_device[0]->module_statistics.module_number = module_number; buffer_device[0]->module_statistics.load_calibration_destination = LOAD_CALIBRATION_DEST_FRAME_GEN; LoadCalibration(0);