@@ -342,17 +342,24 @@ void SubscriberConnection::SetSubscriptionInfo(const string& value)
342342 m_subscriptionInfo = source + " version " + version + " updated on " + updatedOn;
343343}
344344
345- const SignalIndexCachePtr& SubscriberConnection::GetSignalIndexCache () const
345+ const SignalIndexCachePtr& SubscriberConnection::GetSignalIndexCache ()
346346{
347+ ReaderLock readLock (m_signalIndexCacheLock);
348+
347349 return m_signalIndexCache;
348350}
349351
350352void SubscriberConnection::SetSignalIndexCache (SignalIndexCachePtr signalIndexCache)
351353{
354+ WriterLock writeLock (m_signalIndexCacheLock);
355+
352356 m_signalIndexCache = std::move (signalIndexCache);
353357
354358 // Update measurement routes for newly subscribed measurement signal IDs
355359 m_parent->m_routingTables .UpdateRoutes (shared_from_this (), m_signalIndexCache->GetSignalIDs ());
360+
361+ // Reset TSSC encoder on successful (re)subscription
362+ m_tsscResetRequested = true ;
356363}
357364
358365uint64_t SubscriberConnection::GetTotalCommandChannelBytesSent () const
@@ -748,15 +755,9 @@ void SubscriberConnection::HandleSubscribe(uint8_t* data, uint32_t length)
748755 // Send updated signal index cache to client with validated rights of the selected input measurement keys
749756 SendResponse (ServerResponse::UpdateSignalIndexCache, ServerCommand::Subscribe, SerializeSignalIndexCache (*signalIndexCache));
750757 }
751-
752- m_tsscEncoderLock.lock ();
753758
754- // Reset TSSC encoder on successful (re)subscription
755- m_tsscResetRequested = true ;
756759 SetSignalIndexCache (signalIndexCache);
757760
758- m_tsscEncoderLock.unlock ();
759-
760761 // If using compact measurement format with base time offsets, setup base time rotation timer
761762 if (!m_usingPayloadCompression && m_parent->GetUseBaseTimeOffsets () && m_includeTime)
762763 {
@@ -1126,7 +1127,8 @@ SignalIndexCachePtr SubscriberConnection::ParseSubscriptionRequest(const string&
11261127
11271128void SubscriberConnection::PublishCompactMeasurements (const std::vector<MeasurementPtr>& measurements)
11281129{
1129- CompactMeasurement serializer (m_signalIndexCache, m_baseTimeOffsets, m_includeTime, m_useMillisecondResolution, m_timeIndex);
1130+ const SignalIndexCachePtr signalIndexCache = GetSignalIndexCache ();
1131+ CompactMeasurement serializer (signalIndexCache, m_baseTimeOffsets, m_includeTime, m_useMillisecondResolution, m_timeIndex);
11301132 vector<uint8_t > packet, buffer;
11311133 int32_t count = 0 ;
11321134
@@ -1137,7 +1139,7 @@ void SubscriberConnection::PublishCompactMeasurements(const std::vector<Measurem
11371139 {
11381140 const Measurement& measurement = *measurements[i];
11391141 const int64_t timestamp = measurement.Timestamp ;
1140- const int32_t runtimeID = m_signalIndexCache ->GetSignalIndex (measurement.SignalID );
1142+ const int32_t runtimeID = signalIndexCache ->GetSignalIndex (measurement.SignalID );
11411143
11421144 if (runtimeID == Int32::MaxValue)
11431145 continue ;
@@ -1193,7 +1195,7 @@ void SubscriberConnection::PublishCompactDataPacket(const vector<uint8_t>& packe
11931195
11941196void SubscriberConnection::PublishTSSCMeasurements (const std::vector<MeasurementPtr>& measurements)
11951197{
1196- m_tsscEncoderLock. lock ();
1198+ const SignalIndexCachePtr signalIndexCache = GetSignalIndexCache ();
11971199
11981200 if (m_tsscResetRequested)
11991201 {
@@ -1216,7 +1218,7 @@ void SubscriberConnection::PublishTSSCMeasurements(const std::vector<Measurement
12161218
12171219 for (const auto & measurement : measurements)
12181220 {
1219- const int32_t index = m_signalIndexCache ->GetSignalIndex (measurement->SignalID );
1221+ const int32_t index = signalIndexCache ->GetSignalIndex (measurement->SignalID );
12201222
12211223 if (!m_tsscEncoder.TryAddMeasurement (index, measurement->Timestamp , static_cast <uint32_t >(measurement->Flags ), static_cast <float32_t >(measurement->AdjustedValue ())))
12221224 {
@@ -1231,8 +1233,6 @@ void SubscriberConnection::PublishTSSCMeasurements(const std::vector<Measurement
12311233
12321234 if (count > 0 )
12331235 PublishTSSCDataPacket (count);
1234-
1235- m_tsscEncoderLock.unlock ();
12361236}
12371237
12381238void SubscriberConnection::PublishTSSCDataPacket (int32_t count)
0 commit comments