Troubleshooting / robustness

This commit is contained in:
Christian Köllner 2019-08-26 20:03:56 +02:00
parent 52fa0ffb5e
commit 3e3b144a80
5 changed files with 20 additions and 14 deletions

View File

@ -13,7 +13,6 @@ namespace Capnp.Rpc
void RequestPostAction(Action postAction); void RequestPostAction(Action postAction);
void Finish(uint questionId); void Finish(uint questionId);
void ReleaseImport(uint importId); void ReleaseImport(uint importId);
void RemoveImport(uint importId);
void Resolve(uint preliminaryId, Skeleton preliminaryCap, Func<ConsumedCapability> resolvedCapGetter); void Resolve(uint preliminaryId, Skeleton preliminaryCap, Func<ConsumedCapability> resolvedCapGetter);
Task RequestSenderLoopback(Action<MessageTarget.WRITER> writer); Task RequestSenderLoopback(Action<MessageTarget.WRITER> writer);

View File

@ -17,7 +17,6 @@ namespace Capnp.Rpc
protected override void ReleaseRemotely() protected override void ReleaseRemotely()
{ {
_ep.ReleaseImport(_remoteId); _ep.ReleaseImport(_remoteId);
_ep.RemoveImport(_remoteId);
} }
protected override Call.WRITER SetupMessage(DynamicSerializerState args, ulong interfaceId, ushort methodId) protected override Call.WRITER SetupMessage(DynamicSerializerState args, ulong interfaceId, ushort methodId)

View File

@ -242,7 +242,7 @@ namespace Capnp.Rpc
_ep.ReleaseImport(_remoteId); _ep.ReleaseImport(_remoteId);
} }
_ep.RemoveImport(_remoteId); _ep.ReleaseImport(_remoteId);
this.DisposeWhenResolved(); this.DisposeWhenResolved();
} }

View File

@ -97,5 +97,16 @@ namespace Capnp.Rpc
} }
} }
} }
internal void Validate()
{
lock (_reentrancyBlocker)
{
if (_refCount <= 0)
{
throw new ObjectDisposedException(nameof(ConsumedCapability), "Validation failed, capability is already disposed");
}
}
}
} }
} }

View File

@ -1182,6 +1182,7 @@ namespace Capnp.Rpc
{ {
if (rcw.Cap.TryGetTarget(out var impCap)) if (rcw.Cap.TryGetTarget(out var impCap))
{ {
impCap.Validate();
rcw.AddRef(); rcw.AddRef();
return impCap; return impCap;
} }
@ -1209,6 +1210,7 @@ namespace Capnp.Rpc
{ {
if (rcwp.Cap.TryGetTarget(out var impCap)) if (rcwp.Cap.TryGetTarget(out var impCap))
{ {
impCap.Validate();
rcwp.AddRef(); rcwp.AddRef();
return impCap; return impCap;
} }
@ -1281,6 +1283,7 @@ namespace Capnp.Rpc
if (rcv.Cap.TryGetTarget(out var impCap)) if (rcv.Cap.TryGetTarget(out var impCap))
{ {
rcv.AddRef(); rcv.AddRef();
impCap.Validate();
return impCap; return impCap;
} }
else else
@ -1430,6 +1433,11 @@ namespace Capnp.Rpc
count = rc.RefCount; count = rc.RefCount;
rc.ReleaseAll(); rc.ReleaseAll();
} }
if (exists)
{
_importTable.Remove(importId);
}
} }
if (exists && count > 0) if (exists && count > 0)
@ -1451,17 +1459,6 @@ namespace Capnp.Rpc
} }
} }
void IRpcEndpoint.RemoveImport(uint importId)
{
lock (_reentrancyBlocker)
{
if (!_importTable.Remove(importId))
{
throw new ArgumentException("Given ID does not exist in import table");
}
}
}
Task IRpcEndpoint.RequestSenderLoopback(Action<MessageTarget.WRITER> describe) Task IRpcEndpoint.RequestSenderLoopback(Action<MessageTarget.WRITER> describe)
{ {
(var tcs, uint id) = AllocateDisembargo(); (var tcs, uint id) = AllocateDisembargo();