Browse Source

Namespace compiler wraps low-level calls to nodestore in RCU_LOCK/UNLOCK. Several missing locks added before calls to addExistingNode().

Chris Iatrou 9 years ago
parent
commit
643cc327c6
2 changed files with 6 additions and 0 deletions
  1. 4 0
      src/server/ua_services_nodemanagement.c
  2. 2 0
      tools/pyUANamespace/ua_node_types.py

+ 4 - 0
src/server/ua_services_nodemanagement.c

@@ -703,8 +703,10 @@ UA_Server_addMethodNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
     UA_Variant_setArrayCopy(&inputArgumentsVariableNode->value.variant.value, inputArguments,
                             inputArgumentsSize, &UA_TYPES[UA_TYPES_ARGUMENT]);
     UA_AddNodesResult inputAddRes;
+    UA_RCU_LOCK();
     UA_Server_addExistingNode(server, &adminSession, (UA_Node*)inputArgumentsVariableNode,
                               &parent.nodeId, &hasproperty, &inputAddRes);
+    UA_RCU_UNLOCK();
     // todo: check if adding succeeded
     UA_AddNodesResult_deleteMembers(&inputAddRes);
     
@@ -719,8 +721,10 @@ UA_Server_addMethodNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
     UA_Variant_setArrayCopy(&outputArgumentsVariableNode->value.variant.value, outputArguments,
                             outputArgumentsSize, &UA_TYPES[UA_TYPES_ARGUMENT]);
     UA_AddNodesResult outputAddRes;
+    UA_RCU_LOCK();
     UA_Server_addExistingNode(server, &adminSession, (UA_Node*)outputArgumentsVariableNode,
                               &parent.nodeId, &hasproperty, &outputAddRes);
+    UA_RCU_UNLOCK();
     // todo: check if adding succeeded
     UA_AddNodesResult_deleteMembers(&outputAddRes);
     

+ 2 - 0
tools/pyUANamespace/ua_node_types.py

@@ -685,7 +685,9 @@ class opcua_node_t:
       code = code + codegen.getCreateNodeBootstrap(self)
       code = code + self.printOpen62541CCode_Subtype(unPrintedReferences = unPrintedReferences, bootstrapping = True)
       code.append("// Parent node does not exist yet. This node will be bootstrapped and linked later.")
+      code.append("UA_RCU_LOCK();")
       code.append("UA_NodeStore_insert(server->nodestore, (UA_Node*) " + self.getCodePrintableID() + ");")
+      code.append("UA_RCU_UNLOCK();")
       
     # Try to print all references to nodes that already exist
     # Note: we know the reference types exist, because the namespace class made sure they were