diff options
author | Teravus Ovares | 2008-05-29 23:36:37 +0000 |
---|---|---|
committer | Teravus Ovares | 2008-05-29 23:36:37 +0000 |
commit | 9cefda83d6d54edc9ed1587bb71e9cb8fb2d17d5 (patch) | |
tree | c0ae17b8dac06e2616532fea2ac4e2bfcb59f4b6 /OpenSim | |
parent | * Fixes a few taper/top-sheer situations that were previously having issues. (diff) | |
download | opensim-SC-9cefda83d6d54edc9ed1587bb71e9cb8fb2d17d5.zip opensim-SC-9cefda83d6d54edc9ed1587bb71e9cb8fb2d17d5.tar.gz opensim-SC-9cefda83d6d54edc9ed1587bb71e9cb8fb2d17d5.tar.bz2 opensim-SC-9cefda83d6d54edc9ed1587bb71e9cb8fb2d17d5.tar.xz |
* Caches UUIDName requests
* Looks up UUIDNames for script time and colliders in a separate thread.
* Hopefully this'll allow you to look at top scripts on a region that has a lot of scripts without crashing your client thread.
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Framework/Communications/CommunicationsManager.cs | 61 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Modules/World/Estate/EstateManagementModule.cs | 48 |
2 files changed, 98 insertions, 11 deletions
diff --git a/OpenSim/Framework/Communications/CommunicationsManager.cs b/OpenSim/Framework/Communications/CommunicationsManager.cs index 37020f6..cc64e6c 100644 --- a/OpenSim/Framework/Communications/CommunicationsManager.cs +++ b/OpenSim/Framework/Communications/CommunicationsManager.cs | |||
@@ -41,6 +41,7 @@ namespace OpenSim.Framework.Communications | |||
41 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 41 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
42 | 42 | ||
43 | protected IUserService m_userService; | 43 | protected IUserService m_userService; |
44 | protected Dictionary<LLUUID, string[]> m_nameRequestCache = new Dictionary<LLUUID, string[]>(); | ||
44 | 45 | ||
45 | public IUserService UserService | 46 | public IUserService UserService |
46 | { | 47 | { |
@@ -248,27 +249,69 @@ namespace OpenSim.Framework.Communications | |||
248 | } | 249 | } |
249 | else | 250 | else |
250 | { | 251 | { |
252 | string[] names = doUUIDNameRequest(uuid); | ||
253 | if (names.Length == 2) | ||
254 | { | ||
255 | remote_client.SendNameReply(uuid, names[0], names[1]); | ||
256 | } | ||
257 | |||
258 | } | ||
259 | } | ||
260 | |||
261 | private string[] doUUIDNameRequest(LLUUID uuid) | ||
262 | { | ||
263 | string[] returnstring = new string[0]; | ||
264 | bool doLookup = false; | ||
265 | |||
266 | |||
267 | lock (m_nameRequestCache) | ||
268 | { | ||
269 | if (m_nameRequestCache.ContainsKey(uuid)) | ||
270 | { | ||
271 | returnstring = m_nameRequestCache[uuid]; | ||
272 | } | ||
273 | else | ||
274 | { | ||
275 | // we don't want to lock the dictionary while we're doing the lookup | ||
276 | doLookup = true; | ||
277 | } | ||
278 | } | ||
279 | |||
280 | if (doLookup) { | ||
251 | UserProfileData profileData = m_userService.GetUserProfile(uuid); | 281 | UserProfileData profileData = m_userService.GetUserProfile(uuid); |
252 | if (profileData != null) | 282 | if (profileData != null) |
253 | { | 283 | { |
284 | returnstring = new string[2]; | ||
254 | LLUUID profileId = profileData.ID; | 285 | LLUUID profileId = profileData.ID; |
255 | string firstname = profileData.FirstName; | 286 | returnstring[0] = profileData.FirstName; |
256 | string lastname = profileData.SurName; | 287 | returnstring[1] = profileData.SurName; |
257 | 288 | lock (m_nameRequestCache) | |
258 | remote_client.SendNameReply(profileId, firstname, lastname); | 289 | { |
290 | if (!m_nameRequestCache.ContainsKey(uuid)) | ||
291 | m_nameRequestCache.Add(uuid, returnstring); | ||
292 | } | ||
259 | } | 293 | } |
260 | } | 294 | } |
295 | return returnstring; | ||
296 | |||
261 | } | 297 | } |
298 | |||
299 | public bool UUIDNameCachedTest(LLUUID uuid) | ||
300 | { | ||
301 | lock (m_nameRequestCache) | ||
302 | return m_nameRequestCache.ContainsKey(uuid); | ||
303 | } | ||
304 | |||
262 | public string UUIDNameRequestString(LLUUID uuid) | 305 | public string UUIDNameRequestString(LLUUID uuid) |
263 | { | 306 | { |
264 | UserProfileData profileData = m_userService.GetUserProfile(uuid); | 307 | string[] names = doUUIDNameRequest(uuid); |
265 | if (profileData != null) | 308 | if (names.Length == 2) |
266 | { | 309 | { |
267 | //LLUUID profileId = profileData.ID; | 310 | string firstname = names[0]; |
268 | string firstname = profileData.FirstName; | 311 | string lastname = names[1]; |
269 | string lastname = profileData.SurName; | ||
270 | 312 | ||
271 | return firstname + " " + lastname; | 313 | return firstname + " " + lastname; |
314 | |||
272 | } | 315 | } |
273 | return "(hippos)"; | 316 | return "(hippos)"; |
274 | } | 317 | } |
diff --git a/OpenSim/Region/Environment/Modules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/Environment/Modules/World/Estate/EstateManagementModule.cs index ab5898d..6c63c36 100644 --- a/OpenSim/Region/Environment/Modules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/Environment/Modules/World/Estate/EstateManagementModule.cs | |||
@@ -24,7 +24,8 @@ | |||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | 24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | */ | 26 | */ |
27 | 27 | using System; | |
28 | using System.Threading; | ||
28 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
29 | using System.Reflection; | 30 | using System.Reflection; |
30 | using libsecondlife; | 31 | using libsecondlife; |
@@ -40,6 +41,8 @@ namespace OpenSim.Region.Environment.Modules.World.Estate | |||
40 | { | 41 | { |
41 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 42 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
42 | 43 | ||
44 | private delegate void LookupUUIDS(List<LLUUID> uuidLst); | ||
45 | |||
43 | private Scene m_scene; | 46 | private Scene m_scene; |
44 | 47 | ||
45 | #region Packet Data Responders | 48 | #region Packet Data Responders |
@@ -314,6 +317,7 @@ namespace OpenSim.Region.Environment.Modules.World.Estate | |||
314 | private void HandleLandStatRequest(int parcelID, uint reportType, uint requestFlags, string filter, IClientAPI remoteClient) | 317 | private void HandleLandStatRequest(int parcelID, uint reportType, uint requestFlags, string filter, IClientAPI remoteClient) |
315 | { | 318 | { |
316 | Dictionary<uint, float> SceneData = new Dictionary<uint,float>(); | 319 | Dictionary<uint, float> SceneData = new Dictionary<uint,float>(); |
320 | List<LLUUID> uuidNameLookupList = new List<LLUUID>(); | ||
317 | 321 | ||
318 | if (reportType == 1) | 322 | if (reportType == 1) |
319 | { | 323 | { |
@@ -345,7 +349,17 @@ namespace OpenSim.Region.Environment.Modules.World.Estate | |||
345 | lsri.TaskID = sog.UUID; | 349 | lsri.TaskID = sog.UUID; |
346 | lsri.TaskLocalID = sog.LocalId; | 350 | lsri.TaskLocalID = sog.LocalId; |
347 | lsri.TaskName = sog.GetPartName(obj); | 351 | lsri.TaskName = sog.GetPartName(obj); |
348 | lsri.OwnerName = m_scene.CommsManager.UUIDNameRequestString(sog.OwnerID); | 352 | if (m_scene.CommsManager.UUIDNameCachedTest(sog.OwnerID)) |
353 | { | ||
354 | lsri.OwnerName = m_scene.CommsManager.UUIDNameRequestString(sog.OwnerID); | ||
355 | } | ||
356 | else | ||
357 | { | ||
358 | lsri.OwnerName = "waiting"; | ||
359 | lock(uuidNameLookupList) | ||
360 | uuidNameLookupList.Add(sog.OwnerID); | ||
361 | } | ||
362 | |||
349 | if (filter.Length != 0) | 363 | if (filter.Length != 0) |
350 | { | 364 | { |
351 | if ((lsri.OwnerName.Contains(filter) || lsri.TaskName.Contains(filter))) | 365 | if ((lsri.OwnerName.Contains(filter) || lsri.TaskName.Contains(filter))) |
@@ -365,9 +379,39 @@ namespace OpenSim.Region.Environment.Modules.World.Estate | |||
365 | } | 379 | } |
366 | } | 380 | } |
367 | remoteClient.SendLandStatReply(reportType, requestFlags, (uint)SceneReport.Count,SceneReport.ToArray()); | 381 | remoteClient.SendLandStatReply(reportType, requestFlags, (uint)SceneReport.Count,SceneReport.ToArray()); |
382 | |||
383 | if (uuidNameLookupList.Count > 0) | ||
384 | LookupUUID(uuidNameLookupList); | ||
385 | } | ||
386 | |||
387 | private void LookupUUIDSCompleted(IAsyncResult iar) | ||
388 | { | ||
389 | LookupUUIDS icon = (LookupUUIDS)iar.AsyncState; | ||
390 | icon.EndInvoke(iar); | ||
391 | } | ||
392 | private void LookupUUID(List<LLUUID> uuidLst) | ||
393 | { | ||
394 | LookupUUIDS d = LookupUUIDsAsync; | ||
368 | 395 | ||
396 | d.BeginInvoke(uuidLst, | ||
397 | LookupUUIDSCompleted, | ||
398 | d); | ||
369 | } | 399 | } |
400 | private void LookupUUIDsAsync(List<LLUUID> uuidLst) | ||
401 | { | ||
402 | LLUUID[] uuidarr = new LLUUID[0]; | ||
403 | |||
404 | lock (uuidLst) | ||
405 | { | ||
406 | uuidarr = uuidLst.ToArray(); | ||
407 | } | ||
370 | 408 | ||
409 | for (int i = 0; i < uuidarr.Length; i++) | ||
410 | { | ||
411 | string lookupname = m_scene.CommsManager.UUIDNameRequestString(uuidarr[i]); | ||
412 | // we drop it. It gets cached though... so we're ready for the next request. | ||
413 | } | ||
414 | } | ||
371 | #endregion | 415 | #endregion |
372 | 416 | ||
373 | #region Outgoing Packets | 417 | #region Outgoing Packets |