public WrappedByteBuffer(ByteBuffer buffer, int offset, int length) : base(buffer.Buffer, offset, length, length, false) { buffer.AddReference(); this.buffer = buffer; }
bool IAsyncTransport.SendAsync(ByteBuffer buffer, IList<ArraySegment<byte>> bufferList, int listSize) { ByteBuffer writeBuffer; if (buffer != null) { buffer.AddReference(); writeBuffer = buffer; } else { writeBuffer = this.transport.bufferManager.GetByteBuffer(listSize); for (int i = 0; i < bufferList.Count; i++) { ArraySegment<byte> segment = bufferList[i]; Buffer.BlockCopy(segment.Array, segment.Offset, writeBuffer.Buffer, writeBuffer.WritePos, segment.Count); writeBuffer.Append(segment.Count); } } Task task = this.sslStream.WriteAsync(writeBuffer.Buffer, writeBuffer.Offset, writeBuffer.Length); bool pending = !task.IsCompleted; if (pending) { task.ContinueWith( (t, s) => { var tuple = (Tuple<SslSocket, ByteBuffer>)s; tuple.Item2.ReleaseReference(); var thisPtr = tuple.Item1; if (t.IsFaulted) { thisPtr.transport.OnWriteFailure(t.Exception.InnerException); } else { thisPtr.transport.OnWriteSuccess(); } }, Tuple.Create(this, writeBuffer)); } else { writeBuffer.ReleaseReference(); } return pending; }
internal override void OnTransfer(Delivery delivery, Transfer transfer, ByteBuffer buffer) { if (delivery == null) { delivery = this.deliveryCurrent; AmqpBitConverter.WriteBytes(delivery.Buffer, buffer.Buffer, buffer.Offset, buffer.Length); } else { buffer.AddReference(); delivery.Buffer = buffer; lock (this.ThisLock) { this.OnDelivery(transfer.DeliveryId); } } if (!transfer.More) { this.deliveryCurrent = null; delivery.Message = Message.Decode(delivery.Buffer); Waiter waiter; MessageCallback callback = this.onMessage; lock (this.ThisLock) { waiter = (Waiter)this.waiterList.First; if (waiter != null) { this.waiterList.Remove(waiter); } else if (callback == null) { this.receivedMessages.Add(new MessageNode() { Message = delivery.Message }); return; } } while (waiter != null) { if (waiter.Signal(delivery.Message)) { this.OnDeliverMessage(); return; } lock (this.ThisLock) { waiter = (Waiter)this.waiterList.First; if (waiter != null) { this.waiterList.Remove(waiter); } else if (callback == null) { this.receivedMessages.Add(new MessageNode() { Message = delivery.Message }); return; } } } Fx.Assert(waiter == null, "waiter must be null now"); Fx.Assert(callback != null, "callback must not be null now"); callback(this, delivery.Message); this.OnDeliverMessage(); } else { this.deliveryCurrent = delivery; } }