From 37643008aaa98bc0357b1d5072262581e4cabb36 Mon Sep 17 00:00:00 2001 From: Ahmed Zamil Date: Tue, 16 Jul 2024 09:44:18 +0300 Subject: [PATCH] dead lock avoidance --- lib/src/Net/IIP/DistributedConnection.dart | 37 ++++++++++--------- .../DistributedResourceAttachRequestInfo.dart | 9 +++++ 2 files changed, 28 insertions(+), 18 deletions(-) create mode 100644 lib/src/Net/IIP/DistributedResourceAttachRequestInfo.dart diff --git a/lib/src/Net/IIP/DistributedConnection.dart b/lib/src/Net/IIP/DistributedConnection.dart index d0aae9e..6dcdb4c 100644 --- a/lib/src/Net/IIP/DistributedConnection.dart +++ b/lib/src/Net/IIP/DistributedConnection.dart @@ -25,6 +25,7 @@ SOFTWARE. import 'dart:async'; import 'package:collection/collection.dart'; +import 'package:esiur/src/Net/IIP/DistributedResourceAttachRequestInfo.dart'; import 'package:esiur/src/Security/Membership/AuthorizationRequest.dart'; import 'package:web_socket_channel/status.dart'; import '../../Misc/Global.dart'; @@ -152,8 +153,8 @@ class DistributedConnection extends NetworkConnection with IStore { KeyList> _suspendedResources = new KeyList>(); - KeyList> _resourceRequests = - new KeyList>(); + KeyList _resourceRequests = + new KeyList(); KeyList> _templateRequests = new KeyList>(); @@ -374,7 +375,7 @@ class DistributedConnection extends NetworkConnection with IStore { _resourceRequests.values.forEach((x) { try { - x.triggerError( + x.reply.triggerError( AsyncException(ErrorType.Management, 0, "Connection closed")); } catch (ex) {} }); @@ -407,7 +408,6 @@ class DistributedConnection extends NetworkConnection with IStore { // @TODO: implement this // if (ready) // _server.membership?.Logout(session); - } else if (autoReconnect && !_invalidCredentials) { Future.delayed(Duration(seconds: reconnectInterval), reconnect); } else { @@ -1729,12 +1729,12 @@ class DistributedConnection extends NetworkConnection with IStore { try { var sendDetach = false; - if (_attachedResources.containsKey(instanceId)){ + if (_attachedResources.containsKey(instanceId)) { _attachedResources.remove(instanceId); sendDetach = true; } - if (_suspendedResources.containsKey(instanceId)){ + if (_suspendedResources.containsKey(instanceId)) { _suspendedResources.remove(instanceId); sendDetach = true; } @@ -1745,7 +1745,6 @@ class DistributedConnection extends NetworkConnection with IStore { .done(); return null; - } catch (ex) { return null; } @@ -1825,9 +1824,7 @@ class DistributedConnection extends NetworkConnection with IStore { } } - void iipEventResourceReassigned(int resourceId, int newResourceId) { - - } + void iipEventResourceReassigned(int resourceId, int newResourceId) {} void iipEventResourceDestroyed(int resourceId) { var r = _attachedResources[resourceId]?.target; @@ -1842,7 +1839,6 @@ class DistributedConnection extends NetworkConnection with IStore { // @TODO: handle this mess _neededResources.remove(resourceId); } - } // @TODO: Check for deadlocks @@ -3161,28 +3157,33 @@ class DistributedConnection extends NetworkConnection with IStore { resource = _neededResources[id]; - var request = _resourceRequests[id]; + var requestInfo = _resourceRequests[id]; //print("fetch $id"); - if (request != null) { - if (resource != null && (requestSequence?.contains(id) ?? false)) + if (requestInfo != null) { + if (resource != null && (requestSequence?.contains(id) ?? false)) { return AsyncReply.ready(resource); - return request; + } else if (resource != null && requestInfo.requestSequence.contains(id)) { + return AsyncReply.ready(resource); + } else { + return requestInfo.reply; + } } else if (resource != null && !resource.distributedResourceSuspended) { // @REVIEW: this should never happen print("DCON: Resource not moved to attached."); return new AsyncReply.ready(resource); } - var reply = new AsyncReply(); - _resourceRequests.add(id, reply); - //print("AttachResource sent ${id}"); var newSequence = requestSequence != null ? List.from(requestSequence) : []; + var reply = new AsyncReply(); + _resourceRequests.add( + id, DistributedResourceAttachRequestInfo(reply, newSequence)); + newSequence.add(id); (_sendRequest(IIPPacketAction.AttachResource)..addUint32(id)).done() diff --git a/lib/src/Net/IIP/DistributedResourceAttachRequestInfo.dart b/lib/src/Net/IIP/DistributedResourceAttachRequestInfo.dart new file mode 100644 index 0000000..07a9d4f --- /dev/null +++ b/lib/src/Net/IIP/DistributedResourceAttachRequestInfo.dart @@ -0,0 +1,9 @@ +import '../../Core/AsyncReply.dart'; +import 'DistributedResource.dart'; + +class DistributedResourceAttachRequestInfo { + List requestSequence; + AsyncReply reply; + + DistributedResourceAttachRequestInfo(this.reply, this.requestSequence) {} +}