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.

This commit is contained in:
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.Generic;
using System.Reflection;
using System.Threading;
using log4net;
using Nini.Config;
using Nwc.XmlRpc;
@@ -856,7 +857,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
IClientAPI friendClient = LocateClientObject(friendID);
if (friendClient != null)
{
// the friend in this sim as root agent
// the friend in this sim as root agent
if (online)
friendClient.SendAgentOnline(new UUID[] { userID });
else
@@ -913,6 +914,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
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;
lock (m_Friends)
{

View File

@@ -212,10 +212,15 @@ namespace OpenSim.Region.Framework.Scenes
public delegate void OnMakeChildAgentDelegate(ScenePresence presence);
public event OnMakeChildAgentDelegate OnMakeChildAgent;
public delegate void OnMakeRootAgentDelegate(ScenePresence presence);
public delegate void OnSaveNewWindlightProfileDelegate();
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 OnSaveNewWindlightProfileDelegate OnSaveNewWindlightProfile;
@@ -1322,10 +1327,10 @@ namespace OpenSim.Region.Framework.Scenes
public void TriggerOnMakeRootAgent(ScenePresence presence)
{
OnMakeRootAgentDelegate handlerMakeRootAgent = OnMakeRootAgent;
Action<ScenePresence> handlerMakeRootAgent = OnMakeRootAgent;
if (handlerMakeRootAgent != null)
{
foreach (OnMakeRootAgentDelegate d in handlerMakeRootAgent.GetInvocationList())
foreach (Action<ScenePresence> d in handlerMakeRootAgent.GetInvocationList())
{
try
{

View File

@@ -865,6 +865,9 @@ namespace OpenSim.Region.Framework.Scenes
/// 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,
/// 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>
public void MakeRootAgent(Vector3 pos, bool isFlying)
{