Browse Source

Remove a pointer indirection in Events_nodeListElement

Julius Pfrommer 6 years ago
parent
commit
8ac1b85aa7
1 changed files with 19 additions and 15 deletions
  1. 19 15
      src/server/ua_subscription_events.c

+ 19 - 15
src/server/ua_subscription_events.c

@@ -12,7 +12,7 @@
 
 typedef struct Events_nodeListElement {
     LIST_ENTRY(Events_nodeListElement) listEntry;
-    UA_NodeId *node;
+    UA_NodeId nodeId;
 } Events_nodeListElement;
 
 typedef LIST_HEAD(Events_nodeList, Events_nodeListElement) Events_nodeList;
@@ -55,15 +55,15 @@ findAllSubtypesNodeIteratorCallback(UA_NodeId parentId, UA_Boolean isInverse,
         return UA_STATUSCODE_GOOD;
 
     Events_nodeListElement *entry = (Events_nodeListElement *) UA_malloc(sizeof(Events_nodeListElement));
-    if (!entry) {
+    if(!entry)
         return UA_STATUSCODE_BADOUTOFMEMORY;
-    }
-    entry->node = UA_NodeId_new();
-    if (!entry->node) {
+
+    UA_StatusCode retval = UA_NodeId_copy(&parentId, &entry->nodeId);
+    if(retval != UA_STATUSCODE_GOOD) {
         UA_free(entry);
-        return UA_STATUSCODE_BADOUTOFMEMORY;
+        return retval;
     }
-    UA_NodeId_copy(&parentId, entry->node);
+
     LIST_INSERT_HEAD(((struct getNodesHandle *) handle)->nodes, entry, listEntry);
 
     /* recursion */
@@ -96,7 +96,7 @@ UA_Event_findVariableNode(UA_Server *server, UA_QualifiedName *name, size_t rela
         if (!nodeFound) {
             UA_RelativePathElement rpe;
             UA_RelativePathElement_init(&rpe);
-            rpe.referenceTypeId = *iter->node;
+            rpe.referenceTypeId = iter->nodeId;
             rpe.isInverse = false;
             rpe.includeSubtypes = false;
             rpe.targetName = *name;
@@ -111,8 +111,9 @@ UA_Event_findVariableNode(UA_Server *server, UA_QualifiedName *name, size_t rela
             if(out->statusCode == UA_STATUSCODE_GOOD)
                 nodeFound = UA_TRUE;
         }
+
         LIST_REMOVE(iter, listEntry);
-        UA_NodeId_delete(iter->node);
+        UA_NodeId_deleteMembers(&iter->nodeId);
         UA_free(iter);
     }
 }
@@ -370,11 +371,13 @@ getParentsNodeIteratorCallback(UA_NodeId parentId, UA_Boolean isInverse,
     if (!entry) {
         return UA_STATUSCODE_BADOUTOFMEMORY;
     }
-    entry->node = UA_NodeId_new();
-    if (!entry->node) {
-        return UA_STATUSCODE_BADOUTOFMEMORY;
+
+    UA_StatusCode retval = UA_NodeId_copy(&parentId, &entry->nodeId);
+    if(retval != UA_STATUSCODE_GOOD) {
+        UA_free(entry);
+        return retval;
     }
-    UA_NodeId_copy(&parentId, entry->node);
+
     LIST_INSERT_HEAD(((struct getNodesHandle *) handle)->nodes, entry, listEntry);
 
     /* recursion */
@@ -443,7 +446,7 @@ UA_Server_triggerEvent(UA_Server *server, const UA_NodeId eventNodeId, const UA_
     /* add the event to each node's monitored items */
     Events_nodeListElement *parentIter, *tmp_parentIter;
     LIST_FOREACH_SAFE(parentIter, &parentList, listEntry, tmp_parentIter) {
-        const UA_ObjectNode *node = (const UA_ObjectNode *) UA_Nodestore_get(server, parentIter->node);
+        const UA_ObjectNode *node = (const UA_ObjectNode *) UA_Nodestore_get(server, &parentIter->nodeId);
         /* SLIST_FOREACH */
         for (UA_MonitoredItem *monIter = node->monitoredItemQueue; monIter != NULL; monIter = monIter->next) {
             retval = UA_Event_addEventToMonitoredItem(server, &eventNodeId, monIter);
@@ -453,8 +456,9 @@ UA_Server_triggerEvent(UA_Server *server, const UA_NodeId eventNodeId, const UA_
             }
         }
         UA_Nodestore_release(server, (const UA_Node *) node);
+
         LIST_REMOVE(parentIter, listEntry);
-        UA_NodeId_delete(parentIter->node);
+        UA_NodeId_delete(&parentIter->nodeId);
         UA_free(parentIter);
     }