Skip to content

Commit

Permalink
Fixing #347?
Browse files Browse the repository at this point in the history
  • Loading branch information
darkl committed Mar 15, 2023
1 parent 5455b94 commit a491add
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ internal class WampCalleeInvocationHandler<TMessage> : IWampCalleeInvocationHand
private readonly IDictionary<IWampCaller, ICollection<WampRpcInvocation>> mCallerToInvocations =
new Dictionary<IWampCaller, ICollection<WampRpcInvocation>>();

private readonly IDictionary<IWampRawRpcOperationRouterCallback, WampRpcInvocation> mCallbackToInvocation =
new Dictionary<IWampRawRpcOperationRouterCallback, WampRpcInvocation>();
private readonly IDictionary<WampCallerRequestKey, WampRpcInvocation> mCallbackToInvocation =
new Dictionary<WampCallerRequestKey, WampRpcInvocation>();

private readonly object mLock = new object();
private readonly TMessage mEmptyDetails;
Expand Down Expand Up @@ -63,7 +63,7 @@ public long RegisterInvocation(RemoteWampCalleeDetails operation, IWampRawRpcOpe

if (properties.HelloDetails?.Roles?.Callee?.Features?.CallCanceling == true)
{
mCallbackToInvocation.Add(callback, invocation);
mCallbackToInvocation.Add(GetRequestKey(caller, callback.RequestId), invocation);
}

return invocationId;
Expand All @@ -83,12 +83,11 @@ private static IWampCaller GetCaller(IWampRawRpcOperationRouterCallback callback

public void Cancel(IWampCaller caller, long requestId, CancelOptions options)
{

WampRpcOperationCallback callback = new WampRpcOperationCallback(caller, requestId);
WampCallerRequestKey key = GetRequestKey(caller, requestId);

lock (mLock)
{
if (mCallbackToInvocation.TryGetValue(callback, out WampRpcInvocation invocation))
if (mCallbackToInvocation.TryGetValue(key, out WampRpcInvocation invocation))
{
IWampCallee callee = invocation.Operation.Callee;

Expand All @@ -97,6 +96,13 @@ public void Cancel(IWampCaller caller, long requestId, CancelOptions options)
}
}

private static WampCallerRequestKey GetRequestKey(IWampCaller caller, long requestId)
{
IWampClientProperties wampClientProperties = caller as IWampClientProperties;
WampCallerRequestKey callback = new WampCallerRequestKey(wampClientProperties.Session, requestId);
return callback;
}

private void RegisterDisconnectionNotifier(IWampRawRpcOperationRouterCallback callback)
{

Expand Down Expand Up @@ -247,7 +253,7 @@ private void UnregisterInvocation(WampRpcInvocation invocation)
}

mOperationToInvocations.Remove(invocation.Operation, invocation);
mCallbackToInvocation.Remove(invocation.Callback);
mCallbackToInvocation.Remove(GetRequestKey(caller, invocation.Callback.RequestId));
}
}

Expand Down Expand Up @@ -276,5 +282,38 @@ private WampRpcInvocation GetInvocation(long requestId, YieldOptions options)

return null;
}

private class WampCallerRequestKey
{
public WampCallerRequestKey(long session, long requestId)
{
Session = session;
RequestId = requestId;
}

public long Session { get; }
public long RequestId { get; }

protected bool Equals(WampCallerRequestKey other)
{
return Session == other.Session && RequestId == other.RequestId;
}

public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((WampCallerRequestKey)obj);
}

public override int GetHashCode()
{
unchecked
{
return (Session.GetHashCode() * 397) ^ RequestId.GetHashCode();
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ namespace WampSharp.V2.Rpc
/// </summary>
public interface IWampRawRpcOperationRouterCallback : IWampRawRpcOperationCallback<YieldOptions>
{
public long RequestId { get; }
}

/// <summary>
Expand Down

0 comments on commit a491add

Please sign in to comment.