Reverted my changes to jhurliman's packet stack since it currently causes more problems than it resolves. The stack DOES need a rework particularly with regards to priorities, but this is not it.
parent
6dbe25360e
commit
31bf25d05e
|
@ -402,7 +402,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
#region Queue or Send
|
#region Queue or Send
|
||||||
|
|
||||||
OutgoingPacket outgoingPacket = new OutgoingPacket(udpClient, buffer, category);
|
OutgoingPacket outgoingPacket = new OutgoingPacket(udpClient, buffer, category);
|
||||||
outgoingPacket.Type = type;
|
|
||||||
|
|
||||||
if (!outgoingPacket.Client.EnqueueOutgoing(outgoingPacket))
|
if (!outgoingPacket.Client.EnqueueOutgoing(outgoingPacket))
|
||||||
SendPacketFinal(outgoingPacket);
|
SendPacketFinal(outgoingPacket);
|
||||||
|
@ -514,7 +513,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
byte flags = buffer.Data[0];
|
byte flags = buffer.Data[0];
|
||||||
bool isResend = (flags & Helpers.MSG_RESENT) != 0;
|
bool isResend = (flags & Helpers.MSG_RESENT) != 0;
|
||||||
bool isReliable = (flags & Helpers.MSG_RELIABLE) != 0;
|
bool isReliable = (flags & Helpers.MSG_RELIABLE) != 0;
|
||||||
bool sendSynchronous = false;
|
|
||||||
LLUDPClient udpClient = outgoingPacket.Client;
|
LLUDPClient udpClient = outgoingPacket.Client;
|
||||||
|
|
||||||
if (!udpClient.IsConnected)
|
if (!udpClient.IsConnected)
|
||||||
|
@ -570,28 +568,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
if (isReliable)
|
if (isReliable)
|
||||||
Interlocked.Add(ref udpClient.UnackedBytes, outgoingPacket.Buffer.DataLength);
|
Interlocked.Add(ref udpClient.UnackedBytes, outgoingPacket.Buffer.DataLength);
|
||||||
|
|
||||||
//Some packet types need to be sent synchonously.
|
|
||||||
//Sorry, i know it's not optimal, but until the LL client
|
|
||||||
//manages packets correctly and re-orders them as required, this is necessary.
|
|
||||||
|
|
||||||
|
|
||||||
// Put the UDP payload on the wire
|
// Put the UDP payload on the wire
|
||||||
if (outgoingPacket.Type == PacketType.ImprovedTerseObjectUpdate)
|
AsyncBeginSend(buffer);
|
||||||
{
|
|
||||||
SyncBeginPrioritySend(buffer, 2); // highest priority
|
|
||||||
}
|
|
||||||
else if (outgoingPacket.Type == PacketType.ObjectUpdate
|
|
||||||
|| outgoingPacket.Type == PacketType.LayerData)
|
|
||||||
{
|
|
||||||
SyncBeginPrioritySend(buffer, 1); // medium priority
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SyncBeginPrioritySend(buffer, 0); // normal priority
|
|
||||||
}
|
|
||||||
|
|
||||||
//AsyncBeginSend(buffer);
|
|
||||||
|
|
||||||
// Keep track of when this packet was sent out (right now)
|
// Keep track of when this packet was sent out (right now)
|
||||||
outgoingPacket.TickCount = Environment.TickCount & Int32.MaxValue;
|
outgoingPacket.TickCount = Environment.TickCount & Int32.MaxValue;
|
||||||
}
|
}
|
||||||
|
@ -872,7 +851,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
|
|
||||||
Buffer.BlockCopy(packetData, 0, buffer.Data, 0, length);
|
Buffer.BlockCopy(packetData, 0, buffer.Data, 0, length);
|
||||||
|
|
||||||
SyncBeginPrioritySend(buffer, 1); //Setting this to a medium priority should help minimise resends
|
AsyncBeginSend(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool IsClientAuthorized(UseCircuitCodePacket useCircuitCode, out AuthenticateResponse sessionInfo)
|
private bool IsClientAuthorized(UseCircuitCodePacket useCircuitCode, out AuthenticateResponse sessionInfo)
|
||||||
|
|
|
@ -29,7 +29,6 @@ using System;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Collections.Generic;
|
|
||||||
using log4net;
|
using log4net;
|
||||||
|
|
||||||
namespace OpenMetaverse
|
namespace OpenMetaverse
|
||||||
|
@ -53,30 +52,12 @@ namespace OpenMetaverse
|
||||||
/// <summary>Local IP address to bind to in server mode</summary>
|
/// <summary>Local IP address to bind to in server mode</summary>
|
||||||
protected IPAddress m_localBindAddress;
|
protected IPAddress m_localBindAddress;
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Standard queue for our outgoing SyncBeginPrioritySend
|
|
||||||
/// </summary>
|
|
||||||
private List<UDPPacketBuffer> m_standardQueue = new List<UDPPacketBuffer>();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Medium priority queue for our outgoing SyncBeginPrioritySend
|
|
||||||
/// </summary>
|
|
||||||
private List<UDPPacketBuffer> m_mediumPriorityQueue = new List<UDPPacketBuffer>();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Prioritised queue for our outgoing SyncBeginPrioritySend
|
|
||||||
/// </summary>
|
|
||||||
private List<UDPPacketBuffer> m_priorityQueue = new List<UDPPacketBuffer>();
|
|
||||||
|
|
||||||
/// <summary>UDP socket, used in either client or server mode</summary>
|
/// <summary>UDP socket, used in either client or server mode</summary>
|
||||||
private Socket m_udpSocket;
|
private Socket m_udpSocket;
|
||||||
|
|
||||||
/// <summary>Flag to process packets asynchronously or synchronously</summary>
|
/// <summary>Flag to process packets asynchronously or synchronously</summary>
|
||||||
private bool m_asyncPacketHandling;
|
private bool m_asyncPacketHandling;
|
||||||
|
|
||||||
/// <summary>Are we currently sending data asynchronously?</summary>
|
|
||||||
private volatile bool m_sendingData = false;
|
|
||||||
|
|
||||||
/// <summary>The all important shutdown flag</summary>
|
/// <summary>The all important shutdown flag</summary>
|
||||||
private volatile bool m_shutdownFlag = true;
|
private volatile bool m_shutdownFlag = true;
|
||||||
|
|
||||||
|
@ -265,51 +246,7 @@ namespace OpenMetaverse
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SyncBeginPrioritySend(UDPPacketBuffer buf, int Priority)
|
public void AsyncBeginSend(UDPPacketBuffer buf)
|
||||||
{
|
|
||||||
if (!m_shutdownFlag)
|
|
||||||
{
|
|
||||||
if (!m_sendingData)
|
|
||||||
{
|
|
||||||
m_sendingData = true;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
AsyncBeginSend(buf);
|
|
||||||
}
|
|
||||||
catch (SocketException) { }
|
|
||||||
catch (ObjectDisposedException) { }
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (Priority == 2)
|
|
||||||
{
|
|
||||||
lock (m_priorityQueue)
|
|
||||||
{
|
|
||||||
m_priorityQueue.Add(buf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (Priority != 0)
|
|
||||||
{
|
|
||||||
lock (m_mediumPriorityQueue)
|
|
||||||
{
|
|
||||||
m_mediumPriorityQueue.Add(buf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
lock (m_standardQueue)
|
|
||||||
{
|
|
||||||
m_standardQueue.Add(buf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AsyncBeginSend(UDPPacketBuffer buf)
|
|
||||||
{
|
{
|
||||||
if (!m_shutdownFlag)
|
if (!m_shutdownFlag)
|
||||||
{
|
{
|
||||||
|
@ -333,48 +270,8 @@ namespace OpenMetaverse
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
// UDPPacketBuffer buf = (UDPPacketBuffer)result.AsyncState;
|
||||||
m_udpSocket.EndSendTo(result);
|
m_udpSocket.EndSendTo(result);
|
||||||
|
|
||||||
if (m_sendingData)
|
|
||||||
{
|
|
||||||
lock (m_priorityQueue)
|
|
||||||
{
|
|
||||||
if (m_priorityQueue.Count > 0)
|
|
||||||
{
|
|
||||||
UDPPacketBuffer buf = m_priorityQueue[0];
|
|
||||||
m_priorityQueue.RemoveAt(0);
|
|
||||||
AsyncBeginSend(buf);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
lock (m_mediumPriorityQueue)
|
|
||||||
{
|
|
||||||
if (m_mediumPriorityQueue.Count > 0)
|
|
||||||
{
|
|
||||||
UDPPacketBuffer buf = m_mediumPriorityQueue[0];
|
|
||||||
m_mediumPriorityQueue.RemoveAt(0);
|
|
||||||
AsyncBeginSend(buf);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
lock (m_standardQueue)
|
|
||||||
{
|
|
||||||
if (m_standardQueue.Count > 0)
|
|
||||||
{
|
|
||||||
UDPPacketBuffer buf = m_standardQueue[0];
|
|
||||||
m_standardQueue.RemoveAt(0);
|
|
||||||
AsyncBeginSend(buf);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_sendingData = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch (SocketException) { }
|
catch (SocketException) { }
|
||||||
catch (ObjectDisposedException) { }
|
catch (ObjectDisposedException) { }
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
using System;
|
using System;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenMetaverse.Packets;
|
|
||||||
|
|
||||||
namespace OpenSim.Region.ClientStack.LindenUDP
|
namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
{
|
{
|
||||||
|
@ -53,8 +52,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
public int TickCount;
|
public int TickCount;
|
||||||
/// <summary>Category this packet belongs to</summary>
|
/// <summary>Category this packet belongs to</summary>
|
||||||
public ThrottleOutPacketType Category;
|
public ThrottleOutPacketType Category;
|
||||||
/// <summary>The type of packet so its delivery method can be determined</summary>
|
|
||||||
public PacketType Type;
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Default constructor
|
/// Default constructor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
Loading…
Reference in New Issue