diff options
author | Melanie Thielker | 2009-05-02 00:14:04 +0000 |
---|---|---|
committer | Melanie Thielker | 2009-05-02 00:14:04 +0000 |
commit | ac944def3fbea9cbad58780e3996e4c586237ab5 (patch) | |
tree | 3c8551f27e2d3ef7d19011575ab9f77464d1b08d | |
parent | Add a tweakable for the prim queue preload (diff) | |
download | opensim-SC-ac944def3fbea9cbad58780e3996e4c586237ab5.zip opensim-SC-ac944def3fbea9cbad58780e3996e4c586237ab5.tar.gz opensim-SC-ac944def3fbea9cbad58780e3996e4c586237ab5.tar.bz2 opensim-SC-ac944def3fbea9cbad58780e3996e4c586237ab5.tar.xz |
Fix the issue that stopped the packet pool from working. Add a mechanism
to recycley data blocs within a packet. Recycle the ObjectUpdate* data
blocks. Speeds up loading even more.
This may mean that the packet pool is now viable.
4 files changed, 77 insertions, 10 deletions
diff --git a/OpenSim/Framework/PacketPool.cs b/OpenSim/Framework/PacketPool.cs index a4f7d96..4d9591e 100644 --- a/OpenSim/Framework/PacketPool.cs +++ b/OpenSim/Framework/PacketPool.cs | |||
@@ -34,6 +34,7 @@ using log4net; | |||
34 | 34 | ||
35 | namespace OpenSim.Framework | 35 | namespace OpenSim.Framework |
36 | { | 36 | { |
37 | |||
37 | public sealed class PacketPool | 38 | public sealed class PacketPool |
38 | { | 39 | { |
39 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 40 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
@@ -44,6 +45,9 @@ namespace OpenSim.Framework | |||
44 | 45 | ||
45 | private readonly Dictionary<PacketType, Stack<Packet>> pool = new Dictionary<PacketType, Stack<Packet>>(); | 46 | private readonly Dictionary<PacketType, Stack<Packet>> pool = new Dictionary<PacketType, Stack<Packet>>(); |
46 | 47 | ||
48 | private static Dictionary<Type, List<Object>> DataBlocks = | ||
49 | new Dictionary<Type, List<Object>>(); | ||
50 | |||
47 | static PacketPool() | 51 | static PacketPool() |
48 | { | 52 | { |
49 | } | 53 | } |
@@ -136,6 +140,28 @@ namespace OpenSim.Framework | |||
136 | /// <param name="packet"></param> | 140 | /// <param name="packet"></param> |
137 | public void ReturnPacket(Packet packet) | 141 | public void ReturnPacket(Packet packet) |
138 | { | 142 | { |
143 | switch (packet.Type) | ||
144 | { | ||
145 | case PacketType.ObjectUpdate: | ||
146 | ObjectUpdatePacket oup = (ObjectUpdatePacket)packet; | ||
147 | |||
148 | foreach (ObjectUpdatePacket.ObjectDataBlock oupod in | ||
149 | oup.ObjectData) | ||
150 | ReturnDataBlock<ObjectUpdatePacket.ObjectDataBlock>(oupod); | ||
151 | oup.ObjectData = null; | ||
152 | break; | ||
153 | |||
154 | case PacketType.ImprovedTerseObjectUpdate: | ||
155 | ImprovedTerseObjectUpdatePacket itoup = | ||
156 | (ImprovedTerseObjectUpdatePacket)packet; | ||
157 | |||
158 | foreach (ImprovedTerseObjectUpdatePacket.ObjectDataBlock | ||
159 | itoupod in itoup.ObjectData) | ||
160 | ReturnDataBlock<ImprovedTerseObjectUpdatePacket.ObjectDataBlock>(itoupod); | ||
161 | itoup.ObjectData = null; | ||
162 | break; | ||
163 | } | ||
164 | |||
139 | if (!packetPoolEnabled) | 165 | if (!packetPoolEnabled) |
140 | return; | 166 | return; |
141 | 167 | ||
@@ -163,5 +189,45 @@ namespace OpenSim.Framework | |||
163 | return; | 189 | return; |
164 | } | 190 | } |
165 | } | 191 | } |
192 | |||
193 | public static T GetDataBlock<T>() where T: new() | ||
194 | { | ||
195 | lock(DataBlocks) | ||
196 | { | ||
197 | if (DataBlocks.ContainsKey(typeof(T)) && DataBlocks[typeof(T)].Count > 0) | ||
198 | { | ||
199 | T block = (T)DataBlocks[typeof(T)][0]; | ||
200 | DataBlocks[typeof(T)].RemoveAt(0); | ||
201 | if (block == null) | ||
202 | return new T(); | ||
203 | return block; | ||
204 | } | ||
205 | else | ||
206 | { | ||
207 | return new T(); | ||
208 | } | ||
209 | } | ||
210 | } | ||
211 | |||
212 | public static void ReturnDataBlock<T>(T block) where T: new() | ||
213 | { | ||
214 | if (block == null) | ||
215 | return; | ||
216 | |||
217 | lock (DataBlocks) | ||
218 | { | ||
219 | if (!DataBlocks.ContainsKey(typeof(T))) | ||
220 | { | ||
221 | List<Object> l = new List<Object>(); | ||
222 | l.Add(block); | ||
223 | DataBlocks.Add(typeof(T), l); | ||
224 | } | ||
225 | else | ||
226 | { | ||
227 | if (DataBlocks[typeof(T)].Count < 500) | ||
228 | DataBlocks[typeof(T)].Add(block); | ||
229 | } | ||
230 | } | ||
231 | } | ||
166 | } | 232 | } |
167 | } | 233 | } |
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 05ebcac..4acc6be 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | |||
@@ -2893,10 +2893,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
2893 | if (rotation.X == rotation.Y && rotation.Y == rotation.Z && rotation.Z == rotation.W && rotation.W == 0) | 2893 | if (rotation.X == rotation.Y && rotation.Y == rotation.Z && rotation.Z == rotation.W && rotation.W == 0) |
2894 | rotation = Quaternion.Identity; | 2894 | rotation = Quaternion.Identity; |
2895 | 2895 | ||
2896 | ObjectUpdatePacket.ObjectDataBlock objectData = | 2896 | ObjectUpdatePacket.ObjectDataBlock objectData = CreatePrimUpdateBlock(primShape, flags); |
2897 | new ObjectUpdatePacket.ObjectDataBlock(); | ||
2898 | |||
2899 | objectData = CreatePrimUpdateBlock(primShape, flags); | ||
2900 | 2897 | ||
2901 | objectData.ID = localID; | 2898 | objectData.ID = localID; |
2902 | objectData.FullID = objectID; | 2899 | objectData.FullID = objectID; |
@@ -3655,7 +3652,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3655 | { | 3652 | { |
3656 | byte[] bytes = new byte[60]; | 3653 | byte[] bytes = new byte[60]; |
3657 | int i = 0; | 3654 | int i = 0; |
3658 | ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock(); | 3655 | ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat = PacketPool.GetDataBlock<ImprovedTerseObjectUpdatePacket.ObjectDataBlock>(); |
3659 | 3656 | ||
3660 | dat.TextureEntry = new byte[0]; // AvatarTemplate.TextureEntry; | 3657 | dat.TextureEntry = new byte[0]; // AvatarTemplate.TextureEntry; |
3661 | 3658 | ||
@@ -3750,7 +3747,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3750 | byte[] bytes = new byte[60]; | 3747 | byte[] bytes = new byte[60]; |
3751 | 3748 | ||
3752 | int i = 0; | 3749 | int i = 0; |
3753 | ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock(); | 3750 | ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat = PacketPool.GetDataBlock<ImprovedTerseObjectUpdatePacket.ObjectDataBlock>(); |
3754 | dat.TextureEntry = new byte[0]; | 3751 | dat.TextureEntry = new byte[0]; |
3755 | bytes[i++] = (byte)(ID % 256); | 3752 | bytes[i++] = (byte)(ID % 256); |
3756 | bytes[i++] = (byte)((ID >> 8) % 256); | 3753 | bytes[i++] = (byte)((ID >> 8) % 256); |
@@ -3837,7 +3834,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3837 | /// <returns></returns> | 3834 | /// <returns></returns> |
3838 | protected ObjectUpdatePacket.ObjectDataBlock CreatePrimUpdateBlock(PrimitiveBaseShape primShape, uint flags) | 3835 | protected ObjectUpdatePacket.ObjectDataBlock CreatePrimUpdateBlock(PrimitiveBaseShape primShape, uint flags) |
3839 | { | 3836 | { |
3840 | ObjectUpdatePacket.ObjectDataBlock objupdate = new ObjectUpdatePacket.ObjectDataBlock(); | 3837 | ObjectUpdatePacket.ObjectDataBlock objupdate = PacketPool.GetDataBlock<ObjectUpdatePacket.ObjectDataBlock>(); |
3841 | SetDefaultPrimPacketValues(objupdate); | 3838 | SetDefaultPrimPacketValues(objupdate); |
3842 | objupdate.UpdateFlags = flags; | 3839 | objupdate.UpdateFlags = flags; |
3843 | SetPrimPacketShapeData(objupdate, primShape); | 3840 | SetPrimPacketShapeData(objupdate, primShape); |
@@ -3908,7 +3905,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3908 | /// <returns></returns> | 3905 | /// <returns></returns> |
3909 | public ObjectUpdatePacket.ObjectDataBlock CreateDefaultAvatarPacket(byte[] textureEntry) | 3906 | public ObjectUpdatePacket.ObjectDataBlock CreateDefaultAvatarPacket(byte[] textureEntry) |
3910 | { | 3907 | { |
3911 | ObjectUpdatePacket.ObjectDataBlock objdata = new ObjectUpdatePacket.ObjectDataBlock(); | 3908 | ObjectUpdatePacket.ObjectDataBlock objdata = PacketPool.GetDataBlock<ObjectUpdatePacket.ObjectDataBlock>(); |
3912 | // new OpenMetaverse.Packets.ObjectUpdatePacket.ObjectDataBlock(data1, ref i); | 3909 | // new OpenMetaverse.Packets.ObjectUpdatePacket.ObjectDataBlock(data1, ref i); |
3913 | 3910 | ||
3914 | SetDefaultAvatarPacketValues(ref objdata); | 3911 | SetDefaultAvatarPacketValues(ref objdata); |
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs b/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs index 58777ab..2191ca7 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs | |||
@@ -586,7 +586,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
586 | return; | 586 | return; |
587 | 587 | ||
588 | m_NeedAck.Remove(id); | 588 | m_NeedAck.Remove(id); |
589 | PacketPool.Instance.ReturnPacket(data.Packet); | 589 | // We can't return this packet, it will just have to be GC'd |
590 | // Reason for that is that the packet may still be in the | ||
591 | // send queue, and if it gets reused things get messy! | ||
592 | // | ||
593 | // PacketPool.Instance.ReturnPacket(data.Packet); | ||
590 | m_UnackedBytes -= data.Length; | 594 | m_UnackedBytes -= data.Length; |
591 | } | 595 | } |
592 | } | 596 | } |
diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MuteListModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MuteListModule.cs index d3e5b45..3b1bad0 100644 --- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MuteListModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MuteListModule.cs | |||
@@ -129,7 +129,7 @@ namespace OpenSim.Region.CoreModules.Avatar.MuteList | |||
129 | 129 | ||
130 | private void OnMuteListRequest(IClientAPI client, uint crc) | 130 | private void OnMuteListRequest(IClientAPI client, uint crc) |
131 | { | 131 | { |
132 | m_log.DebugFormat("[MUTE LIST] Got mute list requestg for crc {0}", crc); | 132 | m_log.DebugFormat("[MUTE LIST] Got mute list request for crc {0}", crc); |
133 | string filename = "mutes"+client.AgentId.ToString(); | 133 | string filename = "mutes"+client.AgentId.ToString(); |
134 | 134 | ||
135 | IXfer xfer = client.Scene.RequestModuleInterface<IXfer>(); | 135 | IXfer xfer = client.Scene.RequestModuleInterface<IXfer>(); |