Drop all locking of part.TaskInventory in favour of a ReaderWriterLockSlim lock handler. This gives us:
- Faster prim inventory actions. Multiple threads can read at once. - Fixes the known prim inventory thread locks - In the event of a thread lock occurring, it will usually self heal after sixty seconds with an error message in the consoleavinationmerge
parent
247c66b3fe
commit
d114713694
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -246,21 +246,20 @@ 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;
|
||||||
|
foreach (KeyValuePair<UUID, TaskInventoryItem> kvp in inv)
|
||||||
{
|
{
|
||||||
TaskInventoryDictionary inv = part.TaskInventory;
|
if (!ResolveUserUuid(kvp.Value.OwnerID))
|
||||||
foreach (KeyValuePair<UUID, TaskInventoryItem> kvp in inv)
|
|
||||||
{
|
{
|
||||||
if (!ResolveUserUuid(kvp.Value.OwnerID))
|
kvp.Value.OwnerID = masterAvatarId;
|
||||||
{
|
}
|
||||||
kvp.Value.OwnerID = masterAvatarId;
|
if (!ResolveUserUuid(kvp.Value.CreatorID))
|
||||||
}
|
{
|
||||||
if (!ResolveUserUuid(kvp.Value.CreatorID))
|
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))
|
||||||
|
|
|
@ -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,17 +2105,18 @@ 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)
|
soundID = item.Value.ItemID;
|
||||||
{
|
break;
|
||||||
soundID = item.Value.ItemID;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TaskInventory.LockItemsForRead(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<ScenePresence> avatarts = m_parentGroup.Scene.GetAvatars();
|
List<ScenePresence> avatarts = m_parentGroup.Scene.GetAvatars();
|
||||||
|
@ -2457,17 +2462,16 @@ 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)
|
soundID = item.Value.ItemID;
|
||||||
{
|
break;
|
||||||
soundID = item.Value.ItemID;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
TaskInventory.LockItemsForRead(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (soundID == UUID.Zero)
|
if (soundID == UUID.Zero)
|
||||||
|
|
|
@ -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,22 +118,25 @@ 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;
|
|
||||||
m_part.ParentGroup.HasGroupChanged = true;
|
|
||||||
IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values);
|
|
||||||
Items.Clear();
|
|
||||||
|
|
||||||
foreach (TaskInventoryItem item in items)
|
|
||||||
{
|
|
||||||
item.ResetIDs(m_part.UUID);
|
|
||||||
Items.Add(item.ItemID, item);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HasInventoryChanged = true;
|
||||||
|
m_part.ParentGroup.HasGroupChanged = true;
|
||||||
|
IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values);
|
||||||
|
Items.Clear();
|
||||||
|
|
||||||
|
foreach (TaskInventoryItem item in items)
|
||||||
|
{
|
||||||
|
item.ResetIDs(m_part.UUID);
|
||||||
|
Items.Add(item.ItemID, item);
|
||||||
|
}
|
||||||
|
m_items.LockItemsForWrite(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -140,25 +145,25 @@ 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;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
HasInventoryChanged = true;
|
HasInventoryChanged = true;
|
||||||
m_part.ParentGroup.HasGroupChanged = true;
|
m_part.ParentGroup.HasGroupChanged = true;
|
||||||
IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values);
|
IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values);
|
||||||
foreach (TaskInventoryItem item in items)
|
foreach (TaskInventoryItem item in items)
|
||||||
|
{
|
||||||
|
if (ownerId != item.OwnerID)
|
||||||
{
|
{
|
||||||
if (ownerId != item.OwnerID)
|
item.LastOwnerID = item.OwnerID;
|
||||||
{
|
item.OwnerID = ownerId;
|
||||||
item.LastOwnerID = item.OwnerID;
|
|
||||||
item.OwnerID = ownerId;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
m_items.LockItemsForWrite(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -167,24 +172,24 @@ 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;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
HasInventoryChanged = true;
|
HasInventoryChanged = true;
|
||||||
m_part.ParentGroup.HasGroupChanged = true;
|
m_part.ParentGroup.HasGroupChanged = true;
|
||||||
IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values);
|
IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values);
|
||||||
foreach (TaskInventoryItem item in items)
|
foreach (TaskInventoryItem item in items)
|
||||||
|
{
|
||||||
|
if (groupID != item.GroupID)
|
||||||
{
|
{
|
||||||
if (groupID != item.GroupID)
|
item.GroupID = groupID;
|
||||||
{
|
|
||||||
item.GroupID = groupID;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
m_items.LockItemsForWrite(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -192,14 +197,14 @@ 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);
|
||||||
|
Items.LockItemsForRead(false);
|
||||||
|
foreach (TaskInventoryItem item in items)
|
||||||
{
|
{
|
||||||
foreach (TaskInventoryItem item in Items.Values)
|
if ((int)InventoryType.LSL == item.InvType)
|
||||||
{
|
{
|
||||||
if ((int)InventoryType.LSL == item.InvType)
|
CreateScriptInstance(item, startParam, postOnRez, engine, stateSource);
|
||||||
{
|
|
||||||
CreateScriptInstance(item, startParam, postOnRez, engine, stateSource);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -209,17 +214,20 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void RemoveScriptInstances()
|
public void RemoveScriptInstances()
|
||||||
{
|
{
|
||||||
lock (Items)
|
Items.LockItemsForRead(true);
|
||||||
|
IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values);
|
||||||
|
Items.LockItemsForRead(false);
|
||||||
|
|
||||||
|
foreach (TaskInventoryItem item in items)
|
||||||
{
|
{
|
||||||
foreach (TaskInventoryItem item in Items.Values)
|
if ((int)InventoryType.LSL == item.InvType)
|
||||||
{
|
{
|
||||||
if ((int)InventoryType.LSL == item.InvType)
|
RemoveScriptInstance(item.ItemID);
|
||||||
{
|
m_part.RemoveScriptEvents(item.ItemID);
|
||||||
RemoveScriptInstance(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))
|
TaskInventoryItem item = m_items[itemId];
|
||||||
{
|
m_items.LockItemsForRead(false);
|
||||||
CreateScriptInstance(m_items[itemId], startParam, postOnRez, engine, stateSource);
|
CreateScriptInstance(item, startParam, postOnRez, engine, stateSource);
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_log.ErrorFormat(
|
|
||||||
"[PRIM INVENTORY]: " +
|
|
||||||
"Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2}",
|
|
||||||
itemId, m_part.Name, m_part.UUID);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_items.LockItemsForRead(false);
|
||||||
|
m_log.ErrorFormat(
|
||||||
|
"[PRIM INVENTORY]: " +
|
||||||
|
"Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2}",
|
||||||
|
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_part.TriggerScriptChangedEvent(Changed.INVENTORY);
|
||||||
m_items.Add(item.ItemID, item);
|
|
||||||
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,45 +507,45 @@ 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.ParentPartID = m_part.UUID;
|
||||||
|
item.Flags = m_items[item.ItemID].Flags;
|
||||||
|
if (item.AssetID == UUID.Zero)
|
||||||
{
|
{
|
||||||
item.ParentID = m_part.UUID;
|
item.AssetID = m_items[item.ItemID].AssetID;
|
||||||
item.ParentPartID = m_part.UUID;
|
|
||||||
item.Flags = m_items[item.ItemID].Flags;
|
|
||||||
if (item.AssetID == UUID.Zero)
|
|
||||||
{
|
|
||||||
item.AssetID = m_items[item.ItemID].AssetID;
|
|
||||||
}
|
|
||||||
else if ((InventoryType)item.Type == InventoryType.Notecard)
|
|
||||||
{
|
|
||||||
ScenePresence presence = m_part.ParentGroup.Scene.GetScenePresence(item.OwnerID);
|
|
||||||
|
|
||||||
if (presence != null)
|
|
||||||
{
|
|
||||||
presence.ControllingClient.SendAgentAlertMessage(
|
|
||||||
"Notecard saved", false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m_items[item.ItemID] = item;
|
|
||||||
m_inventorySerial++;
|
|
||||||
m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
|
|
||||||
|
|
||||||
HasInventoryChanged = true;
|
|
||||||
m_part.ParentGroup.HasGroupChanged = true;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
else
|
else if ((InventoryType)item.Type == InventoryType.Notecard)
|
||||||
{
|
{
|
||||||
m_log.ErrorFormat(
|
ScenePresence presence = m_part.ParentGroup.Scene.GetScenePresence(item.OwnerID);
|
||||||
"[PRIM INVENTORY]: " +
|
|
||||||
"Tried to retrieve item ID {0} from prim {1}, {2} but the item does not exist in this inventory",
|
if (presence != null)
|
||||||
item.ItemID, m_part.Name, m_part.UUID);
|
{
|
||||||
|
presence.ControllingClient.SendAgentAlertMessage(
|
||||||
|
"Notecard saved", false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_items[item.ItemID] = item;
|
||||||
|
m_inventorySerial++;
|
||||||
|
m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
|
||||||
|
|
||||||
|
HasInventoryChanged = true;
|
||||||
|
m_part.ParentGroup.HasGroupChanged = true;
|
||||||
|
m_items.LockItemsForWrite(false);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_log.ErrorFormat(
|
||||||
|
"[PRIM 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);
|
||||||
|
}
|
||||||
|
m_items.LockItemsForWrite(false);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -538,51 +558,54 @@ 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;
|
||||||
|
m_items.LockItemsForRead(false);
|
||||||
|
if (type == 10) // Script
|
||||||
{
|
{
|
||||||
int type = m_items[itemID].InvType;
|
m_part.ParentGroup.Scene.EventManager.TriggerRemoveScript(m_part.LocalId, itemID);
|
||||||
if (type == 10) // Script
|
|
||||||
{
|
|
||||||
m_part.ParentGroup.Scene.EventManager.TriggerRemoveScript(m_part.LocalId, itemID);
|
|
||||||
}
|
|
||||||
m_items.Remove(itemID);
|
|
||||||
m_inventorySerial++;
|
|
||||||
m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
|
|
||||||
|
|
||||||
HasInventoryChanged = true;
|
|
||||||
m_part.ParentGroup.HasGroupChanged = true;
|
|
||||||
|
|
||||||
int scriptcount = 0;
|
|
||||||
lock (m_items)
|
|
||||||
{
|
|
||||||
foreach (TaskInventoryItem item in m_items.Values)
|
|
||||||
{
|
|
||||||
if (item.Type == 10)
|
|
||||||
{
|
|
||||||
scriptcount++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (scriptcount <= 0)
|
|
||||||
{
|
|
||||||
m_part.RemFlag(PrimFlags.Scripted);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_part.ScheduleFullUpdate();
|
|
||||||
|
|
||||||
return type;
|
|
||||||
}
|
}
|
||||||
else
|
m_items.LockItemsForWrite(true);
|
||||||
|
m_items.Remove(itemID);
|
||||||
|
m_items.LockItemsForWrite(false);
|
||||||
|
m_inventorySerial++;
|
||||||
|
m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
|
||||||
|
|
||||||
|
HasInventoryChanged = true;
|
||||||
|
m_part.ParentGroup.HasGroupChanged = true;
|
||||||
|
|
||||||
|
int scriptcount = 0;
|
||||||
|
m_items.LockItemsForRead(true);
|
||||||
|
foreach (TaskInventoryItem item in m_items.Values)
|
||||||
{
|
{
|
||||||
m_log.ErrorFormat(
|
if (item.Type == 10)
|
||||||
"[PRIM INVENTORY]: " +
|
{
|
||||||
"Tried to remove item ID {0} from prim {1}, {2} but the item does not exist in this inventory",
|
scriptcount++;
|
||||||
itemID, m_part.Name, m_part.UUID);
|
}
|
||||||
}
|
}
|
||||||
|
m_items.LockItemsForRead(false);
|
||||||
|
|
||||||
|
|
||||||
|
if (scriptcount <= 0)
|
||||||
|
{
|
||||||
|
m_part.RemFlag(PrimFlags.Scripted);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_part.ScheduleFullUpdate();
|
||||||
|
|
||||||
|
return type;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_log.ErrorFormat(
|
||||||
|
"[PRIM 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);
|
||||||
|
}
|
||||||
|
m_items.LockItemsForWrite(false);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -635,52 +658,53 @@ 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;
|
||||||
{
|
uint everyoneMask = 0;
|
||||||
UUID ownerID = item.OwnerID;
|
uint baseMask = item.BasePermissions;
|
||||||
uint everyoneMask = 0;
|
uint ownerMask = item.CurrentPermissions;
|
||||||
uint baseMask = item.BasePermissions;
|
|
||||||
uint ownerMask = item.CurrentPermissions;
|
|
||||||
|
|
||||||
invString.AddItemStart();
|
invString.AddItemStart();
|
||||||
invString.AddNameValueLine("item_id", item.ItemID.ToString());
|
invString.AddNameValueLine("item_id", item.ItemID.ToString());
|
||||||
invString.AddNameValueLine("parent_id", m_part.UUID.ToString());
|
invString.AddNameValueLine("parent_id", m_part.UUID.ToString());
|
||||||
|
|
||||||
invString.AddPermissionsStart();
|
invString.AddPermissionsStart();
|
||||||
|
|
||||||
invString.AddNameValueLine("base_mask", Utils.UIntToHexString(baseMask));
|
invString.AddNameValueLine("base_mask", Utils.UIntToHexString(baseMask));
|
||||||
invString.AddNameValueLine("owner_mask", Utils.UIntToHexString(ownerMask));
|
invString.AddNameValueLine("owner_mask", Utils.UIntToHexString(ownerMask));
|
||||||
invString.AddNameValueLine("group_mask", Utils.UIntToHexString(0));
|
invString.AddNameValueLine("group_mask", Utils.UIntToHexString(0));
|
||||||
invString.AddNameValueLine("everyone_mask", Utils.UIntToHexString(everyoneMask));
|
invString.AddNameValueLine("everyone_mask", Utils.UIntToHexString(everyoneMask));
|
||||||
invString.AddNameValueLine("next_owner_mask", Utils.UIntToHexString(item.NextPermissions));
|
invString.AddNameValueLine("next_owner_mask", Utils.UIntToHexString(item.NextPermissions));
|
||||||
|
|
||||||
invString.AddNameValueLine("creator_id", item.CreatorID.ToString());
|
invString.AddNameValueLine("creator_id", item.CreatorID.ToString());
|
||||||
invString.AddNameValueLine("owner_id", ownerID.ToString());
|
invString.AddNameValueLine("owner_id", ownerID.ToString());
|
||||||
|
|
||||||
invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString());
|
invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString());
|
||||||
|
|
||||||
invString.AddNameValueLine("group_id", item.GroupID.ToString());
|
invString.AddNameValueLine("group_id", item.GroupID.ToString());
|
||||||
invString.AddSectionEnd();
|
invString.AddSectionEnd();
|
||||||
|
|
||||||
invString.AddNameValueLine("asset_id", item.AssetID.ToString());
|
invString.AddNameValueLine("asset_id", item.AssetID.ToString());
|
||||||
invString.AddNameValueLine("type", TaskInventoryItem.Types[item.Type]);
|
invString.AddNameValueLine("type", TaskInventoryItem.Types[item.Type]);
|
||||||
invString.AddNameValueLine("inv_type", TaskInventoryItem.InvTypes[item.InvType]);
|
invString.AddNameValueLine("inv_type", TaskInventoryItem.InvTypes[item.InvType]);
|
||||||
invString.AddNameValueLine("flags", Utils.UIntToHexString(item.Flags));
|
invString.AddNameValueLine("flags", Utils.UIntToHexString(item.Flags));
|
||||||
|
|
||||||
invString.AddSaleStart();
|
invString.AddSaleStart();
|
||||||
invString.AddNameValueLine("sale_type", "not");
|
invString.AddNameValueLine("sale_type", "not");
|
||||||
invString.AddNameValueLine("sale_price", "0");
|
invString.AddNameValueLine("sale_price", "0");
|
||||||
invString.AddSectionEnd();
|
invString.AddSectionEnd();
|
||||||
|
|
||||||
invString.AddNameValueLine("name", item.Name + "|");
|
invString.AddNameValueLine("name", item.Name + "|");
|
||||||
invString.AddNameValueLine("desc", item.Description + "|");
|
invString.AddNameValueLine("desc", item.Description + "|");
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
|
@ -689,6 +713,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
if (fileData.Length > 2)
|
if (fileData.Length > 2)
|
||||||
{
|
{
|
||||||
|
m_log.Debug("Sending task inventory list of " + count.ToString() + " items to client " + client.AgentId.ToString());
|
||||||
xferManager.AddNewFile(m_inventoryFileName, fileData);
|
xferManager.AddNewFile(m_inventoryFileName, fileData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -701,10 +726,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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1615,21 +1615,19 @@ 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)
|
UnRegisterControlEventsToScript(LocalId, taskID);
|
||||||
{
|
taskIDict[taskID].PermsMask &= ~(
|
||||||
UnRegisterControlEventsToScript(LocalId, taskID);
|
2048 | //PERMISSION_CONTROL_CAMERA
|
||||||
taskIDict[taskID].PermsMask &= ~(
|
4); // PERMISSION_TAKE_CONTROLS
|
||||||
2048 | //PERMISSION_CONTROL_CAMERA
|
|
||||||
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);
|
||||||
|
|
|
@ -275,40 +275,48 @@ 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())
|
||||||
{
|
{
|
||||||
foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
|
m_host.TaskInventory.LockItemsForRead(true);
|
||||||
|
unlock = true;
|
||||||
|
}
|
||||||
|
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)
|
invItemID = inv.Key;
|
||||||
{
|
break;
|
||||||
invItemID = inv.Key;
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -316,17 +324,21 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2537,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;
|
||||||
|
@ -2617,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)
|
||||||
|
@ -2750,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
|
|
||||||
item = m_host.TaskInventory[InventorySelf()];
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
item = m_host.TaskInventory[InventorySelf()];
|
||||||
|
}
|
||||||
|
m_host.TaskInventory.LockItemsForRead(false);
|
||||||
|
|
||||||
if (item.PermsGranter != UUID.Zero)
|
if (item.PermsGranter != UUID.Zero)
|
||||||
{
|
{
|
||||||
|
@ -2778,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);
|
||||||
|
|
||||||
|
@ -2821,13 +2843,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
|
|
||||||
item = m_host.TaskInventory[InventorySelf()];
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
item = m_host.TaskInventory[InventorySelf()];
|
||||||
|
}
|
||||||
|
|
||||||
|
m_host.TaskInventory.LockItemsForRead(false);
|
||||||
|
|
||||||
if (item.PermsGranter != m_host.OwnerID)
|
if (item.PermsGranter != m_host.OwnerID)
|
||||||
return;
|
return;
|
||||||
|
@ -2853,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
|
|
||||||
item = m_host.TaskInventory[InventorySelf()];
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
item = m_host.TaskInventory[InventorySelf()];
|
||||||
|
}
|
||||||
|
m_host.TaskInventory.LockItemsForRead(false);
|
||||||
|
|
||||||
|
|
||||||
if (item.PermsGranter != m_host.OwnerID)
|
if (item.PermsGranter != m_host.OwnerID)
|
||||||
return;
|
return;
|
||||||
|
@ -3083,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
|
|
||||||
item = m_host.TaskInventory[InventorySelf()];
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
item = m_host.TaskInventory[InventorySelf()];
|
||||||
|
}
|
||||||
|
m_host.TaskInventory.LockItemsForRead(false);
|
||||||
if (item.PermsGranter == UUID.Zero)
|
if (item.PermsGranter == UUID.Zero)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -3120,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
|
|
||||||
item = m_host.TaskInventory[InventorySelf()];
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
item = m_host.TaskInventory[InventorySelf()];
|
||||||
|
}
|
||||||
|
m_host.TaskInventory.LockItemsForRead(false);
|
||||||
|
|
||||||
|
|
||||||
if (item.PermsGranter == UUID.Zero)
|
if (item.PermsGranter == UUID.Zero)
|
||||||
return;
|
return;
|
||||||
|
@ -3199,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
|
||||||
{
|
{
|
||||||
|
@ -3234,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[] {
|
||||||
|
@ -3258,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[] {
|
||||||
|
@ -3283,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;
|
||||||
|
@ -3322,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[] {
|
||||||
|
@ -3337,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();
|
||||||
}
|
}
|
||||||
|
@ -3355,19 +3404,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 (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)
|
int perms = item.PermsMask;
|
||||||
{
|
if (m_automaticLinkPermission)
|
||||||
int perms = item.PermsMask;
|
perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
|
||||||
if (m_automaticLinkPermission)
|
m_host.TaskInventory.LockItemsForRead(false);
|
||||||
perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
|
return perms;
|
||||||
return perms;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
m_host.TaskInventory.LockItemsForRead(false);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -3400,11 +3450,10 @@ 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)
|
||||||
{
|
{
|
||||||
|
@ -3457,16 +3506,16 @@ 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;
|
||||||
|
|
||||||
|
@ -3635,17 +3684,16 @@ 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)
|
count = count + 1;
|
||||||
{
|
|
||||||
count = count + 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_host.TaskInventory.LockItemsForRead(false);
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3654,16 +3702,15 @@ 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)
|
keys.Add(inv.Value.Name);
|
||||||
{
|
|
||||||
keys.Add(inv.Value.Name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
m_host.TaskInventory.LockItemsForRead(false);
|
||||||
|
|
||||||
if (keys.Count == 0)
|
if (keys.Count == 0)
|
||||||
{
|
{
|
||||||
|
@ -3700,20 +3747,19 @@ 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)
|
found = true;
|
||||||
{
|
objId = inv.Key;
|
||||||
found = true;
|
assetType = inv.Value.Type;
|
||||||
objId = inv.Key;
|
objName = inv.Value.Name;
|
||||||
assetType = inv.Value.Type;
|
break;
|
||||||
objName = inv.Value.Name;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
m_host.TaskInventory.LockItemsForRead(false);
|
||||||
|
|
||||||
if (!found)
|
if (!found)
|
||||||
{
|
{
|
||||||
|
@ -3763,20 +3809,21 @@ 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.Name == name)
|
||||||
{
|
{
|
||||||
if (item.Name == name)
|
if (item.ItemID == m_itemID)
|
||||||
{
|
throw new ScriptDeleteException();
|
||||||
if (item.ItemID == m_itemID)
|
else
|
||||||
throw new ScriptDeleteException();
|
m_host.Inventory.RemoveInventoryItem(item.ItemID);
|
||||||
else
|
|
||||||
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)
|
||||||
|
@ -3865,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)
|
||||||
|
@ -3955,17 +4003,16 @@ 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)
|
soundId = item.AssetID;
|
||||||
{
|
break;
|
||||||
soundId = item.AssetID;
|
|
||||||
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;
|
||||||
|
@ -4011,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)
|
||||||
|
@ -4218,17 +4266,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 (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)
|
result = item.Name!=null?item.Name:String.Empty;
|
||||||
{
|
break;
|
||||||
result = item.Name!=null?item.Name:String.Empty;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
m_host.TaskInventory.LockItemsForRead(false);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -4486,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();
|
||||||
}
|
}
|
||||||
|
@ -5997,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;
|
||||||
}
|
}
|
||||||
|
@ -6315,22 +6365,21 @@ 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)
|
// make sure the object is a script
|
||||||
|
if (10 == inv.Value.Type)
|
||||||
{
|
{
|
||||||
// make sure the object is a script
|
found = true;
|
||||||
if (10 == inv.Value.Type)
|
srcId = inv.Key;
|
||||||
{
|
break;
|
||||||
found = true;
|
|
||||||
srcId = inv.Key;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
m_host.TaskInventory.LockItemsForRead(false);
|
||||||
|
|
||||||
if (!found)
|
if (!found)
|
||||||
{
|
{
|
||||||
|
@ -8133,28 +8182,28 @@ 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:
|
||||||
{
|
return (int)inv.Value.BasePermissions;
|
||||||
case 0:
|
case 1:
|
||||||
return (int)inv.Value.BasePermissions;
|
return (int)inv.Value.CurrentPermissions;
|
||||||
case 1:
|
case 2:
|
||||||
return (int)inv.Value.CurrentPermissions;
|
return (int)inv.Value.GroupPermissions;
|
||||||
case 2:
|
case 3:
|
||||||
return (int)inv.Value.GroupPermissions;
|
return (int)inv.Value.EveryonePermissions;
|
||||||
case 3:
|
case 4:
|
||||||
return (int)inv.Value.EveryonePermissions;
|
return (int)inv.Value.NextPermissions;
|
||||||
case 4:
|
|
||||||
return (int)inv.Value.NextPermissions;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
m_host.TaskInventory.LockItemsForRead(false);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -8169,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 + "'");
|
||||||
|
|
||||||
|
@ -8702,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;
|
||||||
}
|
}
|
||||||
|
@ -8742,18 +8791,21 @@ 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)
|
|
||||||
{
|
|
||||||
ShoutError("No permissions to track the camera");
|
|
||||||
return new LSL_Vector();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
|
||||||
|
{
|
||||||
|
ShoutError("No permissions to track the camera");
|
||||||
|
m_host.TaskInventory.LockItemsForRead(false);
|
||||||
|
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)
|
||||||
{
|
{
|
||||||
|
@ -8770,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)
|
|
||||||
{
|
|
||||||
ShoutError("No permissions to track the camera");
|
|
||||||
return new LSL_Rotation();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
|
||||||
|
{
|
||||||
|
ShoutError("No permissions to track the camera");
|
||||||
|
m_host.TaskInventory.LockItemsForRead(false);
|
||||||
|
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)
|
||||||
|
@ -8930,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);
|
||||||
|
|
||||||
|
@ -8987,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;
|
||||||
|
if (agentID == UUID.Zero)
|
||||||
{
|
{
|
||||||
agentID = m_host.TaskInventory[invItemID].PermsGranter;
|
m_host.TaskInventory.LockItemsForRead(false);
|
||||||
if (agentID == UUID.Zero) return;
|
return;
|
||||||
if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) 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);
|
||||||
|
|
||||||
|
@ -9449,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9498,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;
|
||||||
|
@ -9560,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;
|
||||||
|
|
|
@ -728,18 +728,17 @@ 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)
|
if (inv.Value.Type == (int)AssetType.Animation)
|
||||||
{
|
animID = inv.Value.AssetID;
|
||||||
if (inv.Value.Type == (int)AssetType.Animation)
|
continue;
|
||||||
animID = inv.Value.AssetID;
|
|
||||||
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,18 +760,17 @@ 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)
|
if (inv.Value.Type == (int)AssetType.Animation)
|
||||||
{
|
animID = inv.Value.AssetID;
|
||||||
if (inv.Value.Type == (int)AssetType.Animation)
|
continue;
|
||||||
animID = inv.Value.AssetID;
|
|
||||||
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)
|
||||||
|
|
|
@ -238,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();
|
||||||
|
@ -429,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;
|
|
||||||
permsMask = part.TaskInventory[m_ItemID].PermsMask;
|
|
||||||
}
|
}
|
||||||
|
permsGranter = part.TaskInventory[m_ItemID].PermsGranter;
|
||||||
|
permsMask = part.TaskInventory[m_ItemID].PermsMask;
|
||||||
|
part.TaskInventory.LockItemsForRead(false);
|
||||||
|
|
||||||
if ((permsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0)
|
if ((permsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue