From 0b8e32edf9f6916aa3be1548735bb889911503c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20K=C3=B6llner?= Date: Thu, 23 Apr 2020 22:34:45 +0200 Subject: [PATCH] factored StrictlyOrderedAwaitTask into resolving proxy tasks --- Capnp.Net.Runtime.Tests/EdgeCaseHandling.cs | 2 +- Capnp.Net.Runtime.Tests/TcpRpc.cs | 26 ++++++++-------- .../TcpRpcAdvancedStuff.cs | 2 +- Capnp.Net.Runtime.Tests/TcpRpcInterop.cs | 10 +++--- Capnp.Net.Runtime.Tests/TcpRpcPorted.cs | 4 +-- Capnp.Net.Runtime.Tests/TcpRpcStress.cs | 2 +- Capnp.Net.Runtime.Tests/Testsuite.cs | 31 +++++++------------ Capnp.Net.Runtime/Rpc/IResolvingCapability.cs | 5 +-- Capnp.Net.Runtime/Rpc/LazyCapability.cs | 10 +++--- .../Rpc/LocalAnswerCapability.cs | 8 ++--- Capnp.Net.Runtime/Rpc/PromisedCapability.cs | 8 ++--- Capnp.Net.Runtime/Rpc/Proxy.cs | 7 +++-- .../Rpc/RemoteAnswerCapability.cs | 8 ++--- .../Rpc/RemoteResolvingCapability.cs | 2 +- 14 files changed, 59 insertions(+), 66 deletions(-) diff --git a/Capnp.Net.Runtime.Tests/EdgeCaseHandling.cs b/Capnp.Net.Runtime.Tests/EdgeCaseHandling.cs index a48e1a4..225b5b8 100644 --- a/Capnp.Net.Runtime.Tests/EdgeCaseHandling.cs +++ b/Capnp.Net.Runtime.Tests/EdgeCaseHandling.cs @@ -1284,7 +1284,7 @@ namespace Capnp.Net.Runtime.Tests Assert.AreEqual(Message.WHICH.Finish, _.which); }); Assert.IsTrue(proxy.WhenResolved.IsCompleted); - Assert.IsTrue(proxy.WhenResolved.IsFaulted); + Assert.IsTrue(proxy.WhenResolved.WrappedTask.IsFaulted); tester.ExpectAbort(); } diff --git a/Capnp.Net.Runtime.Tests/TcpRpc.cs b/Capnp.Net.Runtime.Tests/TcpRpc.cs index f419f33..fe89a30 100644 --- a/Capnp.Net.Runtime.Tests/TcpRpc.cs +++ b/Capnp.Net.Runtime.Tests/TcpRpc.cs @@ -79,7 +79,7 @@ namespace Capnp.Net.Runtime.Tests server.Main = new ProvidedCapabilityMock(); var main = client.GetMain(); var resolving = main as IResolvingCapability; - Assert.IsTrue(resolving.WhenResolved.Wait(MediumNonDbgTimeout)); + Assert.IsTrue(resolving.WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout)); } } @@ -97,7 +97,7 @@ namespace Capnp.Net.Runtime.Tests var main = client.GetMain(); var resolving = main as IResolvingCapability; - Assert.IsTrue(Assert.ThrowsExceptionAsync(() => resolving.WhenResolved).Wait(MediumNonDbgTimeout)); + Assert.IsTrue(Assert.ThrowsExceptionAsync(() => resolving.WhenResolved.WrappedTask).Wait(MediumNonDbgTimeout)); } } @@ -116,7 +116,7 @@ namespace Capnp.Net.Runtime.Tests var mock = new ProvidedCapabilityMock(); server.Main = mock; var main = client.GetMain(); - Assert.IsTrue(main.WhenResolved.Wait(MediumNonDbgTimeout)); + Assert.IsTrue(main.WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout)); var args = DynamicSerializerState.CreateForRpc(); args.SetStruct(1, 0); args.WriteData(0, 123456); @@ -157,7 +157,7 @@ namespace Capnp.Net.Runtime.Tests var mock = new ProvidedCapabilityMock(); server.Main = mock; var main = client.GetMain(); - Assert.IsTrue(main.WhenResolved.Wait(MediumNonDbgTimeout)); + Assert.IsTrue(main.WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout)); var args = DynamicSerializerState.CreateForRpc(); args.SetStruct(1, 0); args.WriteData(0, 123456); @@ -197,7 +197,7 @@ namespace Capnp.Net.Runtime.Tests server.Main = mock; var main = client.GetMain(); var resolving = main as IResolvingCapability; - Assert.IsTrue(resolving.WhenResolved.Wait(MediumNonDbgTimeout)); + Assert.IsTrue(resolving.WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout)); var args = DynamicSerializerState.CreateForRpc(); args.SetStruct(1, 0); args.WriteData(0, 123456); @@ -240,7 +240,7 @@ namespace Capnp.Net.Runtime.Tests var mock = new ProvidedCapabilityMock(); server.Main = mock; var main = client.GetMain(); - Assert.IsTrue(main.WhenResolved.Wait(MediumNonDbgTimeout)); + Assert.IsTrue(main.WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout)); var args = DynamicSerializerState.CreateForRpc(); args.SetStruct(1, 0); args.WriteData(0, 123456); @@ -300,7 +300,7 @@ namespace Capnp.Net.Runtime.Tests var mock = new ProvidedCapabilityMock(); server.Main = mock; var main = client.GetMain(); - Assert.IsTrue(main.WhenResolved.Wait(MediumNonDbgTimeout)); + Assert.IsTrue(main.WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout)); var args = DynamicSerializerState.CreateForRpc(); args.SetStruct(1, 0); args.WriteData(0, 123456); @@ -337,7 +337,7 @@ namespace Capnp.Net.Runtime.Tests var mock = new ProvidedCapabilityMock(); server.Main = mock; var main = client.GetMain(); - Assert.IsTrue(main.WhenResolved.Wait(MediumNonDbgTimeout)); + Assert.IsTrue(main.WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout)); var args = DynamicSerializerState.CreateForRpc(); args.SetStruct(1, 0); args.WriteData(0, 123456); @@ -410,7 +410,7 @@ namespace Capnp.Net.Runtime.Tests var mock = new ProvidedCapabilityMock(); server.Main = mock; var main = client.GetMain(); - Assert.IsTrue(main.WhenResolved.Wait(MediumNonDbgTimeout)); + Assert.IsTrue(main.WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout)); var args = DynamicSerializerState.CreateForRpc(); args.SetStruct(1, 0); args.WriteData(0, 123456); @@ -486,7 +486,7 @@ namespace Capnp.Net.Runtime.Tests var mock = new ProvidedCapabilityMock(); server.Main = mock; var main = client.GetMain(); - Assert.IsTrue(main.WhenResolved.Wait(MediumNonDbgTimeout)); + Assert.IsTrue(main.WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout)); var args = DynamicSerializerState.CreateForRpc(); args.SetStruct(1, 0); args.WriteData(0, 123456); @@ -603,7 +603,7 @@ namespace Capnp.Net.Runtime.Tests var mock = new ProvidedCapabilityMock(); server.Main = mock; var main = client.GetMain(); - Assert.IsTrue(main.WhenResolved.Wait(MediumNonDbgTimeout)); + Assert.IsTrue(main.WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout)); var args = DynamicSerializerState.CreateForRpc(); args.SetStruct(1, 0); args.WriteData(0, 123456); @@ -650,7 +650,7 @@ namespace Capnp.Net.Runtime.Tests var mock = new ProvidedCapabilityMock(); server.Main = mock; var main = client.GetMain(); - Assert.IsTrue(main.WhenResolved.Wait(MediumNonDbgTimeout)); + Assert.IsTrue(main.WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout)); var args = DynamicSerializerState.CreateForRpc(); args.SetStruct(1, 0); args.WriteData(0, 123456); @@ -746,7 +746,7 @@ namespace Capnp.Net.Runtime.Tests Assert.AreEqual(c1, server.Connections[0]); Assert.AreEqual(ConnectionState.Active, c1.State); var proxy = client1.GetMain(); - Assert.IsTrue(proxy is IResolvingCapability r && r.WhenResolved.Wait(MediumNonDbgTimeout)); + Assert.IsTrue(proxy is IResolvingCapability r && r.WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout)); Assert.IsTrue(c1.RecvCount > 0); Assert.IsTrue(c1.SendCount > 0); diff --git a/Capnp.Net.Runtime.Tests/TcpRpcAdvancedStuff.cs b/Capnp.Net.Runtime.Tests/TcpRpcAdvancedStuff.cs index 1e81bf4..a94ca6e 100644 --- a/Capnp.Net.Runtime.Tests/TcpRpcAdvancedStuff.cs +++ b/Capnp.Net.Runtime.Tests/TcpRpcAdvancedStuff.cs @@ -116,7 +116,7 @@ namespace Capnp.Net.Runtime.Tests try { - Assert.IsTrue(((IResolvingCapability)main).WhenResolved.Wait(MediumNonDbgTimeout)); + Assert.IsTrue(((IResolvingCapability)main).WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout)); } catch (AggregateException) { diff --git a/Capnp.Net.Runtime.Tests/TcpRpcInterop.cs b/Capnp.Net.Runtime.Tests/TcpRpcInterop.cs index de99fa4..ca821b9 100644 --- a/Capnp.Net.Runtime.Tests/TcpRpcInterop.cs +++ b/Capnp.Net.Runtime.Tests/TcpRpcInterop.cs @@ -310,7 +310,7 @@ namespace Capnp.Net.Runtime.Tests using (var main = client.GetMain()) { - ((Proxy)main).WhenResolved.Wait(MediumNonDbgTimeout); + ((Proxy)main).WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout); async Task VerifyOutput() { @@ -896,7 +896,7 @@ namespace Capnp.Net.Runtime.Tests try { - success = resolving.WhenResolved.Wait(MediumNonDbgTimeout); + success = resolving.WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout); } catch { @@ -986,7 +986,7 @@ namespace Capnp.Net.Runtime.Tests using (var main = client.GetMain()) { var resolving = main as IResolvingCapability; - Assert.IsTrue(resolving.WhenResolved.Wait(MediumNonDbgTimeout)); + Assert.IsTrue(resolving.WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout)); var cap = new TaskCompletionSource(); @@ -1088,7 +1088,7 @@ namespace Capnp.Net.Runtime.Tests try { - success = resolving.WhenResolved.Wait(MediumNonDbgTimeout); + success = resolving.WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout); } catch { @@ -1158,7 +1158,7 @@ namespace Capnp.Net.Runtime.Tests using (var main = client.GetMain()) { var resolving = main as IResolvingCapability; - Assert.IsTrue(resolving.WhenResolved.Wait(MediumNonDbgTimeout)); + Assert.IsTrue(resolving.WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout)); var tcs = new TaskCompletionSource(); diff --git a/Capnp.Net.Runtime.Tests/TcpRpcPorted.cs b/Capnp.Net.Runtime.Tests/TcpRpcPorted.cs index 3e24333..5dd9132 100644 --- a/Capnp.Net.Runtime.Tests/TcpRpcPorted.cs +++ b/Capnp.Net.Runtime.Tests/TcpRpcPorted.cs @@ -49,7 +49,7 @@ namespace Capnp.Net.Runtime.Tests server.Main = new TestMoreStuffImpl(counters); using (var main = client.GetMain()) { - ((Proxy)main).WhenResolved.Wait(MediumNonDbgTimeout); + ((Proxy)main).WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout); // Since we have a threaded model, there is no way to deterministically provoke the situation // where Cancel and Finish message cross paths. Instead, we'll do a lot of such requests and @@ -158,7 +158,7 @@ namespace Capnp.Net.Runtime.Tests { using (var main = client.GetMain()) { - ((Proxy)main).WhenResolved.Wait(MediumNonDbgTimeout); + ((Proxy)main).WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout); } Assert.IsFalse(impl.IsDisposed); } diff --git a/Capnp.Net.Runtime.Tests/TcpRpcStress.cs b/Capnp.Net.Runtime.Tests/TcpRpcStress.cs index 7424277..2610677 100644 --- a/Capnp.Net.Runtime.Tests/TcpRpcStress.cs +++ b/Capnp.Net.Runtime.Tests/TcpRpcStress.cs @@ -43,7 +43,7 @@ namespace Capnp.Net.Runtime.Tests using (var main = client.GetMain()) { var resolving = main as IResolvingCapability; - Assert.IsTrue(resolving.WhenResolved.Wait(MediumNonDbgTimeout)); + Assert.IsTrue(resolving.WhenResolved.WrappedTask.Wait(MediumNonDbgTimeout)); } } }); diff --git a/Capnp.Net.Runtime.Tests/Testsuite.cs b/Capnp.Net.Runtime.Tests/Testsuite.cs index 29dbfd1..5240f1d 100644 --- a/Capnp.Net.Runtime.Tests/Testsuite.cs +++ b/Capnp.Net.Runtime.Tests/Testsuite.cs @@ -65,7 +65,7 @@ namespace Capnp.Net.Runtime.Tests using (var main = testbed.ConnectMain(impl)) { if (main is IResolvingCapability resolving) - testbed.MustComplete(resolving.WhenResolved); + testbed.MustComplete(resolving.WhenResolved.WrappedTask); var cap = new TestCallOrderImpl(); cap.CountToDispose = 6; @@ -92,20 +92,12 @@ namespace Capnp.Net.Runtime.Tests var call4 = pipeline.GetCallSequence(4, default); var call5 = pipeline.GetCallSequence(5, default); - try - { - testbed.MustComplete(call0); - testbed.MustComplete(call1); - testbed.MustComplete(call2); - testbed.MustComplete(call3); - testbed.MustComplete(call4); - testbed.MustComplete(call5); - } - catch (System.Exception) - { - cap.CountToDispose = null; - throw; - } + testbed.MustComplete(call0); + testbed.MustComplete(call1); + testbed.MustComplete(call2); + testbed.MustComplete(call3); + testbed.MustComplete(call4); + testbed.MustComplete(call5); Assert.AreEqual(0u, call0.Result); Assert.AreEqual(1u, call1.Result); @@ -113,6 +105,7 @@ namespace Capnp.Net.Runtime.Tests Assert.AreEqual(3u, call3.Result); Assert.AreEqual(4u, call4.Result); Assert.AreEqual(5u, call5.Result); + Assert.AreEqual(cap.Count, cap.CountToDispose, "counter must have reached number of calls"); } } } @@ -182,7 +175,7 @@ namespace Capnp.Net.Runtime.Tests using (var main = testbed.ConnectMain(impl)) { if (main is IResolvingCapability resolving) - testbed.MustComplete(resolving.WhenResolved); + testbed.MustComplete(resolving.WhenResolved.WrappedTask); var cap = new TaskCompletionSource(); @@ -223,7 +216,7 @@ namespace Capnp.Net.Runtime.Tests using (var main = testbed.ConnectMain(impl)) { if (main is IResolvingCapability resolving) - testbed.MustComplete(resolving.WhenResolved); + testbed.MustComplete(resolving.WhenResolved.WrappedTask); var promise = main.GetNull(default); @@ -250,7 +243,7 @@ namespace Capnp.Net.Runtime.Tests using (var main = testbed.ConnectMain(impl)) { if (main is IResolvingCapability resolving) - testbed.MustComplete(resolving.WhenResolved); + testbed.MustComplete(resolving.WhenResolved.WrappedTask); var tcs = new TaskCompletionSource(); @@ -770,7 +763,7 @@ namespace Capnp.Net.Runtime.Tests peer.EnableEcho(); - testbed.MustComplete(r.WhenResolved); + testbed.MustComplete(r.WhenResolved.WrappedTask); heldTask.Result.Dispose(); } diff --git a/Capnp.Net.Runtime/Rpc/IResolvingCapability.cs b/Capnp.Net.Runtime/Rpc/IResolvingCapability.cs index b3dc986..f041890 100644 --- a/Capnp.Net.Runtime/Rpc/IResolvingCapability.cs +++ b/Capnp.Net.Runtime/Rpc/IResolvingCapability.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using Capnp.Util; +using System.Threading.Tasks; namespace Capnp.Rpc { @@ -10,7 +11,7 @@ namespace Capnp.Rpc /// /// Completes when the capability gets resolved. /// - Task WhenResolved { get; } + StrictlyOrderedAwaitTask WhenResolved { get; } /// /// Returns the resolved capability diff --git a/Capnp.Net.Runtime/Rpc/LazyCapability.cs b/Capnp.Net.Runtime/Rpc/LazyCapability.cs index 5c1f7f7..d1e2f4a 100644 --- a/Capnp.Net.Runtime/Rpc/LazyCapability.cs +++ b/Capnp.Net.Runtime/Rpc/LazyCapability.cs @@ -18,7 +18,7 @@ namespace Capnp.Rpc return new LazyCapability(Task.FromCanceled(token)); } - readonly Task? _proxyTask; + readonly StrictlyOrderedAwaitTask? _proxyTask; readonly StrictlyOrderedAwaitTask _capTask; public LazyCapability(Task capabilityTask) @@ -28,7 +28,7 @@ namespace Capnp.Rpc public LazyCapability(Task proxyTask) { - _proxyTask = proxyTask; + _proxyTask = proxyTask.EnforceAwaitOrder(); async Task AwaitCap() => (await _proxyTask!).ConsumedCap; @@ -37,7 +37,7 @@ namespace Capnp.Rpc internal override Action? Export(IRpcEndpoint endpoint, CapDescriptor.WRITER writer) { - if (WhenResolved.ReplacementTaskIsCompletedSuccessfully()) + if (WhenResolved.IsCompleted && WhenResolved.WrappedTask.ReplacementTaskIsCompletedSuccessfully()) { using var proxy = GetResolvedCapability()!; return proxy.Export(endpoint, writer); @@ -62,9 +62,7 @@ namespace Capnp.Rpc } } - async Task AwaitWhenResolved() => await _capTask; - - public Task WhenResolved => AwaitWhenResolved(); + public StrictlyOrderedAwaitTask WhenResolved => _capTask; public T? GetResolvedCapability() where T: class { diff --git a/Capnp.Net.Runtime/Rpc/LocalAnswerCapability.cs b/Capnp.Net.Runtime/Rpc/LocalAnswerCapability.cs index 17d9c0c..f615ec5 100644 --- a/Capnp.Net.Runtime/Rpc/LocalAnswerCapability.cs +++ b/Capnp.Net.Runtime/Rpc/LocalAnswerCapability.cs @@ -17,11 +17,11 @@ namespace Capnp.Rpc return proxy; } - readonly Task _whenResolvedProxy; + readonly StrictlyOrderedAwaitTask _whenResolvedProxy; public LocalAnswerCapability(Task proxyTask) { - _whenResolvedProxy = proxyTask; + _whenResolvedProxy = proxyTask.EnforceAwaitOrder(); } public LocalAnswerCapability(StrictlyOrderedAwaitTask answer, MemberAccessPath access): @@ -30,9 +30,9 @@ namespace Capnp.Rpc } - public Task WhenResolved => _whenResolvedProxy; + public StrictlyOrderedAwaitTask WhenResolved => _whenResolvedProxy; - public T? GetResolvedCapability() where T : class => _whenResolvedProxy.GetResolvedCapability(); + public T? GetResolvedCapability() where T : class => _whenResolvedProxy.WrappedTask.GetResolvedCapability(); internal override Action? Export(IRpcEndpoint endpoint, CapDescriptor.WRITER writer) { diff --git a/Capnp.Net.Runtime/Rpc/PromisedCapability.cs b/Capnp.Net.Runtime/Rpc/PromisedCapability.cs index 74b5849..652dc71 100644 --- a/Capnp.Net.Runtime/Rpc/PromisedCapability.cs +++ b/Capnp.Net.Runtime/Rpc/PromisedCapability.cs @@ -10,7 +10,7 @@ namespace Capnp.Rpc readonly uint _remoteId; readonly object _reentrancyBlocker = new object(); readonly TaskCompletionSource _resolvedCap = new TaskCompletionSource(); - readonly Task _whenResolvedProxy; + readonly StrictlyOrderedAwaitTask _whenResolvedProxy; bool _released; public PromisedCapability(IRpcEndpoint ep, uint remoteId): base(ep) @@ -18,11 +18,11 @@ namespace Capnp.Rpc _remoteId = remoteId; async Task AwaitProxy() => new Proxy(await _resolvedCap.Task); - _whenResolvedProxy = AwaitProxy(); + _whenResolvedProxy = AwaitProxy().EnforceAwaitOrder(); } - public override Task WhenResolved => _resolvedCap.Task; - public override T? GetResolvedCapability() where T: class => _whenResolvedProxy.GetResolvedCapability(); + public override StrictlyOrderedAwaitTask WhenResolved => _whenResolvedProxy; + public override T? GetResolvedCapability() where T: class => _whenResolvedProxy.WrappedTask.GetResolvedCapability(); internal override Action? Export(IRpcEndpoint endpoint, CapDescriptor.WRITER writer) { diff --git a/Capnp.Net.Runtime/Rpc/Proxy.cs b/Capnp.Net.Runtime/Rpc/Proxy.cs index 57f70ce..715b341 100644 --- a/Capnp.Net.Runtime/Rpc/Proxy.cs +++ b/Capnp.Net.Runtime/Rpc/Proxy.cs @@ -1,4 +1,5 @@ -using Microsoft.Extensions.Logging; +using Capnp.Util; +using Microsoft.Extensions.Logging; using System; using System.Diagnostics; using System.Threading; @@ -31,12 +32,12 @@ namespace Capnp.Rpc /// /// Completes when the capability gets resolved. /// - public Task WhenResolved + public StrictlyOrderedAwaitTask WhenResolved { get { return ConsumedCap is IResolvingCapability resolving ? - resolving.WhenResolved : Task.CompletedTask; + resolving.WhenResolved : Task.CompletedTask.EnforceAwaitOrder(); } } diff --git a/Capnp.Net.Runtime/Rpc/RemoteAnswerCapability.cs b/Capnp.Net.Runtime/Rpc/RemoteAnswerCapability.cs index 9b0b248..d09bd49 100644 --- a/Capnp.Net.Runtime/Rpc/RemoteAnswerCapability.cs +++ b/Capnp.Net.Runtime/Rpc/RemoteAnswerCapability.cs @@ -17,13 +17,13 @@ namespace Capnp.Rpc readonly PendingQuestion _question; readonly MemberAccessPath _access; - readonly Task _whenResolvedProxy; + readonly StrictlyOrderedAwaitTask _whenResolvedProxy; public RemoteAnswerCapability(PendingQuestion question, MemberAccessPath access, Task proxyTask) : base(question.RpcEndpoint) { _question = question ?? throw new ArgumentNullException(nameof(question)); _access = access ?? throw new ArgumentNullException(nameof(access)); - _whenResolvedProxy = proxyTask ?? throw new ArgumentNullException(nameof(proxyTask)); + _whenResolvedProxy = (proxyTask ?? throw new ArgumentNullException(nameof(proxyTask))).EnforceAwaitOrder(); } static async Task TransferOwnershipToDummyProxy(PendingQuestion question, MemberAccessPath access) @@ -85,9 +85,9 @@ namespace Capnp.Rpc } } - public override Task WhenResolved => _whenResolvedProxy; + public override StrictlyOrderedAwaitTask WhenResolved => _whenResolvedProxy; - public override T? GetResolvedCapability() where T: class => _whenResolvedProxy.GetResolvedCapability(); + public override T? GetResolvedCapability() where T: class => _whenResolvedProxy.WrappedTask.GetResolvedCapability(); protected override void GetMessageTarget(MessageTarget.WRITER wr) { diff --git a/Capnp.Net.Runtime/Rpc/RemoteResolvingCapability.cs b/Capnp.Net.Runtime/Rpc/RemoteResolvingCapability.cs index 0dc9ac7..0c39e5c 100644 --- a/Capnp.Net.Runtime/Rpc/RemoteResolvingCapability.cs +++ b/Capnp.Net.Runtime/Rpc/RemoteResolvingCapability.cs @@ -17,7 +17,7 @@ namespace Capnp.Rpc ILogger Logger { get; } = Logging.CreateLogger(); #endif - public abstract Task WhenResolved { get; } + public abstract StrictlyOrderedAwaitTask WhenResolved { get; } public abstract T? GetResolvedCapability() where T : class; protected RemoteResolvingCapability(IRpcEndpoint ep) : base(ep)