diff options
Diffstat (limited to 'OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs')
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs | 69 |
1 files changed, 52 insertions, 17 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs index f7ed14d..d52ad7e 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs | |||
@@ -31,6 +31,7 @@ using System.Net; | |||
31 | using System.Threading; | 31 | using System.Threading; |
32 | using log4net; | 32 | using log4net; |
33 | using OpenSim.Framework; | 33 | using OpenSim.Framework; |
34 | using OpenSim.Framework.Monitoring; | ||
34 | using OpenMetaverse; | 35 | using OpenMetaverse; |
35 | using OpenMetaverse.Packets; | 36 | using OpenMetaverse.Packets; |
36 | 37 | ||
@@ -81,6 +82,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
81 | /// hooked to put more data on the empty queue</summary> | 82 | /// hooked to put more data on the empty queue</summary> |
82 | public event QueueEmpty OnQueueEmpty; | 83 | public event QueueEmpty OnQueueEmpty; |
83 | 84 | ||
85 | public event Func<ThrottleOutPacketTypeFlags, bool> HasUpdates; | ||
86 | |||
84 | /// <summary>AgentID for this client</summary> | 87 | /// <summary>AgentID for this client</summary> |
85 | public readonly UUID AgentID; | 88 | public readonly UUID AgentID; |
86 | /// <summary>The remote address of the connected client</summary> | 89 | /// <summary>The remote address of the connected client</summary> |
@@ -645,15 +648,38 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
645 | /// <param name="categories">Throttle categories to fire the callback for</param> | 648 | /// <param name="categories">Throttle categories to fire the callback for</param> |
646 | private void BeginFireQueueEmpty(ThrottleOutPacketTypeFlags categories) | 649 | private void BeginFireQueueEmpty(ThrottleOutPacketTypeFlags categories) |
647 | { | 650 | { |
648 | if (m_nextOnQueueEmpty != 0 && (Environment.TickCount & Int32.MaxValue) >= m_nextOnQueueEmpty) | 651 | // if (m_nextOnQueueEmpty != 0 && (Environment.TickCount & Int32.MaxValue) >= m_nextOnQueueEmpty) |
652 | if (!m_isQueueEmptyRunning && (Environment.TickCount & Int32.MaxValue) >= m_nextOnQueueEmpty) | ||
649 | { | 653 | { |
654 | m_isQueueEmptyRunning = true; | ||
655 | |||
656 | int start = Environment.TickCount & Int32.MaxValue; | ||
657 | const int MIN_CALLBACK_MS = 30; | ||
658 | |||
659 | m_nextOnQueueEmpty = start + MIN_CALLBACK_MS; | ||
660 | if (m_nextOnQueueEmpty == 0) | ||
661 | m_nextOnQueueEmpty = 1; | ||
662 | |||
650 | // Use a value of 0 to signal that FireQueueEmpty is running | 663 | // Use a value of 0 to signal that FireQueueEmpty is running |
651 | m_nextOnQueueEmpty = 0; | 664 | // m_nextOnQueueEmpty = 0; |
652 | // Asynchronously run the callback | 665 | |
653 | Util.FireAndForget(FireQueueEmpty, categories); | 666 | m_categories = categories; |
667 | |||
668 | if (HasUpdates(m_categories)) | ||
669 | { | ||
670 | // Asynchronously run the callback | ||
671 | Util.FireAndForget(FireQueueEmpty, categories); | ||
672 | } | ||
673 | else | ||
674 | { | ||
675 | m_isQueueEmptyRunning = false; | ||
676 | } | ||
654 | } | 677 | } |
655 | } | 678 | } |
656 | 679 | ||
680 | private bool m_isQueueEmptyRunning; | ||
681 | private ThrottleOutPacketTypeFlags m_categories = 0; | ||
682 | |||
657 | /// <summary> | 683 | /// <summary> |
658 | /// Fires the OnQueueEmpty callback and sets the minimum time that it | 684 | /// Fires the OnQueueEmpty callback and sets the minimum time that it |
659 | /// can be called again | 685 | /// can be called again |
@@ -663,22 +689,31 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
663 | /// signature</param> | 689 | /// signature</param> |
664 | private void FireQueueEmpty(object o) | 690 | private void FireQueueEmpty(object o) |
665 | { | 691 | { |
666 | const int MIN_CALLBACK_MS = 30; | 692 | // int start = Environment.TickCount & Int32.MaxValue; |
693 | // const int MIN_CALLBACK_MS = 30; | ||
667 | 694 | ||
668 | ThrottleOutPacketTypeFlags categories = (ThrottleOutPacketTypeFlags)o; | 695 | // if (m_udpServer.IsRunningOutbound) |
669 | QueueEmpty callback = OnQueueEmpty; | 696 | // { |
670 | 697 | ThrottleOutPacketTypeFlags categories = (ThrottleOutPacketTypeFlags)o; | |
671 | int start = Environment.TickCount & Int32.MaxValue; | 698 | QueueEmpty callback = OnQueueEmpty; |
672 | 699 | ||
673 | if (callback != null) | 700 | if (callback != null) |
674 | { | 701 | { |
675 | try { callback(categories); } | 702 | // if (m_udpServer.IsRunningOutbound) |
676 | catch (Exception e) { m_log.Error("[LLUDPCLIENT]: OnQueueEmpty(" + categories + ") threw an exception: " + e.Message, e); } | 703 | // { |
677 | } | 704 | try { callback(categories); } |
705 | catch (Exception e) { m_log.Error("[LLUDPCLIENT]: OnQueueEmpty(" + categories + ") threw an exception: " + e.Message, e); } | ||
706 | // } | ||
707 | } | ||
708 | // } | ||
709 | |||
710 | // m_nextOnQueueEmpty = start + MIN_CALLBACK_MS; | ||
711 | // if (m_nextOnQueueEmpty == 0) | ||
712 | // m_nextOnQueueEmpty = 1; | ||
713 | |||
714 | // } | ||
678 | 715 | ||
679 | m_nextOnQueueEmpty = start + MIN_CALLBACK_MS; | 716 | m_isQueueEmptyRunning = false; |
680 | if (m_nextOnQueueEmpty == 0) | ||
681 | m_nextOnQueueEmpty = 1; | ||
682 | } | 717 | } |
683 | internal void ForceThrottleSetting(int throttle, int setting) | 718 | internal void ForceThrottleSetting(int throttle, int setting) |
684 | { | 719 | { |