From 81ff5eaba09e7569ef5359874ffcfc7f8855f0b4 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Sun, 25 Apr 2010 22:03:35 +0200
Subject: Make scripted attachment states work. Finally. Also replace two
monitor locks with RWLocks, hunting the 10^3 bug. Not successful, but needed
to be done anyway
---
.../Framework/Interfaces/IEntityInventory.cs | 1 +
.../Region/Framework/Scenes/SceneObjectGroup.cs | 7 +++-
.../Framework/Scenes/SceneObjectPartInventory.cs | 41 +++++++++++++++-------
3 files changed, 35 insertions(+), 14 deletions(-)
(limited to 'OpenSim')
diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
index 4dd50d6..d893890 100644
--- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
+++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
@@ -215,5 +215,6 @@ namespace OpenSim.Region.Framework.Interfaces
/// A
///
Dictionary GetScriptStates();
+ Dictionary GetScriptStates(bool oldIDs);
}
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 84c3719..1c6f2d1 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1041,6 +1041,11 @@ namespace OpenSim.Region.Framework.Scenes
public void SaveScriptedState(XmlTextWriter writer)
{
+ SaveScriptedState(writer, false);
+ }
+
+ public void SaveScriptedState(XmlTextWriter writer, bool oldIDs)
+ {
XmlDocument doc = new XmlDocument();
Dictionary states = new Dictionary();
@@ -1050,7 +1055,7 @@ namespace OpenSim.Region.Framework.Scenes
foreach (SceneObjectPart part in m_parts.Values)
{
- Dictionary pstates = part.Inventory.GetScriptStates();
+ Dictionary pstates = part.Inventory.GetScriptStates(oldIDs);
foreach (UUID itemid in pstates.Keys)
{
states.Add(itemid, pstates[itemid]);
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 04df35a..f875224 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -311,11 +311,12 @@ namespace OpenSim.Region.Framework.Scenes
if (m_part.ParentGroup.m_savedScriptState != null)
RestoreSavedScriptState(item.OldItemID, item.ItemID);
- lock (m_items)
- {
- m_items[item.ItemID].PermsMask = 0;
- m_items[item.ItemID].PermsGranter = UUID.Zero;
- }
+ m_items.LockItemsForWrite(true);
+
+ m_items[item.ItemID].PermsMask = 0;
+ m_items[item.ItemID].PermsGranter = UUID.Zero;
+
+ m_items.LockItemsForWrite(false);
string script = Utils.BytesToString(asset.Data);
m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
@@ -713,15 +714,16 @@ namespace OpenSim.Region.Framework.Scenes
{
IList items = new List();
- lock (m_items)
+ m_items.LockItemsForRead(true);
+
+ foreach (TaskInventoryItem item in m_items.Values)
{
- foreach (TaskInventoryItem item in m_items.Values)
- {
- if (item.Name == name)
- items.Add(item);
- }
+ if (item.Name == name)
+ items.Add(item);
}
+ m_items.LockItemsForRead(false);
+
return items;
}
@@ -1115,6 +1117,11 @@ namespace OpenSim.Region.Framework.Scenes
public Dictionary GetScriptStates()
{
+ return GetScriptStates(false);
+ }
+
+ public Dictionary GetScriptStates(bool oldIDs)
+ {
IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces();
Dictionary ret = new Dictionary();
@@ -1132,8 +1139,16 @@ namespace OpenSim.Region.Framework.Scenes
string n = e.GetXMLState(item.ItemID);
if (n != String.Empty)
{
- if (!ret.ContainsKey(item.ItemID))
- ret[item.ItemID] = n;
+ if (oldIDs)
+ {
+ if (!ret.ContainsKey(item.OldItemID))
+ ret[item.OldItemID] = n;
+ }
+ else
+ {
+ if (!ret.ContainsKey(item.ItemID))
+ ret[item.ItemID] = n;
+ }
break;
}
}
--
cgit v1.1