diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs | 44 |
1 files changed, 27 insertions, 17 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs index b77ead3..e996fe8 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs | |||
@@ -60,11 +60,11 @@ namespace OpenSim.Region.ClientStack.Linden | |||
60 | 60 | ||
61 | private WebFetchInvDescHandler m_webFetchHandler; | 61 | private WebFetchInvDescHandler m_webFetchHandler; |
62 | 62 | ||
63 | private ManualResetEvent m_ev = new ManualResetEvent(true); | ||
64 | private object m_lock = new object(); | 63 | private object m_lock = new object(); |
65 | 64 | ||
66 | private Dictionary<UUID, string> m_capsDict = new Dictionary<UUID, string>(); | 65 | private Dictionary<UUID, string> m_capsDict = new Dictionary<UUID, string>(); |
67 | private Dictionary<UUID, Hashtable> m_requests = new Dictionary<UUID, Hashtable>(); | 66 | private Dictionary<UUID, Hashtable> m_requests = new Dictionary<UUID, Hashtable>(); |
67 | bool m_busy = false; | ||
68 | 68 | ||
69 | #region ISharedRegionModule Members | 69 | #region ISharedRegionModule Members |
70 | 70 | ||
@@ -116,7 +116,9 @@ namespace OpenSim.Region.ClientStack.Linden | |||
116 | string capUrl = "/CAPS/" + UUID.Random() + "/"; | 116 | string capUrl = "/CAPS/" + UUID.Random() + "/"; |
117 | 117 | ||
118 | // Register this as a poll service | 118 | // Register this as a poll service |
119 | // absurd large timeout to tune later to make a bit less than viewer | ||
119 | PollServiceEventArgs args = new PollServiceEventArgs(HttpRequestHandler, HasEvents, GetEvents, NoEvents, agentID, 300000); | 120 | PollServiceEventArgs args = new PollServiceEventArgs(HttpRequestHandler, HasEvents, GetEvents, NoEvents, agentID, 300000); |
121 | |||
120 | args.Type = PollServiceEventArgs.EventType.Inventory; | 122 | args.Type = PollServiceEventArgs.EventType.Inventory; |
121 | MainServer.Instance.AddPollServiceHTTPHandler(capUrl, args); | 123 | MainServer.Instance.AddPollServiceHTTPHandler(capUrl, args); |
122 | 124 | ||
@@ -133,6 +135,8 @@ namespace OpenSim.Region.ClientStack.Linden | |||
133 | caps.RegisterHandler("FetchInventoryDescendents2", String.Format("{0}://{1}:{2}{3}", protocol, hostName, port, capUrl)); | 135 | caps.RegisterHandler("FetchInventoryDescendents2", String.Format("{0}://{1}:{2}{3}", protocol, hostName, port, capUrl)); |
134 | 136 | ||
135 | m_capsDict[agentID] = capUrl; | 137 | m_capsDict[agentID] = capUrl; |
138 | |||
139 | m_busy = false; | ||
136 | } | 140 | } |
137 | 141 | ||
138 | private void DeregisterCaps(UUID agentID, Caps caps) | 142 | private void DeregisterCaps(UUID agentID, Caps caps) |
@@ -149,25 +153,22 @@ namespace OpenSim.Region.ClientStack.Linden | |||
149 | public void HttpRequestHandler(UUID requestID, Hashtable request) | 153 | public void HttpRequestHandler(UUID requestID, Hashtable request) |
150 | { | 154 | { |
151 | // m_log.DebugFormat("[FETCH2]: Received request {0}", requestID); | 155 | // m_log.DebugFormat("[FETCH2]: Received request {0}", requestID); |
152 | m_requests[requestID] = request; | 156 | lock(m_lock) |
157 | m_requests[requestID] = request; | ||
153 | } | 158 | } |
154 | 159 | ||
155 | private bool HasEvents(UUID requestID, UUID sessionID) | 160 | private bool HasEvents(UUID requestID, UUID sessionID) |
156 | { | 161 | { |
157 | lock (m_lock) | 162 | lock (m_lock) |
158 | { | 163 | { |
159 | if (m_ev.WaitOne(0)) | 164 | return !m_busy; |
160 | { | ||
161 | m_ev.Reset(); | ||
162 | return true; | ||
163 | } | ||
164 | return false; | ||
165 | } | 165 | } |
166 | } | 166 | } |
167 | 167 | ||
168 | private Hashtable NoEvents(UUID requestID, UUID sessionID) | 168 | private Hashtable NoEvents(UUID requestID, UUID sessionID) |
169 | { | 169 | { |
170 | m_requests.Remove(requestID); | 170 | lock(m_lock) |
171 | m_requests.Remove(requestID); | ||
171 | 172 | ||
172 | Hashtable response = new Hashtable(); | 173 | Hashtable response = new Hashtable(); |
173 | 174 | ||
@@ -177,11 +178,17 @@ namespace OpenSim.Region.ClientStack.Linden | |||
177 | response["keepalive"] = false; | 178 | response["keepalive"] = false; |
178 | response["reusecontext"] = false; | 179 | response["reusecontext"] = false; |
179 | 180 | ||
181 | lock (m_lock) | ||
182 | m_busy = false; | ||
183 | |||
180 | return response; | 184 | return response; |
181 | } | 185 | } |
182 | 186 | ||
183 | private Hashtable GetEvents(UUID requestID, UUID sessionID, string request) | 187 | private Hashtable GetEvents(UUID requestID, UUID sessionID, string request) |
184 | { | 188 | { |
189 | lock (m_lock) | ||
190 | m_busy = true; | ||
191 | |||
185 | Hashtable response = new Hashtable(); | 192 | Hashtable response = new Hashtable(); |
186 | 193 | ||
187 | response["int_response_code"] = 500; | 194 | response["int_response_code"] = 500; |
@@ -192,20 +199,23 @@ namespace OpenSim.Region.ClientStack.Linden | |||
192 | 199 | ||
193 | try | 200 | try |
194 | { | 201 | { |
202 | |||
195 | Hashtable requestHash; | 203 | Hashtable requestHash; |
196 | if (!m_requests.TryGetValue(requestID, out requestHash)) | 204 | lock (m_lock) |
197 | { | 205 | { |
198 | lock (m_lock) | 206 | if (!m_requests.TryGetValue(requestID, out requestHash)) |
199 | m_ev.Set(); | 207 | { |
200 | response["str_response_string"] = "Invalid request"; | 208 | m_busy = false; |
201 | return response; | 209 | response["str_response_string"] = "Invalid request"; |
210 | return response; | ||
211 | } | ||
212 | m_requests.Remove(requestID); | ||
202 | } | 213 | } |
203 | 214 | ||
204 | // m_log.DebugFormat("[FETCH2]: Processed request {0}", requestID); | 215 | // m_log.DebugFormat("[FETCH2]: Processed request {0}", requestID); |
205 | 216 | ||
206 | string reply = m_webFetchHandler.FetchInventoryDescendentsRequest(requestHash["body"].ToString(), String.Empty, String.Empty, null, null); | 217 | string reply = m_webFetchHandler.FetchInventoryDescendentsRequest(requestHash["body"].ToString(), String.Empty, String.Empty, null, null); |
207 | 218 | ||
208 | m_requests.Remove(requestID); | ||
209 | 219 | ||
210 | response["int_response_code"] = 200; | 220 | response["int_response_code"] = 200; |
211 | response["str_response_string"] = reply; | 221 | response["str_response_string"] = reply; |
@@ -213,7 +223,7 @@ namespace OpenSim.Region.ClientStack.Linden | |||
213 | finally | 223 | finally |
214 | { | 224 | { |
215 | lock (m_lock) | 225 | lock (m_lock) |
216 | m_ev.Set(); | 226 | m_busy = false; |
217 | } | 227 | } |
218 | 228 | ||
219 | return response; | 229 | return response; |