diff --git a/Esiur/Esiur.csproj b/Esiur/Esiur.csproj
index 5c3f370..d110b1c 100644
--- a/Esiur/Esiur.csproj
+++ b/Esiur/Esiur.csproj
@@ -5,7 +5,7 @@
Ahmed Kh. Zamil
http://www.esiur.com
true
- 2.4.3
+ 2.4.4
https://github.com/esiur/esiur-dotnet
Ahmed Kh. Zamil
diff --git a/Esiur/Net/IIP/DistributedConnection.cs b/Esiur/Net/IIP/DistributedConnection.cs
index e240a94..f913fd1 100644
--- a/Esiur/Net/IIP/DistributedConnection.cs
+++ b/Esiur/Net/IIP/DistributedConnection.cs
@@ -1817,7 +1817,7 @@ public partial class DistributedConnection : NetworkConnection, IStore
{
try
{
- x.TriggerError(new AsyncException(ErrorType.Management, 0, "Connection closed"));
+ x.Reply.TriggerError(new AsyncException(ErrorType.Management, 0, "Connection closed"));
}
catch (Exception ex)
{
diff --git a/Esiur/Net/IIP/DistributedConnectionProtocol.cs b/Esiur/Net/IIP/DistributedConnectionProtocol.cs
index 68fc35b..41b0cc1 100644
--- a/Esiur/Net/IIP/DistributedConnectionProtocol.cs
+++ b/Esiur/Net/IIP/DistributedConnectionProtocol.cs
@@ -48,7 +48,7 @@ partial class DistributedConnection
KeyList> attachedResources = new KeyList>();
KeyList> suspendedResources = new KeyList>();
- KeyList> resourceRequests = new KeyList>();
+ KeyList resourceRequests = new KeyList();
KeyList> templateRequests = new KeyList>();
KeyList> templateByNameRequests = new KeyList>();
@@ -2249,14 +2249,24 @@ partial class DistributedConnection
resource = neededResources[id];
- var request = resourceRequests[id];
+ var requestInfo = resourceRequests[id];
- if (request != null)
+ if (requestInfo != null)
{
if (resource != null && (requestSequence?.Contains(id) ?? false))
+ {
+ // dead lock avoidance for loop reference.
return new AsyncReply(resource);
+ }
+ else if (resource != null && requestInfo.RequestSequence.Contains(id))
+ {
+ // dead lock avoidance for dependent reference.
+ return new AsyncReply(resource);
+ }
else
- return request;
+ {
+ return requestInfo.Reply;
+ }
}
else if (resource != null && !resource.DistributedResourceSuspended)
{
@@ -2266,11 +2276,10 @@ partial class DistributedConnection
}
+ var newSequence = requestSequence != null ? requestSequence.Concat(new uint[] { id }).ToArray() : new uint[] { id };
var reply = new AsyncReply();
- resourceRequests.Add(id, reply);
-
- var newSequence = requestSequence != null ? requestSequence.Concat(new uint[] { id }).ToArray() : new uint[] { id };
+ resourceRequests.Add(id, new DistributedResourceAttachRequestInfo(reply, newSequence));
SendRequest(IIPPacketAction.AttachResource)
.AddUInt32(id)
diff --git a/Esiur/Net/IIP/DistributedResourceAttachRequestInfo.cs b/Esiur/Net/IIP/DistributedResourceAttachRequestInfo.cs
new file mode 100644
index 0000000..164efb9
--- /dev/null
+++ b/Esiur/Net/IIP/DistributedResourceAttachRequestInfo.cs
@@ -0,0 +1,20 @@
+using Esiur.Core;
+using Esiur.Resource;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Esiur.Net.IIP
+{
+ internal class DistributedResourceAttachRequestInfo
+ {
+ public AsyncReply Reply { get; set; }
+ public uint[] RequestSequence { get; set; }
+
+ public DistributedResourceAttachRequestInfo(AsyncReply reply, uint[] requestSequence)
+ {
+ Reply = reply;
+ RequestSequence = requestSequence;
+ }
+ }
+}