Переглянути джерело

PubSub: Replace nmStore with a single variable

Julius Pfrommer 6 роки тому
батько
коміт
e0afb7f8cc
1 змінених файлів з 28 додано та 27 видалено
  1. 28 27
      src/pubsub/ua_pubsub.c

+ 28 - 27
src/pubsub/ua_pubsub.c

@@ -1101,51 +1101,52 @@ UA_WriterGroup_publishCallback(UA_Server *server, UA_WriterGroup *writerGroup) {
         return;
     }
 
-    //Alloc memory for the NetworkMessages on the stack
-    UA_STACKARRAY(UA_NetworkMessage, nmStore, networkMessageCount);
-    memset(nmStore, 0, networkMessageCount * sizeof(UA_NetworkMessage));
+    /* Prepare, encode and send the NetworkMessages */
     UA_UInt32 currentDSMPosition = 0;
     for(UA_UInt32 i = 0; i < networkMessageCount; i++) {
-        nmStore[i].version = 1;
-        nmStore[i].networkMessageType = UA_NETWORKMESSAGE_DATASET;
-        nmStore[i].payloadHeaderEnabled = true;
+        UA_NetworkMessage nm;
+        memset(&nm, 0, sizeof(UA_NetworkMessage));
+        nm.version = 1;
+        nm.networkMessageType = UA_NETWORKMESSAGE_DATASET;
+        nm.payloadHeaderEnabled = true;
+
         //create combined NetworkMessages
         if(i < (networkMessageCount-singleNetworkMessagesCount)){
             if(combinedNetworkMessageCount - (i * writerGroup->config.maxEncapsulatedDataSetMessageCount)){
                 if(combinedNetworkMessageCount == 1){
-                    nmStore[i].payloadHeader.dataSetPayloadHeader.count = (UA_Byte) ((writerGroup->writersCount) - singleNetworkMessagesCount);
+                    nm.payloadHeader.dataSetPayloadHeader.count = (UA_Byte) ((writerGroup->writersCount) - singleNetworkMessagesCount);
                     currentDSMPosition = 0;
                 } else {
-                    nmStore[i].payloadHeader.dataSetPayloadHeader.count = (UA_Byte) writerGroup->config.maxEncapsulatedDataSetMessageCount;
+                    nm.payloadHeader.dataSetPayloadHeader.count = (UA_Byte) writerGroup->config.maxEncapsulatedDataSetMessageCount;
                     currentDSMPosition = i * writerGroup->config.maxEncapsulatedDataSetMessageCount;
                 }
-                //nmStore[i].payloadHeader.dataSetPayloadHeader.count = (UA_Byte) writerGroup->config.maxEncapsulatedDataSetMessageCount;
-                nmStore[i].payload.dataSetPayload.dataSetMessages = &dsmStore[currentDSMPosition];
-                nmStore[i]payload.dataSetPayload.sizes = &dsmSizes[currentDSMPosition];
-                nmStore[i]payloadHeader.dataSetPayloadHeader.dataSetWriterIds = &dsWriterIds[currentDSMPosition];
+                //nm.payloadHeader.dataSetPayloadHeader.count = (UA_Byte) writerGroup->config.maxEncapsulatedDataSetMessageCount;
+                nm.payload.dataSetPayload.dataSetMessages = &dsmStore[currentDSMPosition];
+                nm.payload.dataSetPayload.sizes = &dsmSizes[currentDSMPosition];
+                nm.payloadHeader.dataSetPayloadHeader.dataSetWriterIds = &dsWriterIds[currentDSMPosition];
             } else {
                 currentDSMPosition = i * writerGroup->config.maxEncapsulatedDataSetMessageCount;
-                nmStore[i].payloadHeader.dataSetPayloadHeader.count = (UA_Byte) (currentDSMPosition - ((i - 1) * writerGroup->config.maxEncapsulatedDataSetMessageCount)); //attention cast from uint32 to byte
-                nmStore[i].payload.dataSetPayload.dataSetMessages = &dsmStore[currentDSMPosition];
-                nmStore[i]payload.dataSetPayload.sizes = &dsmSizes[currentDSMPosition];
-                nmStore[i]payloadHeader.dataSetPayloadHeader.dataSetWriterIds = &dsWriterIds[currentDSMPosition];
+                nm.payloadHeader.dataSetPayloadHeader.count = (UA_Byte) (currentDSMPosition - ((i - 1) * writerGroup->config.maxEncapsulatedDataSetMessageCount)); //attention cast from uint32 to byte
+                nm.payload.dataSetPayload.dataSetMessages = &dsmStore[currentDSMPosition];
+                nm.payload.dataSetPayload.sizes = &dsmSizes[currentDSMPosition];
+                nm.payloadHeader.dataSetPayloadHeader.dataSetWriterIds = &dsWriterIds[currentDSMPosition];
             }
         } else {///create single NetworkMessages (1 DSM per NM)
-            nmStore[i].payloadHeader.dataSetPayloadHeader.count = 1;
+            nm.payloadHeader.dataSetPayloadHeader.count = 1;
             currentDSMPosition = (UA_UInt32) combinedNetworkMessageCount + (i - combinedNetworkMessageCount/writerGroup->config.maxEncapsulatedDataSetMessageCount
                                                                             + (combinedNetworkMessageCount % writerGroup->config.maxEncapsulatedDataSetMessageCount) == 0 ? 0 : 1);
-            nmStore[i].payload.dataSetPayload.dataSetMessages = &dsmStore[currentDSMPosition];
-            nmStore[i]payload.dataSetPayload.sizes = &dsmSizes[currentDSMPosition];
-            nmStore[i]payloadHeader.dataSetPayloadHeader.dataSetWriterIds = &dsWriterIds[currentDSMPosition];
+            nm.payload.dataSetPayload.dataSetMessages = &dsmStore[currentDSMPosition];
+            nm.payload.dataSetPayload.sizes = &dsmSizes[currentDSMPosition];
+            nm.payloadHeader.dataSetPayloadHeader.dataSetWriterIds = &dsWriterIds[currentDSMPosition];
         }
         //send the prepared messages
         UA_ByteString buf;
-        size_t msgSize = UA_NetworkMessage_calcSizeBinary(&nmStore[i]);
+        size_t msgSize = UA_NetworkMessage_calcSizeBinary(&nm);
         if(UA_ByteString_allocBuffer(&buf, msgSize) == UA_STATUSCODE_GOOD) {
             UA_Byte *bufPos = buf.data;
             memset(bufPos, 0, msgSize);
             const UA_Byte *bufEnd = &buf.data[buf.length];
-            if(UA_NetworkMessage_encodeBinary(&nmStore[i], &bufPos, bufEnd) != UA_STATUSCODE_GOOD){
+            if(UA_NetworkMessage_encodeBinary(&nm, &bufPos, bufEnd) != UA_STATUSCODE_GOOD){
                 UA_ByteString_deleteMembers(&buf);
                 return;
             };
@@ -1153,11 +1154,11 @@ UA_WriterGroup_publishCallback(UA_Server *server, UA_WriterGroup *writerGroup) {
         }
         //The stack allocated sizes and dataSetWriterIds field must be set to NULL to prevent invalid free.
         UA_ByteString_deleteMembers(&buf);
-        nmStore[i].payload.dataSetPayload.sizes = NULL;
-        nmStore[i].payloadHeader.dataSetPayloadHeader.dataSetWriterIds = NULL;
-        nmStore[i].payload.dataSetPayload.dataSetMessages = NULL;
-        nmStore[i].payloadHeader.dataSetPayloadHeader.count = 0;
-        UA_NetworkMessage_deleteMembers(&nmStore[i]);
+        nm.payload.dataSetPayload.sizes = NULL;
+        nm.payloadHeader.dataSetPayloadHeader.dataSetWriterIds = NULL;
+        nm.payload.dataSetPayload.dataSetMessages = NULL;
+        nm.payloadHeader.dataSetPayloadHeader.count = 0;
+        UA_NetworkMessage_deleteMembers(&nm);
     }
 }