aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Framework/PacketPool.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Framework/PacketPool.cs')
-rw-r--r--OpenSim/Framework/PacketPool.cs76
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