in src/Listener/SourceLinkEndpoint.cs [77:118]
async Task ReceiveAsync()
{
while (!this.link.IsDetaching)
{
ReceiveContext receiveContext = await this.messageSource.GetMessageAsync(this.link).ConfigureAwait(false);
if (receiveContext != null)
{
try
{
uint remaining = this.link.SendMessageInternal(receiveContext.Message, null, receiveContext);
if (remaining == 0)
{
lock (this.syncRoot)
{
// credits could be received right after the check
if (this.link.Credit == 0)
{
this.receiving = false;
break;
}
}
}
}
catch
{
this.messageSource.DisposeMessage(receiveContext,
new DispositionContext(this.link, receiveContext.Message, new Released(), true));
break;
}
}
else if (this.link.IsDraining)
{
lock (this.syncRoot)
{
this.receiving = false;
}
this.link.CompleteDrain();
break;
}
}
}