Back Inventory using ConcurrentDictionary, tighten up access in Inventory class.

This commit is contained in:
cinder
2025-01-14 07:26:34 -06:00
parent db8b23d5cd
commit 86ae6842c0
2 changed files with 29 additions and 26 deletions

View File

@@ -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();
}

View File

@@ -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)
{