From ea601fe1f7a9f34c7c66536bf5c078f8a23a3e8e Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 7 Sep 2020 11:52:51 +0200 Subject: [PATCH] lock to ensure json add header can be updated on the fly --- slsReceiverSoftware/src/DataStreamer.cpp | 7 ++++--- slsReceiverSoftware/src/DataStreamer.h | 5 +++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/slsReceiverSoftware/src/DataStreamer.cpp b/slsReceiverSoftware/src/DataStreamer.cpp index 5bb21895e..74d4e37a6 100644 --- a/slsReceiverSoftware/src/DataStreamer.cpp +++ b/slsReceiverSoftware/src/DataStreamer.cpp @@ -69,7 +69,7 @@ void DataStreamer::SetFlippedDataX(int fd) { flippedDataX = fd; } void DataStreamer::SetAdditionalJsonHeader( const std::map &json) { - std::lock guard guard(additionalJsonMutex); + std::lock_guard lock(additionalJsonMutex); additionalJsonHeader = json; isAdditionalJsonUpdated = true; } @@ -235,10 +235,11 @@ int DataStreamer::SendHeader(sls_receiver_header *rheader, uint32_t size, zHeader.completeImage = (header.packetNumber < generalData->packetsPerFrame ? false : true); + // update local copy only if it was updated (to prevent locking each time) if (isAdditionalJsonUpdated) { - std::lock_guard guard(additionalalJsonMutex); + std::lock_guard lock(additionalJsonMutex); localAdditionalJsonHeader = additionalJsonHeader; - isAdditionalalJsonUpdated = false; + isAdditionalJsonUpdated = false; } zHeader.addJsonHeader = localAdditionalJsonHeader; diff --git a/slsReceiverSoftware/src/DataStreamer.h b/slsReceiverSoftware/src/DataStreamer.h index bfe9d69bd..89f213b97 100644 --- a/slsReceiverSoftware/src/DataStreamer.h +++ b/slsReceiverSoftware/src/DataStreamer.h @@ -16,6 +16,7 @@ class DataStreamer; class ZmqSocket; #include +#include class DataStreamer : private virtual slsDetectorDefs, public ThreadObject { @@ -170,10 +171,10 @@ class DataStreamer : private virtual slsDetectorDefs, public ThreadObject { /** Used by streamer thread to update local copy (reduce number of locks * during streaming) */ - std::atomic{false}; + std::atomic isAdditionalJsonUpdated{false}; /** mutex to update json and to read and update local copy */ - std::mutex additionalJsonMutex; + mutable std::mutex additionalJsonMutex; /** local copy of additional json header (it can be update on the fly) */ std::map localAdditionalJsonHeader;