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); }