diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs | 67 |
1 files changed, 32 insertions, 35 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs index 89a9401..f91abfe 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs | |||
@@ -688,6 +688,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
688 | RTO = Math.Min(RTO * 2, m_maxRTO); | 688 | RTO = Math.Min(RTO * 2, m_maxRTO); |
689 | } | 689 | } |
690 | 690 | ||
691 | |||
692 | const int MIN_CALLBACK_MS = 30; | ||
693 | |||
691 | /// <summary> | 694 | /// <summary> |
692 | /// Does an early check to see if this queue empty callback is already | 695 | /// Does an early check to see if this queue empty callback is already |
693 | /// running, then asynchronously firing the event | 696 | /// running, then asynchronously firing the event |
@@ -695,24 +698,20 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
695 | /// <param name="categories">Throttle categories to fire the callback for</param> | 698 | /// <param name="categories">Throttle categories to fire the callback for</param> |
696 | private void BeginFireQueueEmpty(ThrottleOutPacketTypeFlags categories) | 699 | private void BeginFireQueueEmpty(ThrottleOutPacketTypeFlags categories) |
697 | { | 700 | { |
698 | // if (m_nextOnQueueEmpty != 0 && (Environment.TickCount & Int32.MaxValue) >= m_nextOnQueueEmpty) | 701 | if (!m_isQueueEmptyRunning) |
699 | if (!m_isQueueEmptyRunning && (Environment.TickCount & Int32.MaxValue) >= m_nextOnQueueEmpty) | ||
700 | { | 702 | { |
701 | m_isQueueEmptyRunning = true; | ||
702 | |||
703 | int start = Environment.TickCount & Int32.MaxValue; | 703 | int start = Environment.TickCount & Int32.MaxValue; |
704 | const int MIN_CALLBACK_MS = 30; | 704 | |
705 | if (start < m_nextOnQueueEmpty) | ||
706 | return; | ||
707 | |||
708 | m_isQueueEmptyRunning = true; | ||
705 | 709 | ||
706 | m_nextOnQueueEmpty = start + MIN_CALLBACK_MS; | 710 | m_nextOnQueueEmpty = start + MIN_CALLBACK_MS; |
707 | if (m_nextOnQueueEmpty == 0) | 711 | if (m_nextOnQueueEmpty == 0) |
708 | m_nextOnQueueEmpty = 1; | 712 | m_nextOnQueueEmpty = 1; |
709 | 713 | ||
710 | // Use a value of 0 to signal that FireQueueEmpty is running | 714 | if (HasUpdates(categories)) |
711 | // m_nextOnQueueEmpty = 0; | ||
712 | |||
713 | m_categories = categories; | ||
714 | |||
715 | if (HasUpdates(m_categories)) | ||
716 | { | 715 | { |
717 | // Asynchronously run the callback | 716 | // Asynchronously run the callback |
718 | Util.FireAndForget(FireQueueEmpty, categories); | 717 | Util.FireAndForget(FireQueueEmpty, categories); |
@@ -725,7 +724,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
725 | } | 724 | } |
726 | 725 | ||
727 | private bool m_isQueueEmptyRunning; | 726 | private bool m_isQueueEmptyRunning; |
728 | private ThrottleOutPacketTypeFlags m_categories = 0; | 727 | |
729 | 728 | ||
730 | /// <summary> | 729 | /// <summary> |
731 | /// Fires the OnQueueEmpty callback and sets the minimum time that it | 730 | /// Fires the OnQueueEmpty callback and sets the minimum time that it |
@@ -736,35 +735,33 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
736 | /// signature</param> | 735 | /// signature</param> |
737 | private void FireQueueEmpty(object o) | 736 | private void FireQueueEmpty(object o) |
738 | { | 737 | { |
739 | // int start = Environment.TickCount & Int32.MaxValue; | 738 | ThrottleOutPacketTypeFlags categories = (ThrottleOutPacketTypeFlags)o; |
740 | // const int MIN_CALLBACK_MS = 30; | 739 | QueueEmpty callback = OnQueueEmpty; |
741 | |||
742 | // if (m_udpServer.IsRunningOutbound) | ||
743 | // { | ||
744 | ThrottleOutPacketTypeFlags categories = (ThrottleOutPacketTypeFlags)o; | ||
745 | QueueEmpty callback = OnQueueEmpty; | ||
746 | 740 | ||
747 | if (callback != null) | 741 | if (callback != null) |
748 | { | 742 | { |
749 | // if (m_udpServer.IsRunningOutbound) | 743 | // if (m_udpServer.IsRunningOutbound) |
750 | // { | 744 | // { |
751 | try { callback(categories); } | 745 | try { callback(categories); } |
752 | catch (Exception e) { m_log.Error("[LLUDPCLIENT]: OnQueueEmpty(" + categories + ") threw an exception: " + e.Message, e); } | 746 | catch (Exception e) { m_log.Error("[LLUDPCLIENT]: OnQueueEmpty(" + categories + ") threw an exception: " + e.Message, e); } |
753 | // } | 747 | // } |
754 | } | 748 | } |
755 | // } | ||
756 | |||
757 | // m_nextOnQueueEmpty = start + MIN_CALLBACK_MS; | ||
758 | // if (m_nextOnQueueEmpty == 0) | ||
759 | // m_nextOnQueueEmpty = 1; | ||
760 | |||
761 | // } | ||
762 | 749 | ||
763 | m_isQueueEmptyRunning = false; | 750 | m_isQueueEmptyRunning = false; |
764 | } | 751 | } |
752 | |||
765 | internal void ForceThrottleSetting(int throttle, int setting) | 753 | internal void ForceThrottleSetting(int throttle, int setting) |
766 | { | 754 | { |
767 | m_throttleCategories[throttle].RequestedDripRate = Math.Max(setting, LLUDPServer.MTU); ; | 755 | if (throttle > 0 && throttle < THROTTLE_CATEGORY_COUNT) |
756 | m_throttleCategories[throttle].RequestedDripRate = Math.Max(setting, LLUDPServer.MTU); | ||
757 | } | ||
758 | |||
759 | internal int GetThrottleSetting(int throttle) | ||
760 | { | ||
761 | if (throttle > 0 && throttle < THROTTLE_CATEGORY_COUNT) | ||
762 | return (int)m_throttleCategories[throttle].RequestedDripRate; | ||
763 | else | ||
764 | return 0; | ||
768 | } | 765 | } |
769 | 766 | ||
770 | /// <summary> | 767 | /// <summary> |