Example #1
0
            bool OnSendDelivery(Delivery delivery)
            {
                // TODO: need lock here?
                if (!delivery.DeliveryId.HasValue && !this.TryAddDelivery(delivery))
                {
                    Utils.Trace(TraceLevel.Verbose, "{0}: Buffer full", this);
                    return(false);
                }

                bool more = true;

                while (more)
                {
                    lock (this.SyncRoot)
                    {
                        if (this.remoteIncomingWindow == 0)
                        {
                            Utils.Trace(TraceLevel.Verbose, "{0}: Window closed", this);
                            return(false);
                        }

                        this.nextOutgoingId.Increment();
                        if (this.remoteIncomingWindow != uint.MaxValue)
                        {
                            --this.remoteIncomingWindow;
                            --this.outgoingWindow;
                        }
                    }

                    Transfer transfer = delivery.GetTransfer(this.maxFrameSize, delivery.Link.LocalHandle.Value, out more);
                    transfer.DeliveryId = delivery.DeliveryId;

                    if (delivery.Settled && !more)
                    {
                        // We want to settle the delivery after network write completes
                        this.Session.SendCommand(transfer, this.onSettledDeliveryComplete, delivery);
                    }
                    else
                    {
                        this.Session.SendCommand(transfer);
                    }
                }

                return(true);
            }
Example #2
0
            bool OnSendDelivery(Delivery delivery)
            {
                // TODO: need lock here?
                if (!delivery.DeliveryId.HasValue && !this.TryAddDelivery(delivery))
                {
                    Utils.Trace(TraceLevel.Verbose, "{0}: Buffer full", this);
                    return false;
                }

                bool more = true;
                while (more)
                {
                    lock (this.SyncRoot)
                    {
                        if (this.remoteIncomingWindow == 0)
                        {
                            Utils.Trace(TraceLevel.Verbose, "{0}: Window closed", this);
                            return false;
                        }

                        this.nextOutgoingId.Increment();
                        if (this.remoteIncomingWindow != uint.MaxValue)
                        {
                            --this.remoteIncomingWindow;
                            --this.outgoingWindow;
                        }
                    }

                    Transfer transfer = delivery.GetTransfer(this.maxFrameSize, delivery.Link.LocalHandle.Value, out more);
                    transfer.DeliveryId = delivery.DeliveryId;

                    if (delivery.Settled && !more)
                    {
                        // We want to settle the delivery after network write completes
                        this.Session.SendCommand(transfer, this.onSettledDeliveryComplete, delivery);
                    }
                    else
                    {
                        this.Session.SendCommand(transfer);
                    }
                }

                return true;
            }