in src/AmqpLink.cs [800:853]
void ProcessTransfer(Transfer transfer, Frame rawFrame, Delivery delivery, bool newDelivery)
{
if (newDelivery)
{
if (this.linkCredit < uint.MaxValue)
{
bool creditAvailable = true;
lock (this.syncRoot)
{
// Updating new total credit is delayed to avoid flooding
// the network with flows when there are many links that are
// frequently opened/closed
if (this.tempTotalCredit != null &&
this.ApplyTempTotalLinkCredit())
{
this.SendFlow(false, false, properties: null);
}
if (this.linkCredit == 0 && this.bufferedCredit == 0)
{
creditAvailable = false;
}
else
{
this.deliveryCount.Increment();
if (this.bufferedCredit > 0)
{
--this.bufferedCredit;
}
else if (this.linkCredit < uint.MaxValue)
{
--this.linkCredit;
}
}
}
if (!creditAvailable)
{
throw new AmqpException(AmqpErrorCode.TransferLimitExceeded,
AmqpResources.GetString(AmqpResources.AmqpTransferLimitExceeded, delivery.DeliveryId.Value));
}
}
if (!delivery.Settled && !delivery.Aborted)
{
lock (this.syncRoot)
{
this.UnsettledMap.Add(delivery.DeliveryTag, delivery);
}
}
}
this.OnProcessTransfer(delivery, transfer, rawFrame);
}