diff --git a/LibreMetaverse/Inventory.cs b/LibreMetaverse/Inventory.cs index de60671a..06cebb35 100644 --- a/LibreMetaverse/Inventory.cs +++ b/LibreMetaverse/Inventory.cs @@ -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 Items; + private ConcurrentDictionary 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(); + Items = new ConcurrentDictionary(); } public List 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(); } diff --git a/LibreMetaverse/InventoryManager.cs b/LibreMetaverse/InventoryManager.cs index 5bde8661..03eca499 100644 --- a/LibreMetaverse/InventoryManager.cs +++ b/LibreMetaverse/InventoryManager.cs @@ -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) {