diff --git a/slsReceiverSoftware/src/ClientInterface.cpp b/slsReceiverSoftware/src/ClientInterface.cpp index 192daab98..09ee538bc 100644 --- a/slsReceiverSoftware/src/ClientInterface.cpp +++ b/slsReceiverSoftware/src/ClientInterface.cpp @@ -83,7 +83,8 @@ void ClientInterface::startTCPServer() { try { auto socket = server.accept(); try { - verifyLock(); + verifyLock(); // lock should be checked only for set (not get), + // Move it back? ret = decodeFunction(socket); } catch (const RuntimeError &e) { // We had an error needs to be sent to client @@ -1115,7 +1116,7 @@ int ClientInterface::set_additional_json_header(Interface &socket) { json[key] = value; } } - verifyIdle(socket); + // verifyIdle(socket); allowing it to be set on the fly LOG(logDEBUG1) << "Setting additional json header: " << sls::ToString(json); impl()->setAdditionalJsonHeader(json); return socket.Send(OK); @@ -1531,7 +1532,7 @@ int ClientInterface::increment_file_index(Interface &socket) { int ClientInterface::set_additional_json_parameter(Interface &socket) { char args[2][SHORT_STR_LENGTH]{}; socket.Receive(args); - verifyIdle(socket); + // verifyIdle(socket); allowing it to be set on the fly LOG(logDEBUG1) << "Setting additional json parameter (" << args[0] << "): " << args[1]; impl()->setAdditionalJsonParameter(args[0], args[1]); diff --git a/slsReceiverSoftware/src/DataStreamer.cpp b/slsReceiverSoftware/src/DataStreamer.cpp index 9c55803a7..5bb21895e 100644 --- a/slsReceiverSoftware/src/DataStreamer.cpp +++ b/slsReceiverSoftware/src/DataStreamer.cpp @@ -69,7 +69,9 @@ void DataStreamer::SetFlippedDataX(int fd) { flippedDataX = fd; } void DataStreamer::SetAdditionalJsonHeader( const std::map &json) { - additionJsonHeader = json; + std::lock guard guard(additionalJsonMutex); + additionalJsonHeader = json; + isAdditionalJsonUpdated = true; } void DataStreamer::CreateZmqSockets(int *nunits, uint32_t port, @@ -232,7 +234,13 @@ int DataStreamer::SendHeader(sls_receiver_header *rheader, uint32_t size, zHeader.quad = *quadEnable; zHeader.completeImage = (header.packetNumber < generalData->packetsPerFrame ? false : true); - zHeader.addJsonHeader = additionJsonHeader; + + if (isAdditionalJsonUpdated) { + std::lock_guard guard(additionalalJsonMutex); + localAdditionalJsonHeader = additionalJsonHeader; + isAdditionalalJsonUpdated = false; + } + zHeader.addJsonHeader = localAdditionalJsonHeader; return zmqSocket->SendHeader(index, zHeader); } diff --git a/slsReceiverSoftware/src/DataStreamer.h b/slsReceiverSoftware/src/DataStreamer.h index bbfc5aba9..bfe9d69bd 100644 --- a/slsReceiverSoftware/src/DataStreamer.h +++ b/slsReceiverSoftware/src/DataStreamer.h @@ -166,7 +166,17 @@ class DataStreamer : private virtual slsDetectorDefs, public ThreadObject { int flippedDataX; /** additional json header */ - std::map additionJsonHeader; + std::map additionalJsonHeader; + + /** Used by streamer thread to update local copy (reduce number of locks + * during streaming) */ + std::atomic{false}; + + /** mutex to update json and to read and update local copy */ + std::mutex additionalJsonMutex; + + /** local copy of additional json header (it can be update on the fly) */ + std::map localAdditionalJsonHeader; /** Aquisition Started flag */ bool startedFlag{nullptr};