Add comments about trying to avoid synchronous work off the EventManager.OnMakeRootAgent event since this is on the critical path for transfer of avatars from one region to another.

iar_mods
Justin Clark-Casey (justincc) 2011-11-15 20:26:42 +00:00
parent e16d7fe1da
commit 828e4a5b09
3 changed files with 16 additions and 5 deletions

View File

@ -29,6 +29,7 @@ using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection; using System.Reflection;
using System.Threading;
using log4net; using log4net;
using Nini.Config; using Nini.Config;
using Nwc.XmlRpc; using Nwc.XmlRpc;
@ -856,7 +857,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
IClientAPI friendClient = LocateClientObject(friendID); IClientAPI friendClient = LocateClientObject(friendID);
if (friendClient != null) if (friendClient != null)
{ {
// the friend in this sim as root agent // the friend in this sim as root agent
if (online) if (online)
friendClient.SendAgentOnline(new UUID[] { userID }); friendClient.SendAgentOnline(new UUID[] { userID });
else else
@ -913,6 +914,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
private void RecacheFriends(IClientAPI client) private void RecacheFriends(IClientAPI client)
{ {
// FIXME: Ideally, we want to avoid doing this here since it sits the EventManager.OnMakeRootAgent event
// is on the critical path for transferring an avatar from one region to another.
UUID agentID = client.AgentId; UUID agentID = client.AgentId;
lock (m_Friends) lock (m_Friends)
{ {

View File

@ -212,10 +212,15 @@ namespace OpenSim.Region.Framework.Scenes
public delegate void OnMakeChildAgentDelegate(ScenePresence presence); public delegate void OnMakeChildAgentDelegate(ScenePresence presence);
public event OnMakeChildAgentDelegate OnMakeChildAgent; public event OnMakeChildAgentDelegate OnMakeChildAgent;
public delegate void OnMakeRootAgentDelegate(ScenePresence presence);
public delegate void OnSaveNewWindlightProfileDelegate(); public delegate void OnSaveNewWindlightProfileDelegate();
public delegate void OnSendNewWindlightProfileTargetedDelegate(RegionLightShareData wl, UUID user); public delegate void OnSendNewWindlightProfileTargetedDelegate(RegionLightShareData wl, UUID user);
public event OnMakeRootAgentDelegate OnMakeRootAgent;
/// <summary>
/// This event is on the critical path for transferring an avatar from one region to another. Try and do
/// as little work on this event as possible, or do work asynchronously.
/// </summary>
public event Action<ScenePresence> OnMakeRootAgent;
public event OnSendNewWindlightProfileTargetedDelegate OnSendNewWindlightProfileTargeted; public event OnSendNewWindlightProfileTargetedDelegate OnSendNewWindlightProfileTargeted;
public event OnSaveNewWindlightProfileDelegate OnSaveNewWindlightProfile; public event OnSaveNewWindlightProfileDelegate OnSaveNewWindlightProfile;
@ -1322,10 +1327,10 @@ namespace OpenSim.Region.Framework.Scenes
public void TriggerOnMakeRootAgent(ScenePresence presence) public void TriggerOnMakeRootAgent(ScenePresence presence)
{ {
OnMakeRootAgentDelegate handlerMakeRootAgent = OnMakeRootAgent; Action<ScenePresence> handlerMakeRootAgent = OnMakeRootAgent;
if (handlerMakeRootAgent != null) if (handlerMakeRootAgent != null)
{ {
foreach (OnMakeRootAgentDelegate d in handlerMakeRootAgent.GetInvocationList()) foreach (Action<ScenePresence> d in handlerMakeRootAgent.GetInvocationList())
{ {
try try
{ {

View File

@ -865,6 +865,9 @@ namespace OpenSim.Region.Framework.Scenes
/// avatar is actual in the sim. They can perform all actions. /// avatar is actual in the sim. They can perform all actions.
/// This change is made whenever an avatar enters a region, whether by crossing over from a neighbouring sim, /// This change is made whenever an avatar enters a region, whether by crossing over from a neighbouring sim,
/// teleporting in or on initial login. /// teleporting in or on initial login.
///
/// This method is on the critical path for transferring an avatar from one region to another. Delay here
/// delays that crossing.
/// </summary> /// </summary>
public void MakeRootAgent(Vector3 pos, bool isFlying) public void MakeRootAgent(Vector3 pos, bool isFlying)
{ {