From f4fa8919285a4399ebe909aee50285d91f6cd5fe Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Wed, 27 Jul 2016 02:54:32 +0100 Subject: [PATCH] waste another thread job on another thing that should be part of a more unified service, and also not hidding on a so called event" --- .../EntityTransfer/EntityTransferModule.cs | 99 +++++++++---------- .../Presence/PresenceDetector.cs | 16 +++ 2 files changed, 64 insertions(+), 51 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index a14fb25fbd..a1ad9104e1 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -2080,66 +2080,63 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer sp.KnownRegions = seeds; sp.SetNeighbourRegionSizeInfo(neighbours); - AgentPosition agentpos = new AgentPosition(); - agentpos.AgentID = new UUID(sp.UUID.Guid); - agentpos.SessionID = spClient.SessionId; - agentpos.Size = sp.Appearance.AvatarSize; - agentpos.Center = sp.CameraPosition; - agentpos.Far = sp.DrawDistance; - agentpos.Position = sp.AbsolutePosition; - agentpos.Velocity = sp.Velocity; - agentpos.RegionHandle = currentRegionHandler; - agentpos.Throttles = spClient.GetThrottlesPacked(1); - // agentpos.ChildrenCapSeeds = seeds; - - Util.FireAndForget(delegate + if(newneighbours.Count > 0 || previousRegionNeighbourHandles.Count > 0) { - Thread.Sleep(200); // the original delay that was at InformClientOfNeighbourAsync start - int count = 0; + AgentPosition agentpos = new AgentPosition(); + agentpos.AgentID = new UUID(sp.UUID.Guid); + agentpos.SessionID = spClient.SessionId; + agentpos.Size = sp.Appearance.AvatarSize; + agentpos.Center = sp.CameraPosition; + agentpos.Far = sp.DrawDistance; + agentpos.Position = sp.AbsolutePosition; + agentpos.Velocity = sp.Velocity; + agentpos.RegionHandle = currentRegionHandler; + agentpos.Throttles = spClient.GetThrottlesPacked(1); + // agentpos.ChildrenCapSeeds = seeds; - foreach (GridRegion neighbour in neighbours) + Util.FireAndForget(delegate { - ulong handler = neighbour.RegionHandle; - try + Thread.Sleep(200); // the original delay that was at InformClientOfNeighbourAsync start + int count = 0; + + foreach (GridRegion neighbour in neighbours) { - if (newneighbours.Contains(handler)) + ulong handler = neighbour.RegionHandle; + try { - InformClientOfNeighbourAsync(sp, cagents[count], neighbour, - neighbour.ExternalEndPoint, true); - count++; + if (newneighbours.Contains(handler)) + { + InformClientOfNeighbourAsync(sp, cagents[count], neighbour, + neighbour.ExternalEndPoint, true); + count++; + } + else if (!previousRegionNeighbourHandles.Contains(handler)) + { + spScene.SimulationService.UpdateAgent(neighbour, agentpos); + } } - else if (!previousRegionNeighbourHandles.Contains(handler)) + catch (ArgumentOutOfRangeException) { - spScene.SimulationService.UpdateAgent(neighbour, agentpos); + m_log.ErrorFormat( + "[ENTITY TRANSFER MODULE]: Neighbour Regions response included the current region in the neighbour list. The following region will not display to the client: {0} for region {1} ({2}, {3}).", + neighbour.ExternalHostName, + neighbour.RegionHandle, + neighbour.RegionLocX, + neighbour.RegionLocY); + } + catch (Exception e) + { + m_log.ErrorFormat( + "[ENTITY TRANSFER MODULE]: Could not resolve external hostname {0} for region {1} ({2}, {3}). {4}", + neighbour.ExternalHostName, + neighbour.RegionHandle, + neighbour.RegionLocX, + neighbour.RegionLocY, + e); } } - catch (ArgumentOutOfRangeException) - { - m_log.ErrorFormat( - "[ENTITY TRANSFER MODULE]: Neighbour Regions response included the current region in the neighbour list. The following region will not display to the client: {0} for region {1} ({2}, {3}).", - neighbour.ExternalHostName, - neighbour.RegionHandle, - neighbour.RegionLocX, - neighbour.RegionLocY); - } - catch (Exception e) - { - m_log.ErrorFormat( - "[ENTITY TRANSFER MODULE]: Could not resolve external hostname {0} for region {1} ({2}, {3}). {4}", - neighbour.ExternalHostName, - neighbour.RegionHandle, - neighbour.RegionLocX, - neighbour.RegionLocY, - e); - - // FIXME: Okay, even though we've failed, we're still going to throw the exception on, - // since I don't know what will happen if we just let the client continue - - // XXX: Well, decided to swallow the exception instead for now. Let us see how that goes. - // throw e; - } - } - }); + }); + } } // Computes the difference between two region bases. diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/PresenceDetector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/PresenceDetector.cs index 50c252c817..117f02c1c2 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/PresenceDetector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Presence/PresenceDetector.cs @@ -68,6 +68,22 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Presence public void OnMakeRootAgent(ScenePresence sp) { + if (sp.isNPC) + return; + + if(sp.gotCrossUpdate) + { + Util.FireAndForget(delegate + { + DoOnMakeRootAgent(sp); + }, null, "PresenceDetector_MakeRoot"); + } + else + DoOnMakeRootAgent(sp); + } + + public void DoOnMakeRootAgent(ScenePresence sp) + { // m_log.DebugFormat("[PRESENCE DETECTOR]: Detected root presence {0} in {1}", sp.UUID, sp.Scene.RegionInfo.RegionName); if (sp.PresenceType != PresenceType.Npc) m_PresenceService.ReportAgent(sp.ControllingClient.SessionId, sp.Scene.RegionInfo.RegionID);