public bool TryEnqueue(EventReliable value)
        {
            int index = -1;

            if (count == 0)
            {
                index = tail;
            }
            else
            {
                if (count == nodes.Length)
                {
                    return(false);
                }

                index = (tail + count) & mask;
            }

            nodes[index].Value          = value;
            nodes[index].Value.Sequence = generator.Next();
            nodes[index].State          = State.Send;

            count += 1;
            return(true);
        }
        void ChangeState(EventReliable value, State state)
        {
            if (count == 0)
            {
                return;
            }

            int distance = SequenceDistance(value.Sequence, nodes[tail].Value.Sequence);

            if (distance < 0 || distance >= count)
            {
                return;
            }

            nodes[(tail + distance) & mask].State = state;
        }
        public bool TryNext(out EventReliable value)
        {
            for (int i = 0; i < count; ++i)
            {
                int index = (tail + i) & mask;

                if (nodes[index].State == State.Send)
                {
                    nodes[index].State = State.Transit;
                    value = nodes[index].Value;
                    return(true);
                }
            }

            value = default(EventReliable);
            return(false);
        }
        public bool TryRemove(out EventReliable value)
        {
            if (count > 0 && nodes[tail].State == State.Delivered)
            {
                value       = nodes[tail].Value;
                nodes[tail] = default(Node);

                tail += 1;
                tail &= mask;

                count -= 1;
                return(true);
            }

            value = default(EventReliable);
            return(false);
        }
        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;
        }
 public void SetSend(EventReliable value)
 {
     ChangeState(value, State.Send);
 }
 public void SetDelivered(EventReliable value)
 {
     ChangeState(value, State.Delivered);
 }