Explorar o código

Shuffle order of code in invnetory connector GetFolderContent() calls to avoid a possible race condition

Justin Clark-Casey (justincc) %!s(int64=13) %!d(string=hai) anos
pai
achega
8fb3e71b14

+ 9 - 6
OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs

@@ -185,15 +185,18 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
         public InventoryCollection GetFolderContent(UUID userID, UUID folderID)
         {
             InventoryCollection invCol = m_InventoryService.GetFolderContent(userID, folderID);
-            Util.FireAndForget(delegate
+
+            if (UserManager != null)
             {
-                if (UserManager != null)
+                // Protect ourselves against the caller subsequently modifying the items list
+                List<InventoryItemBase> items = new List<InventoryItemBase>(invCol.Items);
+
+                Util.FireAndForget(delegate
                 {
-                    // Protect ourselves against the caller subsequently modifying the items list
-                    foreach (InventoryItemBase item in new List<InventoryItemBase>(invCol.Items))
+                    foreach (InventoryItemBase item in items)
                         UserManager.AddUser(item.CreatorIdAsUuid, item.CreatorData);
-                }
-            });
+                });
+            }
 
             return invCol;
         }

+ 9 - 6
OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs

@@ -193,15 +193,18 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
         public InventoryCollection GetFolderContent(UUID userID, UUID folderID)
         {
             InventoryCollection invCol = m_RemoteConnector.GetFolderContent(userID, folderID);
-            Util.FireAndForget(delegate
+
+            if (UserManager != null)
             {
-                if (UserManager != null)
+                // Protect ourselves against the caller subsequently modifying the items list
+                List<InventoryItemBase> items = new List<InventoryItemBase>(invCol.Items);
+
+                Util.FireAndForget(delegate
                 {
-                    // Protect ourselves against the caller subsequently modifying the items list
-                    foreach (InventoryItemBase item in new List<InventoryItemBase>(invCol.Items))
+                    foreach (InventoryItemBase item in items)
                         UserManager.AddUser(item.CreatorIdAsUuid, item.CreatorData);
-                }
-            });
+                });
+            }
 
             return invCol;
         }

+ 1 - 1
OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs

@@ -875,7 +875,7 @@ namespace OpenSim.Region.Framework.Scenes
 //                    m_log.DebugFormat(
 //                        "[PRIM INVENTORY]: Not sending inventory data for part {0} {1} {2} for {3} since no items",
 //                        m_part.Name, m_part.LocalId, m_part.UUID, client.Name);
-    
+
                     client.SendTaskInventory(m_part.UUID, 0, new byte[0]);
                     return;
                 }