diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Framework/PacketPool.cs | 76 |
1 files changed, 37 insertions, 39 deletions
diff --git a/OpenSim/Framework/PacketPool.cs b/OpenSim/Framework/PacketPool.cs index 22f952a..be56cdc 100644 --- a/OpenSim/Framework/PacketPool.cs +++ b/OpenSim/Framework/PacketPool.cs | |||
@@ -35,18 +35,31 @@ namespace OpenSim.Framework | |||
35 | { | 35 | { |
36 | public sealed class PacketPool | 36 | public sealed class PacketPool |
37 | { | 37 | { |
38 | static public void EncodeProxyMessage(byte[] bytes, ref int numBytes, EndPoint trueEP) | 38 | private static readonly PacketPool instance = new PacketPool(); |
39 | |||
40 | private Hashtable pool = new Hashtable(); | ||
41 | |||
42 | static PacketPool() | ||
43 | { | ||
44 | } | ||
45 | |||
46 | public static PacketPool Instance | ||
47 | { | ||
48 | get { return instance; } | ||
49 | } | ||
50 | |||
51 | public static void EncodeProxyMessage(byte[] bytes, ref int numBytes, EndPoint trueEP) | ||
39 | { | 52 | { |
40 | if( numBytes > 4090 ) // max UPD size = 4096 | 53 | if (numBytes > 4090) // max UPD size = 4096 |
41 | { | 54 | { |
42 | throw new Exception("ERROR: No space to encode the proxy EP"); | 55 | throw new Exception("ERROR: No space to encode the proxy EP"); |
43 | } | 56 | } |
44 | 57 | ||
45 | ushort port = (ushort) ((IPEndPoint) trueEP).Port; | 58 | ushort port = (ushort) ((IPEndPoint) trueEP).Port; |
46 | bytes[numBytes++] = (byte)(port % 256); | 59 | bytes[numBytes++] = (byte) (port % 256); |
47 | bytes[numBytes++] = (byte)(port / 256); | 60 | bytes[numBytes++] = (byte) (port / 256); |
48 | 61 | ||
49 | foreach (byte b in ((IPEndPoint)trueEP).Address.GetAddressBytes()) | 62 | foreach (byte b in ((IPEndPoint) trueEP).Address.GetAddressBytes()) |
50 | { | 63 | { |
51 | bytes[numBytes++] = b; | 64 | bytes[numBytes++] = b; |
52 | } | 65 | } |
@@ -57,8 +70,8 @@ namespace OpenSim.Framework | |||
57 | 70 | ||
58 | numBytes = x; | 71 | numBytes = x; |
59 | } | 72 | } |
60 | 73 | ||
61 | static public EndPoint DecodeProxyMessage(byte[] bytes, ref int numBytes) | 74 | public static EndPoint DecodeProxyMessage(byte[] bytes, ref int numBytes) |
62 | { | 75 | { |
63 | // IPv4 Only | 76 | // IPv4 Only |
64 | byte[] addr = new byte[4]; | 77 | byte[] addr = new byte[4]; |
@@ -68,35 +81,19 @@ namespace OpenSim.Framework | |||
68 | addr[1] = bytes[--numBytes]; | 81 | addr[1] = bytes[--numBytes]; |
69 | addr[0] = bytes[--numBytes]; | 82 | addr[0] = bytes[--numBytes]; |
70 | 83 | ||
71 | ushort port = (ushort)(bytes[--numBytes] * 256); | 84 | ushort port = (ushort) (bytes[--numBytes] * 256); |
72 | port += (ushort)bytes[--numBytes]; | 85 | port += (ushort) bytes[--numBytes]; |
73 | |||
74 | return (EndPoint) new IPEndPoint(new IPAddress(addr), (int)port); | ||
75 | } | ||
76 | 86 | ||
77 | // Set up a thread-safe singleton pattern | 87 | return (EndPoint) new IPEndPoint(new IPAddress(addr), (int) port); |
78 | static PacketPool() | ||
79 | { | ||
80 | } | 88 | } |
81 | 89 | ||
82 | static readonly PacketPool instance = new PacketPool(); | 90 | public Packet GetPacket(PacketType type) |
83 | |||
84 | public static PacketPool Instance | ||
85 | { | 91 | { |
86 | get | ||
87 | { | ||
88 | return instance; | ||
89 | } | ||
90 | } | ||
91 | |||
92 | private Hashtable pool = new Hashtable(); | ||
93 | |||
94 | public Packet GetPacket(PacketType type) { | ||
95 | Packet packet = null; | 92 | Packet packet = null; |
96 | 93 | ||
97 | lock(pool) | 94 | lock (pool) |
98 | { | 95 | { |
99 | if(pool[type] == null || ((Stack) pool[type]).Count == 0) | 96 | if (pool[type] == null || ((Stack) pool[type]).Count == 0) |
100 | { | 97 | { |
101 | // Creating a new packet if we cannot reuse an old package | 98 | // Creating a new packet if we cannot reuse an old package |
102 | packet = Packet.BuildPacket(type); | 99 | packet = Packet.BuildPacket(type); |
@@ -104,14 +101,14 @@ namespace OpenSim.Framework | |||
104 | else | 101 | else |
105 | { | 102 | { |
106 | // Recycle old packages | 103 | // Recycle old packages |
107 | packet=(Packet) ((Stack) pool[type]).Pop(); | 104 | packet = (Packet) ((Stack) pool[type]).Pop(); |
108 | } | 105 | } |
109 | } | 106 | } |
110 | 107 | ||
111 | return packet; | 108 | return packet; |
112 | } | 109 | } |
113 | 110 | ||
114 | // private byte[] decoded_header = new byte[10]; | 111 | // private byte[] decoded_header = new byte[10]; |
115 | private PacketType GetType(byte[] bytes) | 112 | private PacketType GetType(byte[] bytes) |
116 | { | 113 | { |
117 | byte[] decoded_header = new byte[10 + 8]; | 114 | byte[] decoded_header = new byte[10 + 8]; |
@@ -120,7 +117,7 @@ namespace OpenSim.Framework | |||
120 | 117 | ||
121 | Buffer.BlockCopy(bytes, 0, decoded_header, 0, 10); | 118 | Buffer.BlockCopy(bytes, 0, decoded_header, 0, 10); |
122 | 119 | ||
123 | if((bytes[0] & Helpers.MSG_ZEROCODED)!=0) | 120 | if ((bytes[0] & Helpers.MSG_ZEROCODED) != 0) |
124 | { | 121 | { |
125 | Helpers.ZeroDecodeCommand(bytes, decoded_header); | 122 | Helpers.ZeroDecodeCommand(bytes, decoded_header); |
126 | } | 123 | } |
@@ -129,21 +126,21 @@ namespace OpenSim.Framework | |||
129 | { | 126 | { |
130 | if (decoded_header[7] == 0xFF) | 127 | if (decoded_header[7] == 0xFF) |
131 | { | 128 | { |
132 | id = (ushort)((decoded_header[8] << 8) + decoded_header[9]); | 129 | id = (ushort) ((decoded_header[8] << 8) + decoded_header[9]); |
133 | freq = PacketFrequency.Low; | 130 | freq = PacketFrequency.Low; |
134 | } | 131 | } |
135 | else | 132 | else |
136 | { | 133 | { |
137 | id = (ushort)decoded_header[7]; | 134 | id = (ushort) decoded_header[7]; |
138 | freq = PacketFrequency.Medium; | 135 | freq = PacketFrequency.Medium; |
139 | } | 136 | } |
140 | } | 137 | } |
141 | else | 138 | else |
142 | { | 139 | { |
143 | id = (ushort)decoded_header[6]; | 140 | id = (ushort) decoded_header[6]; |
144 | freq = PacketFrequency.High; | 141 | freq = PacketFrequency.High; |
145 | } | 142 | } |
146 | 143 | ||
147 | return Packet.GetType(id, freq); | 144 | return Packet.GetType(id, freq); |
148 | } | 145 | } |
149 | 146 | ||
@@ -157,7 +154,8 @@ namespace OpenSim.Framework | |||
157 | return packet; | 154 | return packet; |
158 | } | 155 | } |
159 | 156 | ||
160 | public void ReturnPacket(Packet packet) { | 157 | public void ReturnPacket(Packet packet) |
158 | { | ||
161 | return; // packet pool disabled | 159 | return; // packet pool disabled |
162 | 160 | ||
163 | /* // Commented out to remove a compiler warning. :) | 161 | /* // Commented out to remove a compiler warning. :) |
@@ -177,4 +175,4 @@ namespace OpenSim.Framework | |||
177 | */ | 175 | */ |
178 | } | 176 | } |
179 | } | 177 | } |
180 | } | 178 | } \ No newline at end of file |