private void PhysicalLayerPump()
{
while (true)
{
lock (PhysicalLayerLock)
{
while (PhysicalLayer.Count == 0)
Monitor.Wait(PhysicalLayerLock);
}
long currentLatencyValue = _transportForm.Latency;
while (PhysicalLayer.Count > 0)
{
var packetHolder = (PhysicalPacketHolder)PhysicalLayer.Dequeue();
// drop the packet (maybe)
if (rand.Next(100) < _transportForm.PacketLoss)
{
Logger.Warn("Ooops dropped a packet : " + packetHolder._packet);
if (_client)
_transportForm.ClientPacketLoss++;
else
_transportForm.ServerPacketLoss++;
}
else
{
long latencySoFar = Environment.TickCount - packetHolder._sendTime;
// latency is done here
if (latencySoFar < currentLatencyValue)
{
//Logger.Info("Implementing remainder latency of " + (currentLatencyValue - latencySoFar) + "ms");
Thread.Sleep(TimeSpan.FromMilliseconds(currentLatencyValue - latencySoFar));
}
// Now pass this onto my Transport
Logger.Info("Received packet [size=" + packetHolder._packet.Payload.Length +
"] from physical layer, " + PhysicalLayer.Count + " still on the wire.");
TCPTransport.ProcessPacket(packetHolder._packet.GetBytes());
var actualLatency = Environment.TickCount - packetHolder._sendTime;
if (_client)
_transportForm.ClientLatency = actualLatency;
else
_transportForm.ServerLatency = actualLatency;
}
}
}
}