aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs58
1 files changed, 25 insertions, 33 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs
index f76ea74..0f305b1 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs
@@ -52,6 +52,13 @@ namespace OpenSim.Region.ClientStack.Linden
52 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")] 52 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
53 public class WebFetchInvDescModule : INonSharedRegionModule 53 public class WebFetchInvDescModule : INonSharedRegionModule
54 { 54 {
55 struct aPollRequest
56 {
57 public PollServiceInventoryEventArgs thepoll;
58 public UUID reqID;
59 public Hashtable request;
60 }
61
55 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 62 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
56 63
57 private Scene m_scene; 64 private Scene m_scene;
@@ -64,8 +71,8 @@ namespace OpenSim.Region.ClientStack.Linden
64 private Dictionary<UUID, string> m_capsDict = new Dictionary<UUID, string>(); 71 private Dictionary<UUID, string> m_capsDict = new Dictionary<UUID, string>();
65 private static Thread[] m_workerThreads = null; 72 private static Thread[] m_workerThreads = null;
66 73
67 private static OpenMetaverse.BlockingQueue<PollServiceInventoryEventArgs> m_queue = 74 private static OpenMetaverse.BlockingQueue<aPollRequest> m_queue =
68 new OpenMetaverse.BlockingQueue<PollServiceInventoryEventArgs>(); 75 new OpenMetaverse.BlockingQueue<aPollRequest>();
69 76
70 #region ISharedRegionModule Members 77 #region ISharedRegionModule Members
71 78
@@ -131,18 +138,16 @@ namespace OpenSim.Region.ClientStack.Linden
131 ~WebFetchInvDescModule() 138 ~WebFetchInvDescModule()
132 { 139 {
133 foreach (Thread t in m_workerThreads) 140 foreach (Thread t in m_workerThreads)
134 t.Abort(); 141 Watchdog.AbortThread(t.ManagedThreadId);
135 } 142 }
136 143
137 private class PollServiceInventoryEventArgs : PollServiceEventArgs 144 private class PollServiceInventoryEventArgs : PollServiceEventArgs
138 { 145 {
139 private List<Hashtable> requests =
140 new List<Hashtable>();
141 private Dictionary<UUID, Hashtable> responses = 146 private Dictionary<UUID, Hashtable> responses =
142 new Dictionary<UUID, Hashtable>(); 147 new Dictionary<UUID, Hashtable>();
143 148
144 public PollServiceInventoryEventArgs(UUID pId) : 149 public PollServiceInventoryEventArgs(UUID pId) :
145 base(null, null, null, null, pId, 30000) 150 base(null, null, null, null, pId, int.MaxValue)
146 { 151 {
147 HasEvents = (x, y) => { lock (responses) return responses.ContainsKey(x); }; 152 HasEvents = (x, y) => { lock (responses) return responses.ContainsKey(x); };
148 GetEvents = (x, y, s) => 153 GetEvents = (x, y, s) =>
@@ -162,21 +167,23 @@ namespace OpenSim.Region.ClientStack.Linden
162 167
163 Request = (x, y) => 168 Request = (x, y) =>
164 { 169 {
165 y["RequestID"] = x.ToString(); 170 aPollRequest reqinfo = new aPollRequest();
166 lock (requests) 171 reqinfo.thepoll = this;
167 requests.Add(y); 172 reqinfo.reqID = x;
173 reqinfo.request = y;
168 174
169 m_queue.Enqueue(this); 175 m_queue.Enqueue(reqinfo);
170 }; 176 };
171 177
172 NoEvents = (x, y) => 178 NoEvents = (x, y) =>
173 { 179 {
180/*
174 lock (requests) 181 lock (requests)
175 { 182 {
176 Hashtable request = requests.Find(id => id["RequestID"].ToString() == x.ToString()); 183 Hashtable request = requests.Find(id => id["RequestID"].ToString() == x.ToString());
177 requests.Remove(request); 184 requests.Remove(request);
178 } 185 }
179 186*/
180 Hashtable response = new Hashtable(); 187 Hashtable response = new Hashtable();
181 188
182 response["int_response_code"] = 500; 189 response["int_response_code"] = 500;
@@ -189,24 +196,9 @@ namespace OpenSim.Region.ClientStack.Linden
189 }; 196 };
190 } 197 }
191 198
192 public void Process() 199 public void Process(aPollRequest requestinfo)
193 { 200 {
194 Hashtable request = null; 201 UUID requestID = requestinfo.reqID;
195
196 try
197 {
198 lock (requests)
199 {
200 request = requests[0];
201 requests.RemoveAt(0);
202 }
203 }
204 catch
205 {
206 return;
207 }
208
209 UUID requestID = new UUID(request["RequestID"].ToString());
210 202
211 Hashtable response = new Hashtable(); 203 Hashtable response = new Hashtable();
212 204
@@ -215,7 +207,8 @@ namespace OpenSim.Region.ClientStack.Linden
215 response["keepalive"] = false; 207 response["keepalive"] = false;
216 response["reusecontext"] = false; 208 response["reusecontext"] = false;
217 209
218 response["str_response_string"] = m_webFetchHandler.FetchInventoryDescendentsRequest(request["body"].ToString(), String.Empty, String.Empty, null, null); 210 response["str_response_string"] = m_webFetchHandler.FetchInventoryDescendentsRequest(
211 requestinfo.request["body"].ToString(), String.Empty, String.Empty, null, null);
219 212
220 lock (responses) 213 lock (responses)
221 responses[requestID] = response; 214 responses[requestID] = response;
@@ -226,8 +219,7 @@ namespace OpenSim.Region.ClientStack.Linden
226 { 219 {
227 string capUrl = "/CAPS/" + UUID.Random() + "/"; 220 string capUrl = "/CAPS/" + UUID.Random() + "/";
228 221
229 // Register this as a poll service 222 // Register this as a poll service
230 // absurd large timeout to tune later to make a bit less than viewer
231 PollServiceInventoryEventArgs args = new PollServiceInventoryEventArgs(agentID); 223 PollServiceInventoryEventArgs args = new PollServiceInventoryEventArgs(agentID);
232 224
233 args.Type = PollServiceEventArgs.EventType.Inventory; 225 args.Type = PollServiceEventArgs.EventType.Inventory;
@@ -263,9 +255,9 @@ namespace OpenSim.Region.ClientStack.Linden
263 { 255 {
264 while (true) 256 while (true)
265 { 257 {
266 PollServiceInventoryEventArgs args = m_queue.Dequeue(); 258 aPollRequest poolreq = m_queue.Dequeue();
267 259
268 args.Process(); 260 poolreq.thepoll.Process(poolreq);
269 } 261 }
270 } 262 }
271 } 263 }