Browse Source

Fix cleanup for MonitoredItems

Julius Pfrommer 6 years ago
parent
commit
e1d381afd1

+ 1 - 1
src/server/ua_services_subscription.c

@@ -298,7 +298,7 @@ Operation_CreateMonitoredItem(UA_Server *server, UA_Session *session, struct cre
     newMon->monitoredItemId = ++cmc->sub->lastMonitoredItemId;
     newMon->timestampsToReturn = cmc->timestampsToReturn;
     retval = setMonitoredItemSettings(server, newMon, request->monitoringMode,
-                             &request->requestedParameters, v.value.type);
+                                      &request->requestedParameters, v.value.type);
     UA_DataValue_deleteMembers(&v);
     if(retval != UA_STATUSCODE_GOOD) {
         result->statusCode = retval;

+ 6 - 1
src/server/ua_subscription.c

@@ -46,6 +46,7 @@ UA_Subscription_deleteMembers(UA_Server *server, UA_Subscription *sub) {
     /* Delete monitored Items */
     UA_MonitoredItem *mon, *tmp_mon;
     LIST_FOREACH_SAFE(mon, &sub->monitoredItems, listEntry, tmp_mon) {
+        LIST_REMOVE(mon, listEntry);
         MonitoredItem_delete(server, mon);
     }
     sub->monitoredItemsSize = 0;
@@ -83,8 +84,12 @@ UA_Subscription_deleteMonitoredItem(UA_Server *server, UA_Subscription *sub,
         return UA_STATUSCODE_BADMONITOREDITEMIDINVALID;
 
     /* Remove the MonitoredItem */
-    MonitoredItem_delete(server, mon);
+    LIST_REMOVE(mon, listEntry);
     sub->monitoredItemsSize--;
+
+    /* Remove content and delayed free */
+    MonitoredItem_delete(server, mon);
+
     return UA_STATUSCODE_GOOD;
 }
 

+ 0 - 1
src/server/ua_subscription_datachange.c

@@ -61,7 +61,6 @@ MonitoredItem_delete(UA_Server *server, UA_MonitoredItem *monitoredItem) {
     }
 
     /* Remove the monitored item */
-    LIST_REMOVE(monitoredItem, listEntry);
     UA_String_deleteMembers(&monitoredItem->indexRange);
     UA_ByteString_deleteMembers(&monitoredItem->lastSampledValue);
     UA_Variant_deleteMembers(&monitoredItem->lastValue);