Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix server time and move all readerwriter locks outside of try/finally #2903

Merged
merged 1 commit into from
Dec 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 41 additions & 53 deletions Libraries/Opc.Ua.Client/NodeCache/NodeCache.cs
Original file line number Diff line number Diff line change
Expand Up @@ -104,10 +104,10 @@ public INode Find(ExpandedNodeId nodeId)
}

INode node;

m_cacheLock.EnterReadLock();
try
{
m_cacheLock.EnterReadLock();

// check if node already exists.
node = m_nodes.Find(nodeId);
}
Expand Down Expand Up @@ -155,10 +155,10 @@ public IList<INode> Find(IList<ExpandedNodeId> nodeIds)
for (ii = 0; ii < count; ii++)
{
INode node;

m_cacheLock.EnterReadLock();
try
{
m_cacheLock.EnterReadLock();

// check if node already exists.
node = m_nodes.Find(nodeIds[ii]);
}
Expand Down Expand Up @@ -235,10 +235,10 @@ public INode Find(
}

IList<IReference> references;

m_cacheLock.EnterReadLock();
try
{
m_cacheLock.EnterReadLock();

// find all references.
references = source.ReferenceTable.Find(referenceTypeId, isInverse, includeSubtypes, m_typeTree);
}
Expand Down Expand Up @@ -285,10 +285,9 @@ public IList<INode> Find(
}

IList<IReference> references;
m_cacheLock.EnterReadLock();
try
{
m_cacheLock.EnterReadLock();

// find all references.
references = source.ReferenceTable.Find(referenceTypeId, isInverse, includeSubtypes, m_typeTree);
}
Expand Down Expand Up @@ -325,10 +324,9 @@ public bool IsKnown(ExpandedNodeId typeId)
return false;
}

m_cacheLock.EnterReadLock();
try
{
m_cacheLock.EnterReadLock();

return m_typeTree.IsKnown(typeId);
}
finally
Expand All @@ -347,10 +345,9 @@ public bool IsKnown(NodeId typeId)
return false;
}

m_cacheLock.EnterReadLock();
try
{
m_cacheLock.EnterReadLock();

return m_typeTree.IsKnown(typeId);
}
finally
Expand All @@ -369,10 +366,9 @@ public NodeId FindSuperType(ExpandedNodeId typeId)
return null;
}

m_cacheLock.EnterReadLock();
try
{
m_cacheLock.EnterReadLock();

return m_typeTree.FindSuperType(typeId);
}
finally
Expand All @@ -392,10 +388,9 @@ public NodeId FindSuperType(NodeId typeId)
return null;
}

m_cacheLock.EnterReadLock();
try
{
m_cacheLock.EnterReadLock();

return m_typeTree.FindSuperType(typeId);
}
finally
Expand All @@ -409,18 +404,18 @@ public NodeId FindSuperType(NodeId typeId)
public IList<NodeId> FindSubTypes(ExpandedNodeId typeId)
{
ILocalNode type = Find(typeId) as ILocalNode;
List<NodeId> subtypes = new List<NodeId>();

if (type == null)
{
return new List<NodeId>();
return subtypes;
}

List<NodeId> subtypes = new List<NodeId>();
IList<IReference> references;

m_cacheLock.EnterReadLock();
try
{
m_cacheLock.EnterReadLock();

references = type.References.Find(ReferenceTypeIds.HasSubtype, false, true, m_typeTree);
}
finally
Expand Down Expand Up @@ -459,10 +454,10 @@ public bool IsTypeOf(ExpandedNodeId subTypeId, ExpandedNodeId superTypeId)
while (supertype != null)
{
ExpandedNodeId currentId;

m_cacheLock.EnterReadLock();
try
{
m_cacheLock.EnterReadLock();

currentId = supertype.References.FindTarget(ReferenceTypeIds.HasSubtype, true, true, m_typeTree, 0);
}
finally
Expand Down Expand Up @@ -501,10 +496,10 @@ public bool IsTypeOf(NodeId subTypeId, NodeId superTypeId)
while (supertype != null)
{
ExpandedNodeId currentId;

m_cacheLock.EnterReadLock();
try
{
m_cacheLock.EnterReadLock();

currentId = supertype.References.FindTarget(ReferenceTypeIds.HasSubtype, true, true, m_typeTree, 0);
}
finally
Expand All @@ -526,10 +521,9 @@ public bool IsTypeOf(NodeId subTypeId, NodeId superTypeId)
/// <inheritdoc/>
public QualifiedName FindReferenceTypeName(NodeId referenceTypeId)
{
m_cacheLock.EnterReadLock();
try
{
m_cacheLock.EnterReadLock();

return m_typeTree.FindReferenceTypeName(referenceTypeId);
}
finally
Expand All @@ -541,10 +535,9 @@ public QualifiedName FindReferenceTypeName(NodeId referenceTypeId)
/// <inheritdoc/>
public NodeId FindReferenceType(QualifiedName browseName)
{
m_cacheLock.EnterReadLock();
try
{
m_cacheLock.EnterReadLock();

return m_typeTree.FindReferenceType(browseName);
}
finally
Expand All @@ -564,10 +557,10 @@ public bool IsEncodingOf(ExpandedNodeId encodingId, ExpandedNodeId datatypeId)
}

IList<IReference> references;

m_cacheLock.EnterReadLock();
try
{
m_cacheLock.EnterReadLock();

references = encoding.References.Find(ReferenceTypeIds.HasEncoding, true, true, m_typeTree);
}
finally
Expand Down Expand Up @@ -611,10 +604,10 @@ public bool IsEncodingFor(NodeId expectedTypeId, ExtensionObject value)
}

IList<IReference> references;

m_cacheLock.EnterReadLock();
try
{
m_cacheLock.EnterReadLock();

references = encoding.References.Find(ReferenceTypeIds.HasEncoding, true, true, m_typeTree);
}
finally
Expand Down Expand Up @@ -706,10 +699,10 @@ public NodeId FindDataTypeId(ExpandedNodeId encodingId)
}

IList<IReference> references;

m_cacheLock.EnterReadLock();
try
{
m_cacheLock.EnterReadLock();

references = encoding.References.Find(ReferenceTypeIds.HasEncoding, true, true, m_typeTree);
}
finally
Expand All @@ -736,10 +729,10 @@ public NodeId FindDataTypeId(NodeId encodingId)
}

IList<IReference> references;

m_cacheLock.EnterReadLock();
try
{
m_cacheLock.EnterReadLock();

references = encoding.References.Find(ReferenceTypeIds.HasEncoding, true, true, m_typeTree);
}
finally
Expand Down Expand Up @@ -769,10 +762,9 @@ public void LoadUaDefinedTypes(ISystemContext context)
var assembly = typeof(ArgumentCollection).GetTypeInfo().Assembly;
predefinedNodes.LoadFromBinaryResource(context, "Opc.Ua.Stack.Generated.Opc.Ua.PredefinedNodes.uanodes", assembly, true);

m_cacheLock.EnterWriteLock();
try
{
m_cacheLock.EnterWriteLock();

for (int ii = 0; ii < predefinedNodes.Count; ii++)
{
BaseTypeState type = predefinedNodes[ii] as BaseTypeState;
Expand All @@ -795,11 +787,10 @@ public void LoadUaDefinedTypes(ISystemContext context)
/// <inheritdoc/>
public void Clear()
{
m_uaTypesLoaded = false;
m_cacheLock.EnterWriteLock();
try
{
m_cacheLock.EnterWriteLock();

m_uaTypesLoaded = false;
m_nodes.Clear();
}
finally
Expand All @@ -826,10 +817,9 @@ public Node FetchNode(ExpandedNodeId nodeId)
// fetch references from server.
ReferenceDescriptionCollection references = m_session.FetchReferences(localId);

m_cacheLock.EnterUpgradeableReadLock();
try
{
m_cacheLock.EnterUpgradeableReadLock();

foreach (ReferenceDescription reference in references)
{
// create a placeholder for the node if it does not already exist.
Expand Down Expand Up @@ -896,10 +886,9 @@ public IList<Node> FetchNodes(IList<ExpandedNodeId> nodeIds)

foreach (ReferenceDescription reference in references)
{
m_cacheLock.EnterUpgradeableReadLock();
try
{
m_cacheLock.EnterUpgradeableReadLock();

// create a placeholder for the node if it does not already exist.
if (!m_nodes.Exists(reference.NodeId))
{
Expand Down Expand Up @@ -976,10 +965,10 @@ public IList<INode> FindReferences(
}

IList<IReference> references;

m_cacheLock.EnterReadLock();
try
{
m_cacheLock.EnterReadLock();

references = source.ReferenceTable.Find(referenceTypeId, isInverse, includeSubtypes, m_typeTree);
}
finally
Expand Down Expand Up @@ -1026,10 +1015,10 @@ public IList<INode> FindReferences(
foreach (var referenceTypeId in referenceTypeIds)
{
IList<IReference> references;

m_cacheLock.EnterReadLock();
try
{
m_cacheLock.EnterReadLock();

references = node.ReferenceTable.Find(referenceTypeId, isInverse, includeSubtypes, m_typeTree);
}
finally
Expand Down Expand Up @@ -1077,10 +1066,10 @@ public string GetDisplayText(INode node)
NodeId modellingRule = target.ModellingRule;

IList<IReference> references;

m_cacheLock.EnterReadLock();
try
{
m_cacheLock.EnterReadLock();

references = target.ReferenceTable.Find(ReferenceTypeIds.Aggregates, true, true, m_typeTree);
}
finally
Expand Down Expand Up @@ -1167,10 +1156,9 @@ public NodeId BuildBrowsePath(ILocalNode node, IList<QualifiedName> browsePath)
#region Private Methods
private void InternalWriteLockedAttach(ILocalNode node)
{
m_cacheLock.EnterWriteLock();
try
{
m_cacheLock.EnterWriteLock();

// add to cache.
m_nodes.Attach(node);
}
Expand Down
Loading
Loading