diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Environment/Modules/Framework/EventQueueGetModule.cs | 65 |
1 files changed, 58 insertions, 7 deletions
diff --git a/OpenSim/Region/Environment/Modules/Framework/EventQueueGetModule.cs b/OpenSim/Region/Environment/Modules/Framework/EventQueueGetModule.cs index d60e15a..ebaa406 100644 --- a/OpenSim/Region/Environment/Modules/Framework/EventQueueGetModule.cs +++ b/OpenSim/Region/Environment/Modules/Framework/EventQueueGetModule.cs | |||
@@ -52,11 +52,19 @@ using BlockingLLSDQueue = OpenSim.Framework.BlockingQueue<OpenMetaverse.Structur | |||
52 | 52 | ||
53 | namespace OpenSim.Region.Environment.Modules.Framework | 53 | namespace OpenSim.Region.Environment.Modules.Framework |
54 | { | 54 | { |
55 | public struct QueueItem | ||
56 | { | ||
57 | public int id; | ||
58 | public LLSDMap body; | ||
59 | } | ||
60 | |||
55 | public class EventQueueGetModule : IEventQueue, IRegionModule | 61 | public class EventQueueGetModule : IEventQueue, IRegionModule |
56 | { | 62 | { |
57 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 63 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
58 | private Scene m_scene = null; | 64 | private Scene m_scene = null; |
59 | private IConfigSource m_gConfig; | 65 | private IConfigSource m_gConfig; |
66 | |||
67 | private Dictionary<UUID, int> m_ids = new Dictionary<UUID, int>(); | ||
60 | 68 | ||
61 | private Dictionary<UUID, BlockingLLSDQueue> queues = new Dictionary<UUID, BlockingLLSDQueue>(); | 69 | private Dictionary<UUID, BlockingLLSDQueue> queues = new Dictionary<UUID, BlockingLLSDQueue>(); |
62 | 70 | ||
@@ -83,6 +91,7 @@ namespace OpenSim.Region.Environment.Modules.Framework | |||
83 | 91 | ||
84 | private void ReadConfigAndPopulate(Scene scene, IConfig startupConfig, string p) | 92 | private void ReadConfigAndPopulate(Scene scene, IConfig startupConfig, string p) |
85 | { | 93 | { |
94 | |||
86 | } | 95 | } |
87 | 96 | ||
88 | public void PostInitialise() | 97 | public void PostInitialise() |
@@ -147,6 +156,7 @@ namespace OpenSim.Region.Environment.Modules.Framework | |||
147 | { | 156 | { |
148 | m_log.DebugFormat("[EVENTQUEUE]: Avatar {0} entering parcel {1} in region {2}.", | 157 | m_log.DebugFormat("[EVENTQUEUE]: Avatar {0} entering parcel {1} in region {2}.", |
149 | avatar.UUID, localLandID, regionID); | 158 | avatar.UUID, localLandID, regionID); |
159 | |||
150 | } | 160 | } |
151 | 161 | ||
152 | private void MakeChildAgent(ScenePresence avatar) | 162 | private void MakeChildAgent(ScenePresence avatar) |
@@ -164,29 +174,64 @@ namespace OpenSim.Region.Environment.Modules.Framework | |||
164 | { | 174 | { |
165 | return ProcessQueue(m_dhttpMethod,agentID, caps); | 175 | return ProcessQueue(m_dhttpMethod,agentID, caps); |
166 | })); | 176 | })); |
177 | Random rnd = new Random(System.Environment.TickCount); | ||
178 | lock (m_ids) | ||
179 | { | ||
180 | if (!m_ids.ContainsKey(agentID)) | ||
181 | m_ids.Add(agentID, rnd.Next(30000000)); | ||
182 | } | ||
183 | |||
184 | |||
185 | |||
167 | } | 186 | } |
168 | 187 | ||
169 | public Hashtable ProcessQueue(Hashtable request,UUID agentID, Caps caps) | 188 | public Hashtable ProcessQueue(Hashtable request,UUID agentID, Caps caps) |
170 | { | 189 | { |
171 | // TODO: this has to be redone to not busy-wait (and block the thread), | 190 | // TODO: this has to be redone to not busy-wait (and block the thread), |
172 | // TODO: as soon as we have a non-blocking way to handle HTTP-requests. | 191 | // TODO: as soon as we have a non-blocking way to handle HTTP-requests. |
192 | |||
173 | BlockingLLSDQueue queue = GetQueue(agentID); | 193 | BlockingLLSDQueue queue = GetQueue(agentID); |
174 | LLSD element = queue.Dequeue(15000); // 15s timeout | 194 | LLSD element = queue.Dequeue(15000); // 15s timeout |
175 | 195 | ||
196 | |||
176 | String debug = "[EVENTQUEUE]: Got request for agent {0}: [ "; | 197 | String debug = "[EVENTQUEUE]: Got request for agent {0}: [ "; |
177 | foreach(object key in request.Keys) | 198 | foreach(object key in request.Keys) |
178 | { | 199 | { |
179 | debug += key.ToString() + "=" + request[key].ToString() + " "; | 200 | debug += key.ToString() + "=" + request[key].ToString() + " "; |
180 | } | 201 | } |
181 | m_log.DebugFormat(debug, agentID); | 202 | //m_log.DebugFormat(debug, agentID); |
182 | 203 | ||
183 | if (element == null) // didn't have an event in 15s | 204 | if (element == null) // didn't have an event in 15s |
184 | { | 205 | { |
206 | // Send it a fake event to keep the client polling! It doesn't like 502s like the proxys say! | ||
207 | element = EventQueueHelper.KeepAliveEvent(); | ||
208 | |||
209 | ScenePresence avatar; | ||
210 | m_scene.TryGetAvatar(agentID, out avatar); | ||
211 | |||
212 | LLSDArray array = new LLSDArray(); | ||
213 | array.Add(element); | ||
214 | int thisID = m_ids[agentID]; | ||
215 | while (queue.Count() > 0) | ||
216 | { | ||
217 | array.Add(queue.Dequeue(1)); | ||
218 | thisID++; | ||
219 | } | ||
220 | LLSDMap events = new LLSDMap(); | ||
221 | events.Add("events", array); | ||
222 | |||
223 | events.Add("id", new LLSDInteger(thisID)); | ||
224 | lock (m_ids) | ||
225 | { | ||
226 | m_ids[agentID] = thisID + 1; | ||
227 | } | ||
185 | Hashtable responsedata = new Hashtable(); | 228 | Hashtable responsedata = new Hashtable(); |
186 | responsedata["int_response_code"] = 502; | 229 | responsedata["int_response_code"] = 200; |
187 | responsedata["str_response_string"] = "Upstream error:"; | 230 | responsedata["content_type"] = "application/llsd+xml"; |
188 | responsedata["content_type"] = "text/plain"; | ||
189 | responsedata["keepalive"] = true; | 231 | responsedata["keepalive"] = true; |
232 | responsedata["str_response_string"] = LLSDParser.SerializeXmlString(events); | ||
233 | //m_log.DebugFormat("[EVENTQUEUE]: sending fake response for {0}: {1}", agentID, responsedata["str_response_string"]); | ||
234 | |||
190 | return responsedata; | 235 | return responsedata; |
191 | } | 236 | } |
192 | else | 237 | else |
@@ -196,14 +241,20 @@ namespace OpenSim.Region.Environment.Modules.Framework | |||
196 | 241 | ||
197 | LLSDArray array = new LLSDArray(); | 242 | LLSDArray array = new LLSDArray(); |
198 | array.Add(element); | 243 | array.Add(element); |
244 | int thisID = m_ids[agentID]; | ||
199 | while (queue.Count() > 0) | 245 | while (queue.Count() > 0) |
200 | { | 246 | { |
201 | array.Add(queue.Dequeue(1)); | 247 | array.Add(queue.Dequeue(1)); |
248 | thisID++; | ||
202 | } | 249 | } |
203 | LLSDMap events = new LLSDMap(); | 250 | LLSDMap events = new LLSDMap(); |
204 | events.Add("events", array); | 251 | events.Add("events", array); |
205 | events.Add("id", new LLSDInteger(1)); // TODO: this seems to be a event sequence-numeber to be ack'd by the client? | 252 | |
206 | 253 | events.Add("id", new LLSDInteger(thisID)); | |
254 | lock (m_ids) | ||
255 | { | ||
256 | m_ids[agentID] = thisID + 1; | ||
257 | } | ||
207 | Hashtable responsedata = new Hashtable(); | 258 | Hashtable responsedata = new Hashtable(); |
208 | responsedata["int_response_code"] = 200; | 259 | responsedata["int_response_code"] = 200; |
209 | responsedata["content_type"] = "application/llsd+xml"; | 260 | responsedata["content_type"] = "application/llsd+xml"; |