Back Inventory using ConcurrentDictionary, tighten up access in Inventory class.
This commit is contained in:
@@ -26,6 +26,7 @@
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
@@ -169,19 +170,18 @@ namespace OpenMetaverse
|
||||
|
||||
private GridClient Client;
|
||||
//private InventoryManager Manager;
|
||||
public Dictionary<UUID, InventoryNode> Items;
|
||||
private ConcurrentDictionary<UUID, InventoryNode> Items;
|
||||
|
||||
public Inventory(GridClient client, InventoryManager manager)
|
||||
: this(client, manager, client.Self.AgentID) { }
|
||||
public Inventory(GridClient client)
|
||||
: this(client, client.Self.AgentID) { }
|
||||
|
||||
public Inventory(GridClient client, InventoryManager manager, UUID owner)
|
||||
public Inventory(GridClient client, UUID owner)
|
||||
{
|
||||
Client = client;
|
||||
//Manager = manager;
|
||||
Owner = owner;
|
||||
if (owner == UUID.Zero)
|
||||
Logger.Log("Inventory owned by nobody!", Helpers.LogLevel.Warning, Client);
|
||||
Items = new Dictionary<UUID, InventoryNode>();
|
||||
Items = new ConcurrentDictionary<UUID, InventoryNode>();
|
||||
}
|
||||
|
||||
public List<InventoryBase> GetContents(InventoryFolder folder)
|
||||
@@ -268,8 +268,8 @@ namespace OpenMetaverse
|
||||
else // We're adding.
|
||||
{
|
||||
itemNode = new InventoryNode(item, itemParent);
|
||||
Items.Add(item.UUID, itemNode);
|
||||
if (m_InventoryObjectAdded != null)
|
||||
bool added = Items.TryAdd(item.UUID, itemNode);
|
||||
if (added && m_InventoryObjectAdded != null)
|
||||
{
|
||||
OnInventoryObjectAdded(new InventoryObjectAddedEventArgs(item));
|
||||
}
|
||||
@@ -298,8 +298,8 @@ namespace OpenMetaverse
|
||||
node.Parent.Nodes.Remove(item.UUID);
|
||||
}
|
||||
|
||||
Items.Remove(item.UUID);
|
||||
if (m_InventoryObjectRemoved != null)
|
||||
bool removed = Items.TryRemove(item.UUID, out node);
|
||||
if (removed && m_InventoryObjectRemoved != null)
|
||||
{
|
||||
OnInventoryObjectRemoved(new InventoryObjectRemovedEventArgs(item));
|
||||
}
|
||||
@@ -458,12 +458,16 @@ namespace OpenMetaverse
|
||||
|
||||
//Only add new items, this is most likely to be run at login time before any inventory
|
||||
//nodes other than the root are populated. Don't add non-existing folders.
|
||||
if (!Items.ContainsKey(node.Data.UUID) && !dirtyFolders.Contains(pnode.Data.UUID) && !(node.Data is InventoryFolder))
|
||||
if (!Items.ContainsKey(node.Data.UUID)
|
||||
&& !dirtyFolders.Contains(pnode.Data.UUID)
|
||||
&& !(node.Data is InventoryFolder))
|
||||
{
|
||||
Items.Add(node.Data.UUID, node);
|
||||
node.Parent = pnode; //Update this node with its parent
|
||||
pnode.Nodes.Add(node.Data.UUID, node); // Add to the parents child list
|
||||
itemCount++;
|
||||
if (Items.TryAdd(node.Data.UUID, node))
|
||||
{
|
||||
node.Parent = pnode; //Update this node with its parent
|
||||
pnode.Nodes.Add(node.Data.UUID, node); // Add to the parents child list
|
||||
itemCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -478,8 +482,9 @@ namespace OpenMetaverse
|
||||
|
||||
//Clean up processed nodes this loop around.
|
||||
foreach (var node in delNodes)
|
||||
{
|
||||
nodes.Remove(node);
|
||||
|
||||
}
|
||||
delNodes.Clear();
|
||||
}
|
||||
|
||||
|
||||
@@ -680,7 +680,7 @@ namespace OpenMetaverse
|
||||
{
|
||||
if (ob.IsLink() && !fastLoading)
|
||||
{
|
||||
if (Store.Items.ContainsKey(ob.AssetUUID))
|
||||
if (Store.Contains(ob.AssetUUID))
|
||||
{
|
||||
cleanedList.Add(Client.Inventory.FetchItem(ob.AssetUUID, Client.Self.AgentID, TimeSpan.FromSeconds(5)));
|
||||
}
|
||||
@@ -2370,7 +2370,7 @@ namespace OpenMetaverse
|
||||
Client.Network.SendPacket(add, simulator);
|
||||
|
||||
// Remove from store if the item is no copy
|
||||
if (Store.Items.ContainsKey(item.UUID) && Store[item.UUID] is InventoryItem invItem)
|
||||
if (Store.Contains(item.UUID) && Store[item.UUID] is InventoryItem invItem)
|
||||
{
|
||||
if ((invItem.Permissions.OwnerMask & PermissionMask.Copy) == PermissionMask.None)
|
||||
{
|
||||
@@ -2510,7 +2510,7 @@ namespace OpenMetaverse
|
||||
}
|
||||
|
||||
// Remove from store if the item is no copy
|
||||
if (Store.Items.ContainsKey(itemID) && Store[itemID] is InventoryItem item)
|
||||
if (Store.Contains(itemID) && Store[itemID] is InventoryItem item)
|
||||
{
|
||||
if ((item.Permissions.OwnerMask & PermissionMask.Copy) == PermissionMask.None)
|
||||
{
|
||||
@@ -2620,7 +2620,7 @@ namespace OpenMetaverse
|
||||
|
||||
// Remove from store if items were no copy
|
||||
foreach (var invItem in from item in items
|
||||
where Store.Items.ContainsKey(item.UUID) && Store[item.UUID] is InventoryItem
|
||||
where Store.Contains(item.UUID) && Store[item.UUID] is InventoryItem
|
||||
select (InventoryItem)Store[item.UUID] into invItem
|
||||
where (invItem.Permissions.OwnerMask & PermissionMask.Copy) == PermissionMask.None select invItem)
|
||||
{
|
||||
@@ -3643,13 +3643,11 @@ namespace OpenMetaverse
|
||||
|
||||
private void Network_OnLoginResponse(bool loginSuccess, bool redirect, string message, string reason, LoginResponseData replyData)
|
||||
{
|
||||
if (!loginSuccess) return;
|
||||
if (!loginSuccess) { return; }
|
||||
if (replyData.InventorySkeleton == null || replyData.LibrarySkeleton == null) { return; }
|
||||
|
||||
if (replyData.InventorySkeleton == null || replyData.LibrarySkeleton == null)
|
||||
return;
|
||||
|
||||
// Initialize the store here so we know who owns it:
|
||||
_Store = new Inventory(Client, this, Client.Self.AgentID);
|
||||
// Initialize the store here to link it with the owner
|
||||
_Store = new Inventory(Client, Client.Self.AgentID);
|
||||
Logger.DebugLog($"Setting InventoryRoot to {replyData.InventoryRoot}", Client);
|
||||
var rootFolder = new InventoryFolder(replyData.InventoryRoot)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user