Merge branch 'careminster' of kitto@tor.k-grid.com:/home/kitto/opensim into careminster

avinationmerge
Melanie 2009-11-24 16:00:45 +00:00
commit 81f7e9b462
14 changed files with 875 additions and 646 deletions

View File

@ -27,9 +27,12 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading;
using System.Reflection;
using System.Xml; using System.Xml;
using System.Xml.Schema; using System.Xml.Schema;
using System.Xml.Serialization; using System.Xml.Serialization;
using log4net;
using OpenMetaverse; using OpenMetaverse;
namespace OpenSim.Framework namespace OpenSim.Framework
@ -45,6 +48,105 @@ namespace OpenSim.Framework
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private static XmlSerializer tiiSerializer = new XmlSerializer(typeof (TaskInventoryItem)); private static XmlSerializer tiiSerializer = new XmlSerializer(typeof (TaskInventoryItem));
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private Thread LockedByThread;
/// <value>
/// An advanced lock for inventory data
/// </value>
private System.Threading.ReaderWriterLockSlim m_itemLock = new System.Threading.ReaderWriterLockSlim();
/// <summary>
/// Are we readlocked by the calling thread?
/// </summary>
public bool IsReadLockedByMe()
{
if (m_itemLock.RecursiveReadCount > 0)
{
return true;
}
else
{
return false;
}
}
/// <summary>
/// Lock our inventory list for reading (many can read, one can write)
/// </summary>
public void LockItemsForRead(bool locked)
{
if (locked)
{
if (m_itemLock.IsWriteLockHeld && LockedByThread != null)
{
if (!LockedByThread.IsAlive)
{
//Locked by dead thread, reset.
m_itemLock = new System.Threading.ReaderWriterLockSlim();
}
}
if (m_itemLock.RecursiveReadCount > 0)
{
m_log.Error("[TaskInventoryDictionary] Recursive read lock requested. This should not happen and means something needs to be fixed. For now though, it's safe to continue.");
m_itemLock.ExitReadLock();
}
if (m_itemLock.RecursiveWriteCount > 0)
{
m_log.Error("[TaskInventoryDictionary] Recursive write lock requested. This should not happen and means something needs to be fixed.");
m_itemLock.ExitWriteLock();
}
while (!m_itemLock.TryEnterReadLock(60000))
{
m_log.Error("Thread lock detected while trying to aquire READ lock in TaskInventoryDictionary. Locked by thread " + LockedByThread.Name + ". I'm going to try to solve the thread lock automatically to preserve region stability, but this needs to be fixed.");
if (m_itemLock.IsWriteLockHeld)
{
m_itemLock = new System.Threading.ReaderWriterLockSlim();
}
}
}
else
{
m_itemLock.ExitReadLock();
}
}
/// <summary>
/// Lock our inventory list for writing (many can read, one can write)
/// </summary>
public void LockItemsForWrite(bool locked)
{
if (locked)
{
//Enter a write lock, wait indefinately for one to open.
if (m_itemLock.RecursiveReadCount > 0)
{
m_log.Error("[TaskInventoryDictionary] Recursive read lock requested. This should not happen and means something needs to be fixed. For now though, it's safe to continue.");
m_itemLock.ExitReadLock();
}
if (m_itemLock.RecursiveWriteCount > 0)
{
m_log.Error("[TaskInventoryDictionary] Recursive write lock requested. This should not happen and means something needs to be fixed.");
m_itemLock.ExitWriteLock();
}
while (!m_itemLock.TryEnterWriteLock(60000))
{
m_log.Error("Thread lock detected while trying to aquire WRITE lock in TaskInventoryDictionary. Locked by thread " + LockedByThread.Name + ". I'm going to try to solve the thread lock automatically to preserve region stability, but this needs to be fixed.");
if (m_itemLock.IsWriteLockHeld)
{
m_itemLock = new System.Threading.ReaderWriterLockSlim();
}
}
LockedByThread = Thread.CurrentThread;
}
else
{
m_itemLock.ExitWriteLock();
}
}
#region ICloneable Members #region ICloneable Members
@ -52,13 +154,12 @@ namespace OpenSim.Framework
{ {
TaskInventoryDictionary clone = new TaskInventoryDictionary(); TaskInventoryDictionary clone = new TaskInventoryDictionary();
lock (this) m_itemLock.EnterReadLock();
{
foreach (UUID uuid in Keys) foreach (UUID uuid in Keys)
{ {
clone.Add(uuid, (TaskInventoryItem) this[uuid].Clone()); clone.Add(uuid, (TaskInventoryItem) this[uuid].Clone());
} }
} m_itemLock.ExitReadLock();
return clone; return clone;
} }

View File

@ -266,8 +266,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
} }
// m_log.DebugFormat("[CHAT] Broadcast: fromID {0} fromName {1}, cType {2}, sType {3}", fromID, fromName, cType, sourceType); // m_log.DebugFormat("[CHAT] Broadcast: fromID {0} fromName {1}, cType {2}, sType {3}", fromID, fromName, cType, sourceType);
if (c.Scene != null)
((Scene)c.Scene).ForEachScenePresence( {
((Scene)c.Scene).ForEachScenePresence
(
delegate(ScenePresence presence) delegate(ScenePresence presence)
{ {
// ignore chat from child agents // ignore chat from child agents
@ -284,7 +286,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
client.SendChatMessage(c.Message, (byte)cType, CenterOfRegion, fromName, fromID, client.SendChatMessage(c.Message, (byte)cType, CenterOfRegion, fromName, fromID,
(byte)sourceType, (byte)ChatAudibleLevel.Fully); (byte)sourceType, (byte)ChatAudibleLevel.Fully);
}); }
);
}
} }

View File

@ -389,7 +389,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
{ {
// Check if this is ours to handle // Check if this is ours to handle
// //
m_log.Info("OnFridInstantMessage"); //m_log.Info("OnFridInstantMessage");
if (msg.dialog != (byte) InstantMessageDialog.InventoryOffered) if (msg.dialog != (byte) InstantMessageDialog.InventoryOffered)
return; return;

View File

@ -246,8 +246,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
// Fix ownership/creator of inventory items // Fix ownership/creator of inventory items
// Not doing so results in inventory items // Not doing so results in inventory items
// being no copy/no mod for everyone // being no copy/no mod for everyone
lock (part.TaskInventory) part.TaskInventory.LockItemsForRead(true);
{
TaskInventoryDictionary inv = part.TaskInventory; TaskInventoryDictionary inv = part.TaskInventory;
foreach (KeyValuePair<UUID, TaskInventoryItem> kvp in inv) foreach (KeyValuePair<UUID, TaskInventoryItem> kvp in inv)
{ {
@ -260,7 +259,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
kvp.Value.CreatorID = masterAvatarId; kvp.Value.CreatorID = masterAvatarId;
} }
} }
} part.TaskInventory.LockItemsForRead(false);
} }
if (m_scene.AddRestoredSceneObject(sceneObject, true, false)) if (m_scene.AddRestoredSceneObject(sceneObject, true, false))

View File

@ -840,8 +840,12 @@ namespace OpenSim.Region.Framework.Scenes
public void RemoveTaskInventory(IClientAPI remoteClient, UUID itemID, uint localID) public void RemoveTaskInventory(IClientAPI remoteClient, UUID itemID, uint localID)
{ {
SceneObjectPart part = GetSceneObjectPart(localID); SceneObjectPart part = GetSceneObjectPart(localID);
SceneObjectGroup group = part.ParentGroup; SceneObjectGroup group = null;
if (group != null) if (part != null)
{
group = part.ParentGroup;
}
if (part != null && group != null)
{ {
TaskInventoryItem item = group.GetInventoryItem(localID, itemID); TaskInventoryItem item = group.GetInventoryItem(localID, itemID);
if (item == null) if (item == null)

View File

@ -389,12 +389,16 @@ namespace OpenSim.Region.Framework.Scenes
} }
/// <value> /// <value>
/// Access should be via Inventory directly - this property temporarily remains for xml serialization purposes /// Get the inventory list
/// </value> /// </value>
public TaskInventoryDictionary TaskInventory public TaskInventoryDictionary TaskInventory
{ {
get { return m_inventory.Items; } get {
set { m_inventory.Items = value; } return m_inventory.Items;
}
set {
m_inventory.Items = value;
}
} }
public uint ObjectFlags public uint ObjectFlags
@ -2101,8 +2105,8 @@ namespace OpenSim.Region.Framework.Scenes
//Trys to fetch sound id from prim's inventory. //Trys to fetch sound id from prim's inventory.
//Prim's inventory doesn't support non script items yet //Prim's inventory doesn't support non script items yet
lock (TaskInventory) TaskInventory.LockItemsForRead(true);
{
foreach (KeyValuePair<UUID, TaskInventoryItem> item in TaskInventory) foreach (KeyValuePair<UUID, TaskInventoryItem> item in TaskInventory)
{ {
if (item.Value.Name == sound) if (item.Value.Name == sound)
@ -2111,7 +2115,8 @@ namespace OpenSim.Region.Framework.Scenes
break; break;
} }
} }
}
TaskInventory.LockItemsForRead(false);
} }
List<ScenePresence> avatarts = m_parentGroup.Scene.GetAvatars(); List<ScenePresence> avatarts = m_parentGroup.Scene.GetAvatars();
@ -2457,8 +2462,7 @@ namespace OpenSim.Region.Framework.Scenes
if (!UUID.TryParse(sound, out soundID)) if (!UUID.TryParse(sound, out soundID))
{ {
// search sound file from inventory // search sound file from inventory
lock (TaskInventory) TaskInventory.LockItemsForRead(true);
{
foreach (KeyValuePair<UUID, TaskInventoryItem> item in TaskInventory) foreach (KeyValuePair<UUID, TaskInventoryItem> item in TaskInventory)
{ {
if (item.Value.Name == sound && item.Value.Type == (int)AssetType.Sound) if (item.Value.Name == sound && item.Value.Type == (int)AssetType.Sound)
@ -2467,7 +2471,7 @@ namespace OpenSim.Region.Framework.Scenes
break; break;
} }
} }
} TaskInventory.LockItemsForRead(false);
} }
if (soundID == UUID.Zero) if (soundID == UUID.Zero)

View File

@ -80,7 +80,9 @@ namespace OpenSim.Region.Framework.Scenes
/// </value> /// </value>
protected internal TaskInventoryDictionary Items protected internal TaskInventoryDictionary Items
{ {
get { return m_items; } get {
return m_items;
}
set set
{ {
m_items = value; m_items = value;
@ -116,10 +118,13 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="linkNum">Link number for the part</param> /// <param name="linkNum">Link number for the part</param>
public void ResetInventoryIDs() public void ResetInventoryIDs()
{ {
lock (Items) m_items.LockItemsForWrite(true);
{
if (0 == Items.Count) if (0 == Items.Count)
{
m_items.LockItemsForWrite(false);
return; return;
}
HasInventoryChanged = true; HasInventoryChanged = true;
m_part.ParentGroup.HasGroupChanged = true; m_part.ParentGroup.HasGroupChanged = true;
@ -131,7 +136,7 @@ namespace OpenSim.Region.Framework.Scenes
item.ResetIDs(m_part.UUID); item.ResetIDs(m_part.UUID);
Items.Add(item.ItemID, item); Items.Add(item.ItemID, item);
} }
} m_items.LockItemsForWrite(false);
} }
/// <summary> /// <summary>
@ -140,10 +145,10 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="ownerId"></param> /// <param name="ownerId"></param>
public void ChangeInventoryOwner(UUID ownerId) public void ChangeInventoryOwner(UUID ownerId)
{ {
lock (Items) m_items.LockItemsForWrite(true);
{
if (0 == Items.Count) if (0 == Items.Count)
{ {
m_items.LockItemsForWrite(false);
return; return;
} }
@ -158,7 +163,7 @@ namespace OpenSim.Region.Framework.Scenes
item.OwnerID = ownerId; item.OwnerID = ownerId;
} }
} }
} m_items.LockItemsForWrite(false);
} }
/// <summary> /// <summary>
@ -167,10 +172,10 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="groupID"></param> /// <param name="groupID"></param>
public void ChangeInventoryGroup(UUID groupID) public void ChangeInventoryGroup(UUID groupID)
{ {
lock (Items) m_items.LockItemsForWrite(true);
{
if (0 == Items.Count) if (0 == Items.Count)
{ {
m_items.LockItemsForWrite(false);
return; return;
} }
@ -184,7 +189,7 @@ namespace OpenSim.Region.Framework.Scenes
item.GroupID = groupID; item.GroupID = groupID;
} }
} }
} m_items.LockItemsForWrite(false);
} }
/// <summary> /// <summary>
@ -192,9 +197,10 @@ namespace OpenSim.Region.Framework.Scenes
/// </summary> /// </summary>
public void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource) public void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource)
{ {
lock (m_items) Items.LockItemsForRead(true);
{ IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values);
foreach (TaskInventoryItem item in Items.Values) Items.LockItemsForRead(false);
foreach (TaskInventoryItem item in items)
{ {
if ((int)InventoryType.LSL == item.InvType) if ((int)InventoryType.LSL == item.InvType)
{ {
@ -202,16 +208,17 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
} }
}
/// <summary> /// <summary>
/// Stop all the scripts in this prim. /// Stop all the scripts in this prim.
/// </summary> /// </summary>
public void RemoveScriptInstances() public void RemoveScriptInstances()
{ {
lock (Items) Items.LockItemsForRead(true);
{ IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values);
foreach (TaskInventoryItem item in Items.Values) Items.LockItemsForRead(false);
foreach (TaskInventoryItem item in items)
{ {
if ((int)InventoryType.LSL == item.InvType) if ((int)InventoryType.LSL == item.InvType)
{ {
@ -219,7 +226,8 @@ namespace OpenSim.Region.Framework.Scenes
m_part.RemoveScriptEvents(item.ItemID); m_part.RemoveScriptEvents(item.ItemID);
} }
} }
}
} }
/// <summary> /// <summary>
@ -244,8 +252,10 @@ namespace OpenSim.Region.Framework.Scenes
if (stateSource == 1 && // Prim crossing if (stateSource == 1 && // Prim crossing
m_part.ParentGroup.Scene.m_trustBinaries) m_part.ParentGroup.Scene.m_trustBinaries)
{ {
m_items.LockItemsForWrite(true);
m_items[item.ItemID].PermsMask = 0; m_items[item.ItemID].PermsMask = 0;
m_items[item.ItemID].PermsGranter = UUID.Zero; m_items[item.ItemID].PermsGranter = UUID.Zero;
m_items.LockItemsForWrite(false);
m_part.ParentGroup.Scene.EventManager.TriggerRezScript( m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
m_part.LocalId, item.ItemID, String.Empty, startParam, postOnRez, engine, stateSource); m_part.LocalId, item.ItemID, String.Empty, startParam, postOnRez, engine, stateSource);
m_part.ParentGroup.AddActiveScriptCount(1); m_part.ParentGroup.AddActiveScriptCount(1);
@ -266,8 +276,10 @@ namespace OpenSim.Region.Framework.Scenes
{ {
if (m_part.ParentGroup.m_savedScriptState != null) if (m_part.ParentGroup.m_savedScriptState != null)
RestoreSavedScriptState(item.OldItemID, item.ItemID); RestoreSavedScriptState(item.OldItemID, item.ItemID);
m_items.LockItemsForWrite(true);
m_items[item.ItemID].PermsMask = 0; m_items[item.ItemID].PermsMask = 0;
m_items[item.ItemID].PermsGranter = UUID.Zero; m_items[item.ItemID].PermsGranter = UUID.Zero;
m_items.LockItemsForWrite(false);
string script = Utils.BytesToString(asset.Data); string script = Utils.BytesToString(asset.Data);
m_part.ParentGroup.Scene.EventManager.TriggerRezScript( m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource); m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource);
@ -302,20 +314,22 @@ namespace OpenSim.Region.Framework.Scenes
/// </param> /// </param>
public void CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource) public void CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource)
{ {
lock (m_items) m_items.LockItemsForRead(true);
{
if (m_items.ContainsKey(itemId)) if (m_items.ContainsKey(itemId))
{ {
CreateScriptInstance(m_items[itemId], startParam, postOnRez, engine, stateSource); TaskInventoryItem item = m_items[itemId];
m_items.LockItemsForRead(false);
CreateScriptInstance(item, startParam, postOnRez, engine, stateSource);
} }
else else
{ {
m_items.LockItemsForRead(false);
m_log.ErrorFormat( m_log.ErrorFormat(
"[PRIM INVENTORY]: " + "[PRIM INVENTORY]: " +
"Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2}", "Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2}",
itemId, m_part.Name, m_part.UUID); itemId, m_part.Name, m_part.UUID);
} }
}
} }
/// <summary> /// <summary>
@ -346,11 +360,16 @@ namespace OpenSim.Region.Framework.Scenes
/// <returns></returns> /// <returns></returns>
private bool InventoryContainsName(string name) private bool InventoryContainsName(string name)
{ {
foreach (TaskInventoryItem item in Items.Values) m_items.LockItemsForRead(true);
foreach (TaskInventoryItem item in m_items.Values)
{ {
if (item.Name == name) if (item.Name == name)
{
m_items.LockItemsForRead(false);
return true; return true;
} }
}
m_items.LockItemsForRead(false);
return false; return false;
} }
@ -392,7 +411,9 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="item"></param> /// <param name="item"></param>
public void AddInventoryItemExclusive(TaskInventoryItem item, bool allowedDrop) public void AddInventoryItemExclusive(TaskInventoryItem item, bool allowedDrop)
{ {
m_items.LockItemsForRead(true);
List<TaskInventoryItem> il = new List<TaskInventoryItem>(m_items.Values); List<TaskInventoryItem> il = new List<TaskInventoryItem>(m_items.Values);
m_items.LockItemsForRead(false);
foreach (TaskInventoryItem i in il) foreach (TaskInventoryItem i in il)
{ {
if (i.Name == item.Name) if (i.Name == item.Name)
@ -429,15 +450,14 @@ namespace OpenSim.Region.Framework.Scenes
item.ParentPartID = m_part.UUID; item.ParentPartID = m_part.UUID;
item.Name = name; item.Name = name;
lock (m_items) m_items.LockItemsForWrite(true);
{
m_items.Add(item.ItemID, item); m_items.Add(item.ItemID, item);
m_items.LockItemsForWrite(false);
if (allowedDrop) if (allowedDrop)
m_part.TriggerScriptChangedEvent(Changed.ALLOWED_DROP); m_part.TriggerScriptChangedEvent(Changed.ALLOWED_DROP);
else else
m_part.TriggerScriptChangedEvent(Changed.INVENTORY); m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
}
m_inventorySerial++; m_inventorySerial++;
//m_inventorySerial += 2; //m_inventorySerial += 2;
@ -454,14 +474,13 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="items"></param> /// <param name="items"></param>
public void RestoreInventoryItems(ICollection<TaskInventoryItem> items) public void RestoreInventoryItems(ICollection<TaskInventoryItem> items)
{ {
lock (m_items) m_items.LockItemsForWrite(true);
{
foreach (TaskInventoryItem item in items) foreach (TaskInventoryItem item in items)
{ {
m_items.Add(item.ItemID, item); m_items.Add(item.ItemID, item);
m_part.TriggerScriptChangedEvent(Changed.INVENTORY); m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
} }
} m_items.LockItemsForWrite(false);
m_inventorySerial++; m_inventorySerial++;
} }
@ -474,8 +493,9 @@ namespace OpenSim.Region.Framework.Scenes
public TaskInventoryItem GetInventoryItem(UUID itemId) public TaskInventoryItem GetInventoryItem(UUID itemId)
{ {
TaskInventoryItem item; TaskInventoryItem item;
m_items.LockItemsForRead(true);
m_items.TryGetValue(itemId, out item); m_items.TryGetValue(itemId, out item);
m_items.LockItemsForRead(false);
return item; return item;
} }
@ -487,8 +507,8 @@ namespace OpenSim.Region.Framework.Scenes
/// <returns>false if the item did not exist, true if the update occurred successfully</returns> /// <returns>false if the item did not exist, true if the update occurred successfully</returns>
public bool UpdateInventoryItem(TaskInventoryItem item) public bool UpdateInventoryItem(TaskInventoryItem item)
{ {
lock (m_items) m_items.LockItemsForWrite(true);
{
if (m_items.ContainsKey(item.ItemID)) if (m_items.ContainsKey(item.ItemID))
{ {
item.ParentID = m_part.UUID; item.ParentID = m_part.UUID;
@ -515,7 +535,7 @@ namespace OpenSim.Region.Framework.Scenes
HasInventoryChanged = true; HasInventoryChanged = true;
m_part.ParentGroup.HasGroupChanged = true; m_part.ParentGroup.HasGroupChanged = true;
m_items.LockItemsForWrite(false);
return true; return true;
} }
else else
@ -525,7 +545,7 @@ namespace OpenSim.Region.Framework.Scenes
"Tried to retrieve item ID {0} from prim {1}, {2} but the item does not exist in this inventory", "Tried to retrieve item ID {0} from prim {1}, {2} but the item does not exist in this inventory",
item.ItemID, m_part.Name, m_part.UUID); item.ItemID, m_part.Name, m_part.UUID);
} }
} m_items.LockItemsForWrite(false);
return false; return false;
} }
@ -538,16 +558,19 @@ namespace OpenSim.Region.Framework.Scenes
/// in this prim's inventory.</returns> /// in this prim's inventory.</returns>
public int RemoveInventoryItem(UUID itemID) public int RemoveInventoryItem(UUID itemID)
{ {
lock (m_items) m_items.LockItemsForRead(true);
{
if (m_items.ContainsKey(itemID)) if (m_items.ContainsKey(itemID))
{ {
int type = m_items[itemID].InvType; int type = m_items[itemID].InvType;
m_items.LockItemsForRead(false);
if (type == 10) // Script if (type == 10) // Script
{ {
m_part.ParentGroup.Scene.EventManager.TriggerRemoveScript(m_part.LocalId, itemID); m_part.ParentGroup.Scene.EventManager.TriggerRemoveScript(m_part.LocalId, itemID);
} }
m_items.LockItemsForWrite(true);
m_items.Remove(itemID); m_items.Remove(itemID);
m_items.LockItemsForWrite(false);
m_inventorySerial++; m_inventorySerial++;
m_part.TriggerScriptChangedEvent(Changed.INVENTORY); m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
@ -555,8 +578,7 @@ namespace OpenSim.Region.Framework.Scenes
m_part.ParentGroup.HasGroupChanged = true; m_part.ParentGroup.HasGroupChanged = true;
int scriptcount = 0; int scriptcount = 0;
lock (m_items) m_items.LockItemsForRead(true);
{
foreach (TaskInventoryItem item in m_items.Values) foreach (TaskInventoryItem item in m_items.Values)
{ {
if (item.Type == 10) if (item.Type == 10)
@ -564,7 +586,8 @@ namespace OpenSim.Region.Framework.Scenes
scriptcount++; scriptcount++;
} }
} }
} m_items.LockItemsForRead(false);
if (scriptcount <= 0) if (scriptcount <= 0)
{ {
@ -582,7 +605,7 @@ namespace OpenSim.Region.Framework.Scenes
"Tried to remove item ID {0} from prim {1}, {2} but the item does not exist in this inventory", "Tried to remove item ID {0} from prim {1}, {2} but the item does not exist in this inventory",
itemID, m_part.Name, m_part.UUID); itemID, m_part.Name, m_part.UUID);
} }
} m_items.LockItemsForWrite(false);
return -1; return -1;
} }
@ -635,8 +658,8 @@ namespace OpenSim.Region.Framework.Scenes
// isn't available (such as drag from prim inventory to agent inventory) // isn't available (such as drag from prim inventory to agent inventory)
InventoryStringBuilder invString = new InventoryStringBuilder(m_part.UUID, UUID.Zero); InventoryStringBuilder invString = new InventoryStringBuilder(m_part.UUID, UUID.Zero);
lock (m_items) m_items.LockItemsForRead(true);
{
foreach (TaskInventoryItem item in m_items.Values) foreach (TaskInventoryItem item in m_items.Values)
{ {
UUID ownerID = item.OwnerID; UUID ownerID = item.OwnerID;
@ -680,7 +703,8 @@ namespace OpenSim.Region.Framework.Scenes
invString.AddNameValueLine("creation_date", item.CreationDate.ToString()); invString.AddNameValueLine("creation_date", item.CreationDate.ToString());
invString.AddSectionEnd(); invString.AddSectionEnd();
} }
} int count = m_items.Count;
m_items.LockItemsForRead(false);
fileData = Utils.StringToBytes(invString.BuildString); fileData = Utils.StringToBytes(invString.BuildString);
@ -701,10 +725,9 @@ namespace OpenSim.Region.Framework.Scenes
{ {
if (HasInventoryChanged) if (HasInventoryChanged)
{ {
lock (Items) Items.LockItemsForRead(true);
{
datastore.StorePrimInventory(m_part.UUID, Items.Values); datastore.StorePrimInventory(m_part.UUID, Items.Values);
} Items.LockItemsForRead(false);
HasInventoryChanged = false; HasInventoryChanged = false;
} }

View File

@ -1615,10 +1615,9 @@ namespace OpenSim.Region.Framework.Scenes
SceneObjectPart part = m_scene.GetSceneObjectPart(m_parentID); SceneObjectPart part = m_scene.GetSceneObjectPart(m_parentID);
if (part != null) if (part != null)
{ {
part.TaskInventory.LockItemsForRead(true);
TaskInventoryDictionary taskIDict = part.TaskInventory; TaskInventoryDictionary taskIDict = part.TaskInventory;
if (taskIDict != null) if (taskIDict != null)
{
lock (taskIDict)
{ {
foreach (UUID taskID in taskIDict.Keys) foreach (UUID taskID in taskIDict.Keys)
{ {
@ -1628,8 +1627,7 @@ namespace OpenSim.Region.Framework.Scenes
4); // PERMISSION_TAKE_CONTROLS 4); // PERMISSION_TAKE_CONTROLS
} }
} }
part.TaskInventory.LockItemsForRead(false);
}
// Reset sit target. // Reset sit target.
if (part.GetAvatarOnSitTarget() == UUID) if (part.GetAvatarOnSitTarget() == UUID)
part.SetAvatarOnSitTarget(UUID.Zero); part.SetAvatarOnSitTarget(UUID.Zero);

View File

@ -28,6 +28,7 @@
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; //for [DebuggerNonUserCode]
using System.Runtime.Remoting.Lifetime; using System.Runtime.Remoting.Lifetime;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
@ -151,6 +152,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
get { return m_ScriptEngine.World; } get { return m_ScriptEngine.World; }
} }
[DebuggerNonUserCode]
public void state(string newState) public void state(string newState)
{ {
m_ScriptEngine.SetState(m_itemID, newState); m_ScriptEngine.SetState(m_itemID, newState);
@ -160,6 +162,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
/// Reset the named script. The script must be present /// Reset the named script. The script must be present
/// in the same prim. /// in the same prim.
/// </summary> /// </summary>
[DebuggerNonUserCode]
public void llResetScript() public void llResetScript()
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
@ -272,9 +275,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
protected UUID InventorySelf() protected UUID InventorySelf()
{ {
UUID invItemID = new UUID(); UUID invItemID = new UUID();
bool unlock = false;
lock (m_host.TaskInventory) if (!m_host.TaskInventory.IsReadLockedByMe())
{ {
m_host.TaskInventory.LockItemsForRead(true);
unlock = true;
}
foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
{ {
if (inv.Value.Type == 10 && inv.Value.ItemID == m_itemID) if (inv.Value.Type == 10 && inv.Value.ItemID == m_itemID)
@ -283,29 +289,34 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
break; break;
} }
} }
if (unlock)
{
m_host.TaskInventory.LockItemsForRead(false);
} }
return invItemID; return invItemID;
} }
protected UUID InventoryKey(string name, int type) protected UUID InventoryKey(string name, int type)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
m_host.TaskInventory.LockItemsForRead(true);
lock (m_host.TaskInventory)
{
foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
{ {
if (inv.Value.Name == name) if (inv.Value.Name == name)
{ {
m_host.TaskInventory.LockItemsForRead(false);
if (inv.Value.Type != type) if (inv.Value.Type != type)
{
return UUID.Zero; return UUID.Zero;
}
return inv.Value.AssetID; return inv.Value.AssetID;
} }
} }
}
m_host.TaskInventory.LockItemsForRead(false);
return UUID.Zero; return UUID.Zero;
} }
@ -313,16 +324,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
lock (m_host.TaskInventory)
{ m_host.TaskInventory.LockItemsForRead(true);
foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
{ {
if (inv.Value.Name == name) if (inv.Value.Name == name)
{ {
m_host.TaskInventory.LockItemsForRead(false);
return inv.Value.AssetID; return inv.Value.AssetID;
} }
} }
}
m_host.TaskInventory.LockItemsForRead(false);
return UUID.Zero; return UUID.Zero;
} }
@ -2534,12 +2549,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
m_host.TaskInventory.LockItemsForRead(true);
TaskInventoryItem item = m_host.TaskInventory[invItemID]; TaskInventoryItem item = m_host.TaskInventory[invItemID];
m_host.TaskInventory.LockItemsForRead(false);
lock (m_host.TaskInventory)
{
item = m_host.TaskInventory[invItemID];
}
if (item.PermsGranter == UUID.Zero) if (item.PermsGranter == UUID.Zero)
return 0; return 0;
@ -2614,6 +2626,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (dist > m_ScriptDistanceFactor * 10.0f) if (dist > m_ScriptDistanceFactor * 10.0f)
return; return;
//Clone is thread-safe
TaskInventoryDictionary partInventory = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); TaskInventoryDictionary partInventory = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
foreach (KeyValuePair<UUID, TaskInventoryItem> inv in partInventory) foreach (KeyValuePair<UUID, TaskInventoryItem> inv in partInventory)
@ -2747,13 +2760,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{ {
TaskInventoryItem item; TaskInventoryItem item;
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
if (!m_host.TaskInventory.ContainsKey(InventorySelf())) if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
{
m_host.TaskInventory.LockItemsForRead(false);
return; return;
}
else else
{
item = m_host.TaskInventory[InventorySelf()]; item = m_host.TaskInventory[InventorySelf()];
} }
m_host.TaskInventory.LockItemsForRead(false);
if (item.PermsGranter != UUID.Zero) if (item.PermsGranter != UUID.Zero)
{ {
@ -2775,13 +2792,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{ {
TaskInventoryItem item; TaskInventoryItem item;
m_host.TaskInventory.LockItemsForRead(true);
lock (m_host.TaskInventory) lock (m_host.TaskInventory)
{ {
if (!m_host.TaskInventory.ContainsKey(InventorySelf())) if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
{
m_host.TaskInventory.LockItemsForRead(false);
return; return;
}
else else
{
item = m_host.TaskInventory[InventorySelf()]; item = m_host.TaskInventory[InventorySelf()];
} }
}
m_host.TaskInventory.LockItemsForRead(false);
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
@ -2818,14 +2843,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
TaskInventoryItem item; TaskInventoryItem item;
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
if (!m_host.TaskInventory.ContainsKey(InventorySelf())) if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
{
m_host.TaskInventory.LockItemsForRead(false);
return; return;
}
else else
{
item = m_host.TaskInventory[InventorySelf()]; item = m_host.TaskInventory[InventorySelf()];
} }
m_host.TaskInventory.LockItemsForRead(false);
if (item.PermsGranter != m_host.OwnerID) if (item.PermsGranter != m_host.OwnerID)
return; return;
@ -2850,13 +2881,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
TaskInventoryItem item; TaskInventoryItem item;
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
if (!m_host.TaskInventory.ContainsKey(InventorySelf())) if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
{
m_host.TaskInventory.LockItemsForRead(false);
return; return;
}
else else
{
item = m_host.TaskInventory[InventorySelf()]; item = m_host.TaskInventory[InventorySelf()];
} }
m_host.TaskInventory.LockItemsForRead(false);
if (item.PermsGranter != m_host.OwnerID) if (item.PermsGranter != m_host.OwnerID)
return; return;
@ -3080,14 +3117,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
TaskInventoryItem item; TaskInventoryItem item;
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
if (!m_host.TaskInventory.ContainsKey(InventorySelf())) if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
{
m_host.TaskInventory.LockItemsForRead(false);
return; return;
}
else else
{
item = m_host.TaskInventory[InventorySelf()]; item = m_host.TaskInventory[InventorySelf()];
} }
m_host.TaskInventory.LockItemsForRead(false);
if (item.PermsGranter == UUID.Zero) if (item.PermsGranter == UUID.Zero)
return; return;
@ -3117,13 +3157,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
TaskInventoryItem item; TaskInventoryItem item;
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
if (!m_host.TaskInventory.ContainsKey(InventorySelf())) if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
{
m_host.TaskInventory.LockItemsForRead(false);
return; return;
}
else else
{
item = m_host.TaskInventory[InventorySelf()]; item = m_host.TaskInventory[InventorySelf()];
} }
m_host.TaskInventory.LockItemsForRead(false);
if (item.PermsGranter == UUID.Zero) if (item.PermsGranter == UUID.Zero)
return; return;
@ -3196,10 +3241,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
TaskInventoryItem item; TaskInventoryItem item;
lock (m_host.TaskInventory)
m_host.TaskInventory.LockItemsForRead(true);
if (!m_host.TaskInventory.ContainsKey(invItemID))
{
m_host.TaskInventory.LockItemsForRead(false);
return;
}
else
{ {
item = m_host.TaskInventory[invItemID]; item = m_host.TaskInventory[invItemID];
} }
m_host.TaskInventory.LockItemsForRead(false);
if (agentID == UUID.Zero || perm == 0) // Releasing permissions if (agentID == UUID.Zero || perm == 0) // Releasing permissions
{ {
@ -3231,11 +3284,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms
{ {
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForWrite(true);
{
m_host.TaskInventory[invItemID].PermsGranter = agentID; m_host.TaskInventory[invItemID].PermsGranter = agentID;
m_host.TaskInventory[invItemID].PermsMask = perm; m_host.TaskInventory[invItemID].PermsMask = perm;
} m_host.TaskInventory.LockItemsForWrite(false);
m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams(
"run_time_permissions", new Object[] { "run_time_permissions", new Object[] {
@ -3255,11 +3307,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms
{ {
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForWrite(true);
{
m_host.TaskInventory[invItemID].PermsGranter = agentID; m_host.TaskInventory[invItemID].PermsGranter = agentID;
m_host.TaskInventory[invItemID].PermsMask = perm; m_host.TaskInventory[invItemID].PermsMask = perm;
} m_host.TaskInventory.LockItemsForWrite(false);
m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams(
"run_time_permissions", new Object[] { "run_time_permissions", new Object[] {
@ -3280,11 +3331,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (!m_waitingForScriptAnswer) if (!m_waitingForScriptAnswer)
{ {
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForWrite(true);
{
m_host.TaskInventory[invItemID].PermsGranter = agentID; m_host.TaskInventory[invItemID].PermsGranter = agentID;
m_host.TaskInventory[invItemID].PermsMask = 0; m_host.TaskInventory[invItemID].PermsMask = 0;
} m_host.TaskInventory.LockItemsForWrite(false);
presence.ControllingClient.OnScriptAnswer += handleScriptAnswer; presence.ControllingClient.OnScriptAnswer += handleScriptAnswer;
m_waitingForScriptAnswer=true; m_waitingForScriptAnswer=true;
@ -3319,10 +3369,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0)
llReleaseControls(); llReleaseControls();
lock (m_host.TaskInventory)
{ m_host.TaskInventory.LockItemsForWrite(true);
m_host.TaskInventory[invItemID].PermsMask = answer; m_host.TaskInventory[invItemID].PermsMask = answer;
} m_host.TaskInventory.LockItemsForWrite(false);
m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams(
"run_time_permissions", new Object[] { "run_time_permissions", new Object[] {
@ -3334,16 +3385,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
foreach (TaskInventoryItem item in m_host.TaskInventory.Values) foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
{ {
if (item.Type == 10 && item.ItemID == m_itemID) if (item.Type == 10 && item.ItemID == m_itemID)
{ {
m_host.TaskInventory.LockItemsForRead(false);
return item.PermsGranter.ToString(); return item.PermsGranter.ToString();
} }
} }
} m_host.TaskInventory.LockItemsForRead(false);
return UUID.Zero.ToString(); return UUID.Zero.ToString();
} }
@ -3352,8 +3404,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
foreach (TaskInventoryItem item in m_host.TaskInventory.Values) foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
{ {
if (item.Type == 10 && item.ItemID == m_itemID) if (item.Type == 10 && item.ItemID == m_itemID)
@ -3361,10 +3413,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
int perms = item.PermsMask; int perms = item.PermsMask;
if (m_automaticLinkPermission) if (m_automaticLinkPermission)
perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS; perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
m_host.TaskInventory.LockItemsForRead(false);
return perms; return perms;
} }
} }
} m_host.TaskInventory.LockItemsForRead(false);
return 0; return 0;
} }
@ -3397,10 +3450,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
UUID invItemID = InventorySelf(); UUID invItemID = InventorySelf();
TaskInventoryItem item; TaskInventoryItem item;
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
item = m_host.TaskInventory[invItemID]; item = m_host.TaskInventory[invItemID];
} m_host.TaskInventory.LockItemsForRead(false);
if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
&& !m_automaticLinkPermission) && !m_automaticLinkPermission)
@ -3454,15 +3506,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
UUID invItemID = InventorySelf(); UUID invItemID = InventorySelf();
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
&& !m_automaticLinkPermission) && !m_automaticLinkPermission)
{ {
ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!");
m_host.TaskInventory.LockItemsForRead(false);
return; return;
} }
} m_host.TaskInventory.LockItemsForRead(false);
if (linknum < ScriptBaseClass.LINK_THIS) if (linknum < ScriptBaseClass.LINK_THIS)
return; return;
@ -3632,8 +3684,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
int count = 0; int count = 0;
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
{ {
if (inv.Value.Type == type || type == -1) if (inv.Value.Type == type || type == -1)
@ -3641,8 +3692,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
count = count + 1; count = count + 1;
} }
} }
}
m_host.TaskInventory.LockItemsForRead(false);
return count; return count;
} }
@ -3651,8 +3702,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
ArrayList keys = new ArrayList(); ArrayList keys = new ArrayList();
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
{ {
if (inv.Value.Type == type || type == -1) if (inv.Value.Type == type || type == -1)
@ -3660,7 +3710,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
keys.Add(inv.Value.Name); keys.Add(inv.Value.Name);
} }
} }
} m_host.TaskInventory.LockItemsForRead(false);
if (keys.Count == 0) if (keys.Count == 0)
{ {
@ -3697,8 +3747,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
} }
// move the first object found with this inventory name // move the first object found with this inventory name
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
{ {
if (inv.Value.Name == inventory) if (inv.Value.Name == inventory)
@ -3710,7 +3759,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
break; break;
} }
} }
} m_host.TaskInventory.LockItemsForRead(false);
if (!found) if (!found)
{ {
@ -3755,12 +3804,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
ScriptSleep(3000); ScriptSleep(3000);
} }
[DebuggerNonUserCode]
public void llRemoveInventory(string name) public void llRemoveInventory(string name)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
foreach (TaskInventoryItem item in m_host.TaskInventory.Values) foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
{ {
if (item.Name == name) if (item.Name == name)
@ -3769,10 +3818,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
throw new ScriptDeleteException(); throw new ScriptDeleteException();
else else
m_host.Inventory.RemoveInventoryItem(item.ItemID); m_host.Inventory.RemoveInventoryItem(item.ItemID);
m_host.TaskInventory.LockItemsForRead(false);
return; return;
} }
} }
} m_host.TaskInventory.LockItemsForRead(false);
} }
public void llSetText(string text, LSL_Vector color, double alpha) public void llSetText(string text, LSL_Vector color, double alpha)
@ -3861,6 +3912,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
//Clone is thread safe
TaskInventoryDictionary itemDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); TaskInventoryDictionary itemDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
foreach (TaskInventoryItem item in itemDictionary.Values) foreach (TaskInventoryItem item in itemDictionary.Values)
@ -3951,8 +4003,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
UUID soundId = UUID.Zero; UUID soundId = UUID.Zero;
if (!UUID.TryParse(impact_sound, out soundId)) if (!UUID.TryParse(impact_sound, out soundId))
{ {
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
foreach (TaskInventoryItem item in m_host.TaskInventory.Values) foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
{ {
if (item.Type == (int)AssetType.Sound && item.Name == impact_sound) if (item.Type == (int)AssetType.Sound && item.Name == impact_sound)
@ -3961,7 +4012,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
break; break;
} }
} }
} m_host.TaskInventory.LockItemsForRead(false);
} }
m_host.CollisionSound = soundId; m_host.CollisionSound = soundId;
m_host.CollisionSoundVolume = (float)impact_volume; m_host.CollisionSoundVolume = (float)impact_volume;
@ -4007,6 +4058,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
UUID partItemID; UUID partItemID;
foreach (SceneObjectPart part in parts) foreach (SceneObjectPart part in parts)
{ {
//Clone is thread safe
TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)part.TaskInventory.Clone(); TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)part.TaskInventory.Clone();
foreach (TaskInventoryItem item in itemsDictionary.Values) foreach (TaskInventoryItem item in itemsDictionary.Values)
@ -4214,8 +4266,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
foreach (TaskInventoryItem item in m_host.TaskInventory.Values) foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
{ {
if (item.Type == 10 && item.ItemID == m_itemID) if (item.Type == 10 && item.ItemID == m_itemID)
@ -4224,7 +4275,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
break; break;
} }
} }
} m_host.TaskInventory.LockItemsForRead(false);
return result; return result;
} }
@ -4482,23 +4533,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
{ {
if (inv.Value.Name == name) if (inv.Value.Name == name)
{ {
if ((inv.Value.CurrentPermissions & (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) == (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) if ((inv.Value.CurrentPermissions & (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) == (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify))
{ {
m_host.TaskInventory.LockItemsForRead(false);
return inv.Value.AssetID.ToString(); return inv.Value.AssetID.ToString();
} }
else else
{ {
m_host.TaskInventory.LockItemsForRead(false);
return UUID.Zero.ToString(); return UUID.Zero.ToString();
} }
} }
} }
} m_host.TaskInventory.LockItemsForRead(false);
return UUID.Zero.ToString(); return UUID.Zero.ToString();
} }
@ -5993,14 +6045,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
protected UUID GetTaskInventoryItem(string name) protected UUID GetTaskInventoryItem(string name)
{ {
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
{ {
if (inv.Value.Name == name) if (inv.Value.Name == name)
{
m_host.TaskInventory.LockItemsForRead(false);
return inv.Key; return inv.Key;
} }
} }
m_host.TaskInventory.LockItemsForRead(false);
return UUID.Zero; return UUID.Zero;
} }
@ -6311,8 +6365,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
} }
// copy the first script found with this inventory name // copy the first script found with this inventory name
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
{ {
if (inv.Value.Name == name) if (inv.Value.Name == name)
@ -6326,7 +6379,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
} }
} }
} }
} m_host.TaskInventory.LockItemsForRead(false);
if (!found) if (!found)
{ {
@ -8129,12 +8182,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
{ {
if (inv.Value.Name == item) if (inv.Value.Name == item)
{ {
m_host.TaskInventory.LockItemsForRead(false);
switch (mask) switch (mask)
{ {
case 0: case 0:
@ -8150,7 +8203,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
} }
} }
} }
} m_host.TaskInventory.LockItemsForRead(false);
return -1; return -1;
} }
@ -8165,16 +8218,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
{ {
if (inv.Value.Name == item) if (inv.Value.Name == item)
{ {
m_host.TaskInventory.LockItemsForRead(false);
return inv.Value.CreatorID.ToString(); return inv.Value.CreatorID.ToString();
} }
} }
} m_host.TaskInventory.LockItemsForRead(false);
llSay(0, "No item name '" + item + "'"); llSay(0, "No item name '" + item + "'");
@ -8698,16 +8751,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
{ {
if (inv.Value.Name == name) if (inv.Value.Name == name)
{ {
m_host.TaskInventory.LockItemsForRead(false);
return inv.Value.Type; return inv.Value.Type;
} }
} }
} m_host.TaskInventory.LockItemsForRead(false);
return -1; return -1;
} }
@ -8738,17 +8791,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (invItemID == UUID.Zero) if (invItemID == UUID.Zero)
return new LSL_Vector(); return new LSL_Vector();
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero) if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero)
{
m_host.TaskInventory.LockItemsForRead(false);
return new LSL_Vector(); return new LSL_Vector();
}
if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
{ {
ShoutError("No permissions to track the camera"); ShoutError("No permissions to track the camera");
m_host.TaskInventory.LockItemsForRead(false);
return new LSL_Vector(); return new LSL_Vector();
} }
} m_host.TaskInventory.LockItemsForRead(false);
ScenePresence presence = World.GetScenePresence(m_host.OwnerID); ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
if (presence != null) if (presence != null)
@ -8766,17 +8822,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (invItemID == UUID.Zero) if (invItemID == UUID.Zero)
return new LSL_Rotation(); return new LSL_Rotation();
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero) if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero)
{
m_host.TaskInventory.LockItemsForRead(false);
return new LSL_Rotation(); return new LSL_Rotation();
}
if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
{ {
ShoutError("No permissions to track the camera"); ShoutError("No permissions to track the camera");
m_host.TaskInventory.LockItemsForRead(false);
return new LSL_Rotation(); return new LSL_Rotation();
} }
} m_host.TaskInventory.LockItemsForRead(false);
ScenePresence presence = World.GetScenePresence(m_host.OwnerID); ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
if (presence != null) if (presence != null)
@ -8926,14 +8984,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (objectID == UUID.Zero) return; if (objectID == UUID.Zero) return;
UUID agentID; UUID agentID;
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
// we need the permission first, to know which avatar we want to set the camera for // we need the permission first, to know which avatar we want to set the camera for
agentID = m_host.TaskInventory[invItemID].PermsGranter; agentID = m_host.TaskInventory[invItemID].PermsGranter;
if (agentID == UUID.Zero) return; if (agentID == UUID.Zero)
if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) return; {
m_host.TaskInventory.LockItemsForRead(false);
return;
} }
if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0)
{
m_host.TaskInventory.LockItemsForRead(false);
return;
}
m_host.TaskInventory.LockItemsForRead(false);
ScenePresence presence = World.GetScenePresence(agentID); ScenePresence presence = World.GetScenePresence(agentID);
@ -8983,12 +9048,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
// we need the permission first, to know which avatar we want to clear the camera for // we need the permission first, to know which avatar we want to clear the camera for
UUID agentID; UUID agentID;
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
agentID = m_host.TaskInventory[invItemID].PermsGranter; agentID = m_host.TaskInventory[invItemID].PermsGranter;
if (agentID == UUID.Zero) return; if (agentID == UUID.Zero)
if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) return; {
m_host.TaskInventory.LockItemsForRead(false);
return;
} }
if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0)
{
m_host.TaskInventory.LockItemsForRead(false);
return;
}
m_host.TaskInventory.LockItemsForRead(false);
ScenePresence presence = World.GetScenePresence(agentID); ScenePresence presence = World.GetScenePresence(agentID);
@ -9445,15 +9517,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
internal UUID ScriptByName(string name) internal UUID ScriptByName(string name)
{ {
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
foreach (TaskInventoryItem item in m_host.TaskInventory.Values) foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
{ {
if (item.Type == 10 && item.Name == name) if (item.Type == 10 && item.Name == name)
{
m_host.TaskInventory.LockItemsForRead(false);
return item.ItemID; return item.ItemID;
} }
} }
m_host.TaskInventory.LockItemsForRead(false);
return UUID.Zero; return UUID.Zero;
} }
@ -9494,6 +9570,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
//Clone is thread safe
TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
UUID assetID = UUID.Zero; UUID assetID = UUID.Zero;
@ -9556,6 +9633,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
//Clone is thread safe
TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
UUID assetID = UUID.Zero; UUID assetID = UUID.Zero;

View File

@ -728,8 +728,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (target != null) if (target != null)
{ {
UUID animID=UUID.Zero; UUID animID=UUID.Zero;
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
{ {
if (inv.Value.Name == animation) if (inv.Value.Name == animation)
@ -739,7 +738,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
continue; continue;
} }
} }
} m_host.TaskInventory.LockItemsForRead(false);
if (animID == UUID.Zero) if (animID == UUID.Zero)
target.Animator.AddAnimation(animation, m_host.UUID); target.Animator.AddAnimation(animation, m_host.UUID);
else else
@ -761,8 +760,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (target != null) if (target != null)
{ {
UUID animID=UUID.Zero; UUID animID=UUID.Zero;
lock (m_host.TaskInventory) m_host.TaskInventory.LockItemsForRead(true);
{
foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
{ {
if (inv.Value.Name == animation) if (inv.Value.Name == animation)
@ -772,7 +770,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
continue; continue;
} }
} }
} m_host.TaskInventory.LockItemsForRead(false);
if (animID == UUID.Zero) if (animID == UUID.Zero)
target.Animator.RemoveAnimation(animation); target.Animator.RemoveAnimation(animation);
@ -1541,6 +1539,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (!UUID.TryParse(name, out assetID)) if (!UUID.TryParse(name, out assetID))
{ {
m_host.TaskInventory.LockItemsForRead(true);
foreach (TaskInventoryItem item in m_host.TaskInventory.Values) foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
{ {
if (item.Type == 7 && item.Name == name) if (item.Type == 7 && item.Name == name)
@ -1548,6 +1547,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
assetID = item.AssetID; assetID = item.AssetID;
} }
} }
m_host.TaskInventory.LockItemsForRead(false);
} }
if (assetID == UUID.Zero) if (assetID == UUID.Zero)
@ -1594,6 +1594,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (!UUID.TryParse(name, out assetID)) if (!UUID.TryParse(name, out assetID))
{ {
m_host.TaskInventory.LockItemsForRead(true);
foreach (TaskInventoryItem item in m_host.TaskInventory.Values) foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
{ {
if (item.Type == 7 && item.Name == name) if (item.Type == 7 && item.Name == name)
@ -1601,6 +1602,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
assetID = item.AssetID; assetID = item.AssetID;
} }
} }
m_host.TaskInventory.LockItemsForRead(false);
} }
if (assetID == UUID.Zero) if (assetID == UUID.Zero)
@ -1651,6 +1653,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (!UUID.TryParse(name, out assetID)) if (!UUID.TryParse(name, out assetID))
{ {
m_host.TaskInventory.LockItemsForRead(true);
foreach (TaskInventoryItem item in m_host.TaskInventory.Values) foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
{ {
if (item.Type == 7 && item.Name == name) if (item.Type == 7 && item.Name == name)
@ -1658,6 +1661,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
assetID = item.AssetID; assetID = item.AssetID;
} }
} }
m_host.TaskInventory.LockItemsForRead(false);
} }
if (assetID == UUID.Zero) if (assetID == UUID.Zero)

View File

@ -27,6 +27,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; //for [DebuggerNonUserCode]
using System.Reflection; using System.Reflection;
using System.Runtime.Remoting.Lifetime; using System.Runtime.Remoting.Lifetime;
using OpenSim.Region.ScriptEngine.Shared; using OpenSim.Region.ScriptEngine.Shared;
@ -131,6 +132,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
return (eventFlags); return (eventFlags);
} }
[DebuggerNonUserCode]
public void ExecuteEvent(string state, string FunctionName, object[] args) public void ExecuteEvent(string state, string FunctionName, object[] args)
{ {
// IMPORTANT: Types and MemberInfo-derived objects require a LOT of memory. // IMPORTANT: Types and MemberInfo-derived objects require a LOT of memory.

View File

@ -33,6 +33,7 @@ using System.Threading;
using System.Reflection; using System.Reflection;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; //for [DebuggerNonUserCode]
using OpenSim.Region.ScriptEngine.Interfaces; using OpenSim.Region.ScriptEngine.Interfaces;
using OpenSim.Region.ScriptEngine.Shared; using OpenSim.Region.ScriptEngine.Shared;
using OpenSim.Region.ScriptEngine.Shared.Api.Runtime; using OpenSim.Region.ScriptEngine.Shared.Api.Runtime;
@ -90,6 +91,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
return (int)m_Executor.GetStateEventFlags(state); return (int)m_Executor.GetStateEventFlags(state);
} }
[DebuggerNonUserCode]
public void ExecuteEvent(string state, string FunctionName, object[] args) public void ExecuteEvent(string state, string FunctionName, object[] args)
{ {
m_Executor.ExecuteEvent(state, FunctionName, args); m_Executor.ExecuteEvent(state, FunctionName, args);

View File

@ -27,6 +27,7 @@
using System; using System;
using System.IO; using System.IO;
using System.Diagnostics; //for [DebuggerNonUserCode]
using System.Runtime.Remoting; using System.Runtime.Remoting;
using System.Runtime.Remoting.Lifetime; using System.Runtime.Remoting.Lifetime;
using System.Threading; using System.Threading;
@ -237,13 +238,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
if (part != null) if (part != null)
{ {
lock (part.TaskInventory) part.TaskInventory.LockItemsForRead(true);
{
if (part.TaskInventory.ContainsKey(m_ItemID)) if (part.TaskInventory.ContainsKey(m_ItemID))
{ {
m_thisScriptTask = part.TaskInventory[m_ItemID]; m_thisScriptTask = part.TaskInventory[m_ItemID];
} }
} part.TaskInventory.LockItemsForRead(false);
} }
ApiManager am = new ApiManager(); ApiManager am = new ApiManager();
@ -428,14 +428,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
{ {
int permsMask; int permsMask;
UUID permsGranter; UUID permsGranter;
lock (part.TaskInventory) part.TaskInventory.LockItemsForRead(true);
{
if (!part.TaskInventory.ContainsKey(m_ItemID)) if (!part.TaskInventory.ContainsKey(m_ItemID))
{
part.TaskInventory.LockItemsForRead(false);
return; return;
}
permsGranter = part.TaskInventory[m_ItemID].PermsGranter; permsGranter = part.TaskInventory[m_ItemID].PermsGranter;
permsMask = part.TaskInventory[m_ItemID].PermsMask; permsMask = part.TaskInventory[m_ItemID].PermsMask;
} part.TaskInventory.LockItemsForRead(false);
if ((permsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) if ((permsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0)
{ {
@ -544,6 +545,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
return true; return true;
} }
[DebuggerNonUserCode] //Prevents the debugger from farting in this function
public void SetState(string state) public void SetState(string state)
{ {
if (state == State) if (state == State)
@ -638,11 +640,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
/// <returns></returns> /// <returns></returns>
public object EventProcessor() public object EventProcessor()
{ {
lock (m_Script)
{
EventParams data = null; EventParams data = null;
lock (m_EventQueue) lock (m_EventQueue)
{
lock (m_Script)
{ {
data = (EventParams) m_EventQueue.Dequeue(); data = (EventParams) m_EventQueue.Dequeue();
if (data == null) // Shouldn't happen if (data == null) // Shouldn't happen
@ -668,6 +671,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
if (data.EventName == "collision") if (data.EventName == "collision")
m_CollisionInQueue = false; m_CollisionInQueue = false;
} }
}
lock(m_Script)
{
//m_log.DebugFormat("[XENGINE]: Processing event {0} for {1}", data.EventName, this); //m_log.DebugFormat("[XENGINE]: Processing event {0} for {1}", data.EventName, this);
@ -675,8 +681,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
if (data.EventName == "state") // Hardcoded state change if (data.EventName == "state") // Hardcoded state change
{ {
// m_log.DebugFormat("[Script] Script {0}.{1} state set to {2}", // m_log.DebugFormat("[Script] Script {0}.{1} state set to {2}",
// m_PrimName, m_ScriptName, data.Params[0].ToString()); // m_PrimName, m_ScriptName, data.Params[0].ToString());
m_State=data.Params[0].ToString(); m_State=data.Params[0].ToString();
AsyncCommandManager.RemoveScript(m_Engine, AsyncCommandManager.RemoveScript(m_Engine,
m_LocalID, m_ItemID); m_LocalID, m_ItemID);
@ -824,6 +830,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
new Object[0], new DetectParams[0])); new Object[0], new DetectParams[0]));
} }
[DebuggerNonUserCode] //Stops the VS debugger from farting in this function
public void ApiResetScript() public void ApiResetScript()
{ {
// bool running = Running; // bool running = Running;

View File

@ -30,6 +30,7 @@ using System.IO;
using System.Threading; using System.Threading;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; //for [DebuggerNonUserCode]
using System.Security; using System.Security;
using System.Security.Policy; using System.Security.Policy;
using System.Reflection; using System.Reflection;
@ -1119,6 +1120,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
return false; return false;
} }
[DebuggerNonUserCode]
public void ApiResetScript(UUID itemID) public void ApiResetScript(UUID itemID)
{ {
IScriptInstance instance = GetInstance(itemID); IScriptInstance instance = GetInstance(itemID);
@ -1170,6 +1172,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
return UUID.Zero; return UUID.Zero;
} }
[DebuggerNonUserCode]
public void SetState(UUID itemID, string newState) public void SetState(UUID itemID, string newState)
{ {
IScriptInstance instance = GetInstance(itemID); IScriptInstance instance = GetInstance(itemID);