public void Queue(Event ev)
        {
            if (ev.Reliability == ReliabilityModes.Unreliable)
            {
                // push on unreliable send queue
                unreliableSend.Add(EventUnreliable.Wrap(ev));

                // incr refs!
                ev.IncrementRefs();
            }
            else
            {
                if (reliableOrderedSend.TryEnqueue(EventReliable.Wrap(ev)))
                {
                    ev.IncrementRefs();
                }
                else
                {
                    NetLog.Warn("The reliable-ordered event queue for {0} is full, disconnecting", connection);
                    connection.Disconnect();
                }
            }
        }
        public override void Read(Packet packet)
        {
            int startPtr = packet.Position;

            while (packet.ReadStopMarker())
            {
                uint  sequence = 0;
                Event ev       = ReadEvent(packet, ref sequence);

                NetLog.Debug("recv event {0}", ev);
                if (ev.Reliability == ReliabilityModes.Unreliable)
                {
                    EventDispatcher.Received(ev);
                }
                else
                {
                    switch (reliableOrderedRecv.TryEnqueue(EventReliable.Wrap(ev, sequence)))
                    {
                    case RecvBufferAddResult.Old:
                    case RecvBufferAddResult.OutOfBounds:
                    case RecvBufferAddResult.AlreadyExists:
                        NetLog.Debug("FAILED");
                        //ev.DecrementRefs();
                        break;
                    }
                }
            }

            EventReliable reliable;

            while (reliableOrderedRecv.TryRemove(out reliable))
            {
                EventDispatcher.Received(reliable.NetworkEvent);
            }

            packet.Stats.EventBits = packet.Position - startPtr;
        }