diff options
author | Adam Frisby | 2008-04-29 14:04:55 +0000 |
---|---|---|
committer | Adam Frisby | 2008-04-29 14:04:55 +0000 |
commit | 375163a6fece8b3a57c7555246abe8338223a599 (patch) | |
tree | 163001ca96a4b4d08589e9772f78510677d5d0dc /OpenSim/Framework/PacketPool.cs | |
parent | Patch from Melanie: 0001087: Crash to bash de-linking objects. Thanks Melanie! (diff) | |
download | opensim-SC-375163a6fece8b3a57c7555246abe8338223a599.zip opensim-SC-375163a6fece8b3a57c7555246abe8338223a599.tar.gz opensim-SC-375163a6fece8b3a57c7555246abe8338223a599.tar.bz2 opensim-SC-375163a6fece8b3a57c7555246abe8338223a599.tar.xz |
* Spring cleaning.
* Added new generic "Location" class to handle 2D integer locations. Going to use it to replace all RegionHandle and X,Y coordinate references throughout the entire project. You have been warned.
Diffstat (limited to 'OpenSim/Framework/PacketPool.cs')
-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 |