diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | 104 |
1 files changed, 59 insertions, 45 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs index a6ead5e..3881bdb 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | |||
@@ -776,61 +776,75 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
776 | 776 | ||
777 | while (base.IsRunning) | 777 | while (base.IsRunning) |
778 | { | 778 | { |
779 | bool resendUnacked = false; | 779 | try |
780 | bool sendAcks = false; | ||
781 | bool sendPings = false; | ||
782 | bool packetSent = false; | ||
783 | |||
784 | elapsedMS += Environment.TickCount - now; | ||
785 | |||
786 | // Check for pending outgoing resends every 100ms | ||
787 | if (elapsedMS >= 100) | ||
788 | { | ||
789 | resendUnacked = true; | ||
790 | elapsedMS -= 100; | ||
791 | ++elapsed100MS; | ||
792 | } | ||
793 | // Check for pending outgoing ACKs every 500ms | ||
794 | if (elapsed100MS >= 5) | ||
795 | { | ||
796 | sendAcks = true; | ||
797 | elapsed100MS = 0; | ||
798 | ++elapsed500MS; | ||
799 | } | ||
800 | // Send pings to clients every 5000ms | ||
801 | if (elapsed500MS >= 10) | ||
802 | { | 780 | { |
803 | sendPings = true; | 781 | bool resendUnacked = false; |
804 | elapsed500MS = 0; | 782 | bool sendAcks = false; |
805 | } | 783 | bool sendPings = false; |
784 | bool packetSent = false; | ||
806 | 785 | ||
807 | m_scene.ClientManager.ForEachSync( | 786 | elapsedMS += Environment.TickCount - now; |
808 | delegate(IClientAPI client) | 787 | |
788 | // Check for pending outgoing resends every 100ms | ||
789 | if (elapsedMS >= 100) | ||
809 | { | 790 | { |
810 | if (client is LLClientView) | 791 | resendUnacked = true; |
811 | { | 792 | elapsedMS -= 100; |
812 | LLUDPClient udpClient = ((LLClientView)client).UDPClient; | 793 | ++elapsed100MS; |
794 | } | ||
795 | // Check for pending outgoing ACKs every 500ms | ||
796 | if (elapsed100MS >= 5) | ||
797 | { | ||
798 | sendAcks = true; | ||
799 | elapsed100MS = 0; | ||
800 | ++elapsed500MS; | ||
801 | } | ||
802 | // Send pings to clients every 5000ms | ||
803 | if (elapsed500MS >= 10) | ||
804 | { | ||
805 | sendPings = true; | ||
806 | elapsed500MS = 0; | ||
807 | } | ||
813 | 808 | ||
814 | if (udpClient.IsConnected) | 809 | m_scene.ClientManager.ForEachSync( |
810 | delegate(IClientAPI client) | ||
811 | { | ||
812 | try | ||
815 | { | 813 | { |
816 | if (udpClient.DequeueOutgoing()) | 814 | if (client is LLClientView) |
817 | packetSent = true; | ||
818 | if (resendUnacked) | ||
819 | ResendUnacked(udpClient); | ||
820 | if (sendAcks) | ||
821 | { | 815 | { |
822 | SendAcks(udpClient); | 816 | LLUDPClient udpClient = ((LLClientView)client).UDPClient; |
823 | udpClient.SendPacketStats(); | 817 | |
818 | if (udpClient.IsConnected) | ||
819 | { | ||
820 | if (udpClient.DequeueOutgoing()) | ||
821 | packetSent = true; | ||
822 | if (resendUnacked) | ||
823 | ResendUnacked(udpClient); | ||
824 | if (sendAcks) | ||
825 | { | ||
826 | SendAcks(udpClient); | ||
827 | udpClient.SendPacketStats(); | ||
828 | } | ||
829 | if (sendPings) | ||
830 | SendPing(udpClient); | ||
831 | } | ||
824 | } | 832 | } |
825 | if (sendPings) | 833 | } |
826 | SendPing(udpClient); | 834 | catch (Exception ex) |
835 | { | ||
836 | m_log.Error("[LLUDPSERVER]: OutgoingPacketHandler iteration for " + client.Name + " threw an exception: " + ex.Message, ex); | ||
827 | } | 837 | } |
828 | } | 838 | } |
829 | } | 839 | ); |
830 | ); | ||
831 | 840 | ||
832 | if (!packetSent) | 841 | if (!packetSent) |
833 | Thread.Sleep(20); | 842 | Thread.Sleep(20); |
843 | } | ||
844 | catch (Exception ex) | ||
845 | { | ||
846 | m_log.Error("[LLUDPSERVER]: OutgoingPacketHandler loop threw an exception: " + ex.Message, ex); | ||
847 | } | ||
834 | } | 848 | } |
835 | } | 849 | } |
836 | 850 | ||