diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index 64ee7e44b8..d34a8f63d7 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -567,10 +567,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
m_scene.InventoryService.UpdateItem(item);
- // this gets called when the agent logs off!
+ // If the name of the object has been changed whilst attached then we want to update the inventory
+ // item in the viewer.
if (sp.ControllingClient != null)
sp.ControllingClient.SendInventoryItemCreateUpdate(item, 0);
}
+
grp.HasGroupChanged = false; // Prevent it being saved over and over
}
// else
diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs
index 0dad3c4147..596174b3cd 100644
--- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/MessageTransferModule.cs
@@ -137,13 +137,15 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
foreach (Scene scene in m_Scenes)
{
// m_log.DebugFormat(
-// "[INSTANT MESSAGE]: Looking for root agent {0} in {1}",
+// "[INSTANT MESSAGE]: Looking for root agent {0} in {1}",
// toAgentID.ToString(), scene.RegionInfo.RegionName);
+
ScenePresence sp = scene.GetScenePresence(toAgentID);
if (sp != null && !sp.IsChildAgent)
{
// Local message
-// m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to root agent {0} {1}", user.Name, toAgentID);
+ m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to root agent {0} {1}", sp.Name, toAgentID);
+
sp.ControllingClient.SendInstantMessage(im);
// Message sent
@@ -155,13 +157,15 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
// try child avatar second
foreach (Scene scene in m_Scenes)
{
-// m_log.DebugFormat(
-// "[INSTANT MESSAGE]: Looking for child of {0} in {1}", toAgentID, scene.RegionInfo.RegionName);
+ m_log.DebugFormat(
+ "[INSTANT MESSAGE]: Looking for child of {0} in {1}", toAgentID, scene.RegionInfo.RegionName);
+
ScenePresence sp = scene.GetScenePresence(toAgentID);
if (sp != null)
{
// Local message
-// m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to child agent {0} {1}", user.Name, toAgentID);
+ m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to child agent {0} {1}", sp.Name, toAgentID);
+
sp.ControllingClient.SendInstantMessage(im);
// Message sent
@@ -170,10 +174,9 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
}
}
-// m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to {0} via XMLRPC", im.toAgentID);
- SendGridInstantMessageViaXMLRPC(im, result);
+ m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to {0} via XMLRPC", im.toAgentID);
- return;
+ SendGridInstantMessageViaXMLRPC(im, result);
}
private void HandleUndeliveredMessage(GridInstantMessage im, MessageResultNotification result)
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs
index 19c774f7c6..f3af59ab2a 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs
@@ -297,7 +297,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
});
}
}
- else if (im.dialog == (byte) InstantMessageDialog.InventoryDeclined)
+ else if (
+ im.dialog == (byte)InstantMessageDialog.InventoryDeclined
+ || im.dialog == (byte)InstantMessageDialog.TaskInventoryDeclined)
{
// Here, the recipient is local and we can assume that the
// inventory is loaded. Courtesy of the above bulk update,
diff --git a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
index 42dbedcd56..143af48d99 100644
--- a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
@@ -77,8 +77,6 @@ namespace OpenSim.Region.Framework.Interfaces
/// The item ID of the script.
bool GetScriptState(UUID itemID);
- void SetRunEnable(UUID instanceID, bool enable);
-
void SaveAllState();
///
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 9ff8467086..e4132817ac 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -2143,24 +2143,10 @@ namespace OpenSim.Region.Framework.Scenes
if (part == null)
return;
- IScriptModule[] engines = RequestModuleInterfaces();
-
if (running)
- {
- foreach (IScriptModule engine in engines)
- {
- engine.SetRunEnable(itemID, true);
- }
EventManager.TriggerStartScript(part.LocalId, itemID);
- }
else
- {
- foreach (IScriptModule engine in engines)
- {
- engine.SetRunEnable(itemID, false);
- }
EventManager.TriggerStopScript(part.LocalId, itemID);
- }
}
public void GetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID)
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 3e9583cb43..de2b19289d 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -3317,24 +3317,30 @@ namespace OpenSim.Region.Framework.Scenes
if (AgentTransactionsModule != null)
AgentTransactionsModule.RemoveAgentAssetTransactions(agentID);
- avatar.Close();
-
m_authenticateHandler.RemoveCircuit(avatar.ControllingClient.CircuitCode);
}
catch (Exception e)
{
m_log.Error(
- string.Format("[SCENE]: Exception removing {0} from {1}, ", avatar.Name, RegionInfo.RegionName), e);
+ string.Format("[SCENE]: Exception removing {0} from {1}. Cleaning up. Exception ", avatar.Name, Name), e);
}
finally
{
- // Always clean these structures up so that any failure above doesn't cause them to remain in the
- // scene with possibly bad effects (e.g. continually timing out on unacked packets and triggering
- // the same cleanup exception continually.
- // TODO: This should probably extend to the whole method, but we don't want to also catch the NRE
- // since this would hide the underlying failure and other associated problems.
- m_sceneGraph.RemoveScenePresence(agentID);
- m_clientManager.Remove(agentID);
+ try
+ {
+ // Always clean these structures up so that any failure above doesn't cause them to remain in the
+ // scene with possibly bad effects (e.g. continually timing out on unacked packets and triggering
+ // the same cleanup exception continually.
+ m_sceneGraph.RemoveScenePresence(agentID);
+ m_clientManager.Remove(agentID);
+
+ avatar.Close();
+ }
+ catch (Exception e)
+ {
+ m_log.Error(
+ string.Format("[SCENE]: Exception in final clean up of {0} in {1}. Exception ", avatar.Name, Name), e);
+ }
}
//m_log.InfoFormat("[SCENE] Memory pre GC {0}", System.GC.GetTotalMemory(false));
diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
index ec13b6cc01..b04f6b6624 100644
--- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
@@ -63,16 +63,6 @@ namespace OpenSim.Region.ScriptEngine.Interfaces
///
bool Running { get; set; }
- ///
- /// Gets or sets a value indicating whether this
- /// is run.
- /// For viewer script editor control
- ///
- ///
- /// true if run; otherwise, false.
- ///
- bool Run { get; set; }
-
///
/// Is the script suspended?
///
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index f88338d3c6..084bd41bf1 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -3973,23 +3973,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (agentItem == null)
return;
- byte[] bucket = new byte[17];
- bucket[0] = (byte)item.Type;
- byte[] objBytes = agentItem.ID.GetBytes();
- Array.Copy(objBytes, 0, bucket, 1, 16);
-
- GridInstantMessage msg = new GridInstantMessage(World,
- m_host.UUID, m_host.Name + ", an object owned by " +
- resolveName(m_host.OwnerID) + ",", destId,
- (byte)InstantMessageDialog.TaskInventoryOffered,
- false, item.Name + "\n" + m_host.Name + " is located at " +
- World.RegionInfo.RegionName+" "+
- m_host.AbsolutePosition.ToString(),
- agentItem.ID, true, m_host.AbsolutePosition,
- bucket);
-
if (m_TransferModule != null)
+ {
+ byte[] bucket = new byte[] { (byte)item.Type };
+
+ GridInstantMessage msg = new GridInstantMessage(World,
+ m_host.UUID, m_host.Name + ", an object owned by " +
+ resolveName(m_host.OwnerID) + ",", destId,
+ (byte)InstantMessageDialog.TaskInventoryOffered,
+ false, item.Name + "\n" + m_host.Name + " is located at " +
+ World.RegionInfo.RegionName+" "+
+ m_host.AbsolutePosition.ToString(),
+ agentItem.ID, true, m_host.AbsolutePosition,
+ bucket);
+
m_TransferModule.SendInstantMessage(msg, delegate(bool success) {});
+ }
ScriptSleep(3000);
}
@@ -6397,23 +6396,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (folderID == UUID.Zero)
return;
- byte[] bucket = new byte[17];
- bucket[0] = (byte)AssetType.Folder;
- byte[] objBytes = folderID.GetBytes();
- Array.Copy(objBytes, 0, bucket, 1, 16);
-
- GridInstantMessage msg = new GridInstantMessage(World,
- m_host.UUID, m_host.Name + ", an object owned by " +
- resolveName(m_host.OwnerID) + ",", destID,
- (byte)InstantMessageDialog.InventoryOffered,
- false, category + "\n" + m_host.Name + " is located at " +
- World.RegionInfo.RegionName + " " +
- m_host.AbsolutePosition.ToString(),
- folderID, true, m_host.AbsolutePosition,
- bucket);
-
if (m_TransferModule != null)
+ {
+ byte[] bucket = new byte[] { (byte)AssetType.Folder };
+
+ GridInstantMessage msg = new GridInstantMessage(World,
+ m_host.UUID, m_host.Name + ", an object owned by " +
+ resolveName(m_host.OwnerID) + ",", destID,
+ (byte)InstantMessageDialog.TaskInventoryOffered,
+ false, category + "\n" + m_host.Name + " is located at " +
+ World.RegionInfo.RegionName + " " +
+ m_host.AbsolutePosition.ToString(),
+ folderID, true, m_host.AbsolutePosition,
+ bucket);
+
m_TransferModule.SendInstantMessage(msg, delegate(bool success) {});
+ }
}
public void llSetVehicleType(int type)
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 3654106427..413739776f 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -1664,9 +1664,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
CheckThreatLevel(ThreatLevel.Low, "osMessageObject");
m_host.AddScriptLPS(1);
+ UUID objUUID;
+ if (!UUID.TryParse(objectUUID, out objUUID)) // prior to patching, a thrown exception regarding invalid GUID format would be shouted instead.
+ {
+ OSSLShoutError("osMessageObject() cannot send messages to objects with invalid UUIDs");
+ return;
+ }
+
object[] resobj = new object[] { new LSL_Types.LSLString(m_host.UUID.ToString()), new LSL_Types.LSLString(message) };
- SceneObjectPart sceneOP = World.GetSceneObjectPart(new UUID(objectUUID));
+ SceneObjectPart sceneOP = World.GetSceneObjectPart(objUUID);
+
+ if (sceneOP == null) // prior to patching, PostObjectEvent() would cause a throw exception to be shouted instead.
+ {
+ OSSLShoutError("osMessageObject() cannot send message to " + objUUID.ToString() + ", object was not found in scene.");
+ return;
+ }
m_ScriptEngine.PostObjectEvent(
sceneOP.LocalId, new EventParams(
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index f1abd4b746..5793cc9de6 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -121,8 +121,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
public bool Running { get; set; }
- public bool Run { get; set; }
-
public bool Suspended
{
get { return m_Suspended; }
@@ -218,7 +216,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
m_postOnRez = postOnRez;
m_AttachedAvatar = part.ParentGroup.AttachedAvatar;
m_RegionID = part.ParentGroup.Scene.RegionInfo.RegionID;
- Run = true;
if (part != null)
{
@@ -315,11 +312,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
part.SetScriptEvents(ItemID,
(int)m_Script.GetStateEventFlags(State));
- Running = false;
-
- if (ShuttingDown)
+ if (!Running)
m_startOnInit = false;
+ Running = false;
+
// we get new rez events on sim restart, too
// but if there is state, then we fire the change
// event
@@ -355,15 +352,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
public void Init()
{
- if (!m_startOnInit)
+ if (ShuttingDown)
return;
if (m_startedFromSavedState)
{
- if (!Run)
- return;
-
- Start();
+ if (m_startOnInit)
+ Start();
if (m_postOnRez)
{
PostEvent(new EventParams("on_rez",
@@ -395,10 +390,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
}
else
{
- if (!Run)
- return;
-
- Start();
+ if (m_startOnInit)
+ Start();
PostEvent(new EventParams("state_entry",
new Object[0], new DetectParams[0]));
if (m_postOnRez)
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptSerializer.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptSerializer.cs
index 797bce3ce1..bcdc7bf5dd 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptSerializer.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptSerializer.cs
@@ -55,7 +55,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
public static string Serialize(ScriptInstance instance)
{
bool running = instance.Running;
- bool enabled = instance.Run;
XmlDocument xmldoc = new XmlDocument();
@@ -78,12 +77,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
rootElement.AppendChild(run);
- XmlElement run_enable = xmldoc.CreateElement("", "Run", "");
- run_enable.AppendChild(xmldoc.CreateTextNode(
- enabled.ToString()));
-
- rootElement.AppendChild(run_enable);
-
Dictionary vars = instance.GetVars();
XmlElement variables = xmldoc.CreateElement("", "Variables", "");
@@ -232,7 +225,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
{
object varValue;
XmlNodeList partL = rootNode.ChildNodes;
- instance.Run = true;
foreach (XmlNode part in partL)
{
@@ -244,9 +236,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
case "Running":
instance.Running=bool.Parse(part.InnerText);
break;
- case "Run":
- instance.Run = bool.Parse(part.InnerText);
- break;
case "Variables":
XmlNodeList varL = part.ChildNodes;
foreach (XmlNode var in varL)
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 20fad05b72..7a9c80c28e 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -108,6 +108,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
private bool m_KillTimedOutScripts;
private string m_ScriptEnginesPath = null;
+ private ExpiringCache m_runFlags = new ExpiringCache();
+
///
/// Is the entire simulator in the process of shutting down?
///
@@ -1196,6 +1198,14 @@ namespace OpenSim.Region.ScriptEngine.XEngine
if (instance != null)
instance.Init();
+ bool runIt;
+ if (m_runFlags.TryGetValue(itemID, out runIt))
+ {
+ if (!runIt)
+ StopScript(itemID);
+ m_runFlags.Remove(itemID);
+ }
+
return true;
}
@@ -1541,13 +1551,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine
}
}
- public void SetRunEnable(UUID instanceID, bool enable)
- {
- IScriptInstance instance = GetInstance(instanceID);
- if (instance != null)
- instance.Run = enable;
- }
-
public bool GetScriptState(UUID itemID)
{
IScriptInstance instance = GetInstance(itemID);
@@ -1575,6 +1578,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
IScriptInstance instance = GetInstance(itemID);
if (instance != null)
instance.Start();
+ else
+ m_runFlags.AddOrUpdate(itemID, true, 240);
}
public void StopScript(UUID itemID)
@@ -1586,6 +1591,10 @@ namespace OpenSim.Region.ScriptEngine.XEngine
// cause issues on mono 2.6, 2.10 and possibly later where locks are not released properly on abort.
instance.Stop(1000);
}
+ else
+ {
+ m_runFlags.AddOrUpdate(itemID, false, 240);
+ }
}
public DetectParams GetDetectParams(UUID itemID, int idx)
diff --git a/OpenSim/Region/UserStatistics/WebStatsModule.cs b/OpenSim/Region/UserStatistics/WebStatsModule.cs
index faf746fac0..c11ea0225a 100644
--- a/OpenSim/Region/UserStatistics/WebStatsModule.cs
+++ b/OpenSim/Region/UserStatistics/WebStatsModule.cs
@@ -57,7 +57,12 @@ namespace OpenSim.Region.UserStatistics
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private static SqliteConnection dbConn;
+
+ ///
+ /// User statistics sessions keyed by agent ID
+ ///
private Dictionary m_sessions = new Dictionary();
+
private List m_scenes = new List();
private Dictionary reports = new Dictionary();
private Dictionary m_simstatsCounters = new Dictionary();
@@ -308,49 +313,41 @@ namespace OpenSim.Region.UserStatistics
scene.EventManager.OnDeregisterCaps += OnDeRegisterCaps;
scene.EventManager.OnClientClosed += OnClientClosed;
scene.EventManager.OnMakeRootAgent += OnMakeRootAgent;
- scene.EventManager.OnMakeChildAgent += OnMakeChildAgent;
}
}
}
private void OnMakeRootAgent(ScenePresence agent)
{
- UUID regionUUID = GetRegionUUIDFromHandle(agent.RegionHandle);
-
lock (m_sessions)
{
+ UserSessionID uid;
+
if (!m_sessions.ContainsKey(agent.UUID))
{
UserSessionData usd = UserSessionUtil.newUserSessionData();
-
- UserSessionID uid = new UserSessionID();
+ uid = new UserSessionID();
uid.name_f = agent.Firstname;
uid.name_l = agent.Lastname;
- uid.region_id = regionUUID;
- uid.session_id = agent.ControllingClient.SessionId;
uid.session_data = usd;
m_sessions.Add(agent.UUID, uid);
}
else
{
- UserSessionID uid = m_sessions[agent.UUID];
- uid.region_id = regionUUID;
- uid.session_id = agent.ControllingClient.SessionId;
- m_sessions[agent.UUID] = uid;
+ uid = m_sessions[agent.UUID];
}
- }
- }
- private void OnMakeChildAgent(ScenePresence agent)
- {
+ uid.region_id = agent.Scene.RegionInfo.RegionID;
+ uid.session_id = agent.ControllingClient.SessionId;
+ }
}
private void OnClientClosed(UUID agentID, Scene scene)
{
lock (m_sessions)
{
- if (m_sessions.ContainsKey(agentID))
+ if (m_sessions.ContainsKey(agentID) && m_sessions[agentID].region_id == scene.RegionInfo.RegionID)
{
m_sessions.Remove(agentID);
}
@@ -395,20 +392,6 @@ namespace OpenSim.Region.UserStatistics
return encoding.GetString(buffer);
}
- private UUID GetRegionUUIDFromHandle(ulong regionhandle)
- {
- lock (m_scenes)
- {
- foreach (Scene scene in m_scenes)
- {
- if (scene.RegionInfo.RegionHandle == regionhandle)
- return scene.RegionInfo.RegionID;
- }
- }
-
- return UUID.Zero;
- }
-
///
/// Callback for a viewerstats cap
///