diff --git a/OpenSim/Data/MySQL/MySQLSimulationData.cs b/OpenSim/Data/MySQL/MySQLSimulationData.cs index f7436635ed..cc844aef76 100644 --- a/OpenSim/Data/MySQL/MySQLSimulationData.cs +++ b/OpenSim/Data/MySQL/MySQLSimulationData.cs @@ -308,7 +308,8 @@ namespace OpenSim.Data.MySQL /// the Item UUID private void RemoveItems(UUID uuid) { - lock (m_dbLock) + // locked by caller +// lock (m_dbLock) { using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) { diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 769b4e8db0..087df70a80 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2548,6 +2548,11 @@ namespace OpenSim.Region.Framework.Scenes return false; } + + public void updateScenePartGroup(SceneObjectPart part, SceneObjectGroup grp) + { + m_sceneGraph.updateScenePartGroup(part, grp); + } /// /// Move the given scene object into a new region depending on which region its absolute position has moved /// into. diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 973891bc5c..8a65b06414 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -296,13 +296,15 @@ namespace OpenSim.Region.Framework.Scenes } } + bool ret = AddSceneObject(sceneObject, attachToBackup, sendClientUpdates); + if (attachToBackup && (!alreadyPersisted)) { sceneObject.ForceInventoryPersistence(); sceneObject.HasGroupChanged = true; } - return AddSceneObject(sceneObject, attachToBackup, sendClientUpdates); + return ret; } /// @@ -319,12 +321,17 @@ namespace OpenSim.Region.Framework.Scenes /// protected internal bool AddNewSceneObject(SceneObjectGroup sceneObject, bool attachToBackup, bool sendClientUpdates) { - // Ensure that we persist this new scene object if it's not an + + + bool ret = AddSceneObject(sceneObject, attachToBackup, sendClientUpdates); + + // Ensure that we persist this new scene object if it's not an // attachment + if (attachToBackup) sceneObject.HasGroupChanged = true; - return AddSceneObject(sceneObject, attachToBackup, sendClientUpdates); + return ret; } /// @@ -432,13 +439,9 @@ namespace OpenSim.Region.Framework.Scenes sceneObject.AttachToScene(m_parentScene); - if (sendClientUpdates) - sceneObject.ScheduleGroupForFullUpdate(); Entities.Add(sceneObject); - if (attachToBackup) - sceneObject.AttachToBackup(); lock (SceneObjectGroupsByFullID) SceneObjectGroupsByFullID[sceneObject.UUID] = sceneObject; @@ -459,9 +462,29 @@ namespace OpenSim.Region.Framework.Scenes SceneObjectGroupsByLocalPartID[part.LocalId] = sceneObject; } + if (sendClientUpdates) + sceneObject.ScheduleGroupForFullUpdate(); + + if (attachToBackup) + sceneObject.AttachToBackup(); + return true; } + public void updateScenePartGroup(SceneObjectPart part, SceneObjectGroup grp) + { + // no tests, caller has responsability... + lock (SceneObjectGroupsByFullPartID) + { + SceneObjectGroupsByFullPartID[part.UUID] = grp; + } + + lock (SceneObjectGroupsByLocalPartID) + { + SceneObjectGroupsByLocalPartID[part.LocalId] = grp; + } + } + /// /// Delete an object from the scene /// @@ -1804,7 +1827,7 @@ namespace OpenSim.Region.Framework.Scenes List childGroups = new List(); // We do this in reverse to get the link order of the prims correct - for (int i = 0 ; i < children.Count ; i++) + for (int i = 0; i < children.Count; i++) { SceneObjectGroup child = children[i].ParentGroup; @@ -1815,7 +1838,7 @@ namespace OpenSim.Region.Framework.Scenes // Make sure no child prim is set for sale // So that, on delink, no prims are unwittingly // left for sale and sold off - + if (child != null) { child.RootPart.ObjectSaleType = 0; @@ -1850,12 +1873,13 @@ namespace OpenSim.Region.Framework.Scenes } finally { +/* lock (SceneObjectGroupsByLocalPartID) { foreach (SceneObjectPart part in parentGroup.Parts) SceneObjectGroupsByLocalPartID[part.LocalId] = parentGroup; } - +*/ parentGroup.AdjustChildPrimPermissions(); parentGroup.HasGroupChanged = true; parentGroup.ProcessBackup(m_parentScene.SimulationDataService, true); @@ -1938,20 +1962,17 @@ namespace OpenSim.Region.Framework.Scenes // slated for unlink, we need to do this // Unlink the remaining set // - bool sendEventsToRemainder = true; - if (numChildren > 1) - sendEventsToRemainder = false; + bool sendEventsToRemainder = false; + if (numChildren == 2) // only one child prim no re-link needed + sendEventsToRemainder = true; foreach (SceneObjectPart p in newSet) { if (p != group.RootPart) { group.DelinkFromGroup(p, sendEventsToRemainder); - if (numChildren > 2) - { - } - else - { + if (sendEventsToRemainder) // finish single child prim now + { p.ParentGroup.HasGroupChanged = true; p.ParentGroup.ScheduleGroupForFullUpdate(); } @@ -1984,8 +2005,8 @@ namespace OpenSim.Region.Framework.Scenes newChild.ClearUpdateSchedule(); LinkObjects(newRoot, newSet); - if (!affectedGroups.Contains(newRoot.ParentGroup)) - affectedGroups.Add(newRoot.ParentGroup); +// if (!affectedGroups.Contains(newRoot.ParentGroup)) +// affectedGroups.Add(newRoot.ParentGroup); } } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 15349e30a7..ca6f457fdf 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -2560,11 +2560,8 @@ namespace OpenSim.Region.Framework.Scenes /// public SceneObjectPart CopyPart(SceneObjectPart part, UUID cAgentID, UUID cGroupID, bool userExposed) { - // give new ID to the new part, letting old keep original - // SceneObjectPart newPart = part.Copy(m_scene.AllocateLocalId(), OwnerID, GroupID, m_parts.Count, userExposed); SceneObjectPart newPart = part.Copy(part.LocalId, OwnerID, GroupID, m_parts.Count, userExposed); newPart.LocalId = m_scene.AllocateLocalId(); - newPart.SetParent(this); AddPart(newPart); @@ -2977,6 +2974,8 @@ namespace OpenSim.Region.Framework.Scenes m_parts.Add(linkPart.UUID, linkPart); linkPart.SetParent(this); + m_scene.updateScenePartGroup(linkPart, this); + linkPart.CreateSelected = true; // let physics know preserve part volume dtc messy since UpdatePrimFlags doesn't look to parent changes for now @@ -3178,9 +3177,6 @@ namespace OpenSim.Region.Framework.Scenes m_scene.AddNewSceneObject(objectGroup, true); - if (sendEvents) - linkPart.TriggerScriptChangedEvent(Changed.LINK); - linkPart.Rezzed = RootPart.Rezzed; // When we delete a group, we currently have to force persist to the database if the object id has changed @@ -3195,6 +3191,9 @@ namespace OpenSim.Region.Framework.Scenes objectGroup.HasGroupChangedDueToDelink = true; + if (sendEvents) + linkPart.TriggerScriptChangedEvent(Changed.LINK); + return objectGroup; } @@ -3238,9 +3237,12 @@ namespace OpenSim.Region.Framework.Scenes part.SetParent(this); part.ParentID = m_rootPart.LocalId; m_parts.Add(part.UUID, part); + part.LinkNum = linkNum; + m_scene.updateScenePartGroup(part, this); + // Compute the new position of this SOP relative to the group position part.OffsetPosition = newPos - AbsolutePosition; diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 7328a398cf..2fa91398d6 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -505,35 +505,24 @@ namespace OpenSim.Region.Framework.Scenes private void CreateScriptInstanceInternal(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource) { m_items.LockItemsForRead(true); + if (m_items.ContainsKey(itemId)) { - if (m_items.ContainsKey(itemId)) - { - m_items.LockItemsForRead(false); - CreateScriptInstance(m_items[itemId], startParam, postOnRez, engine, stateSource); - } - else - { - m_items.LockItemsForRead(false); - string msg = String.Format("couldn't be found for prim {0}, {1} at {2} in {3}", m_part.Name, m_part.UUID, - m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); - StoreScriptError(itemId, msg); - m_log.ErrorFormat( - "[PRIM INVENTORY]: " + - "Couldn't start script with ID {0} since it {1}", itemId, msg); - } + TaskInventoryItem it = m_items[itemId]; + m_items.LockItemsForRead(false); + + CreateScriptInstance(it, startParam, postOnRez, engine, stateSource); } else { m_items.LockItemsForRead(false); - string msg = String.Format("couldn't be found for prim {0}, {1}", m_part.Name, m_part.UUID); + string msg = String.Format("couldn't be found for prim {0}, {1} at {2} in {3}", m_part.Name, m_part.UUID, + m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); StoreScriptError(itemId, msg); m_log.ErrorFormat( - "[PRIM INVENTORY]: Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2} at {3} in {4}", - itemId, m_part.Name, m_part.UUID, - m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); + "[PRIM INVENTORY]: " + + "Couldn't start script with ID {0} since it {1}", itemId, msg); } - } /// @@ -1144,26 +1133,28 @@ namespace OpenSim.Region.Framework.Scenes if (m_inventorySerial == 0) // No inventory { - client.SendTaskInventory(m_part.UUID, 0, new byte[0]); Items.LockItemsForRead(false); + client.SendTaskInventory(m_part.UUID, 0, new byte[0]); + return; } if (m_items.Count == 0) // No inventory { - client.SendTaskInventory(m_part.UUID, 0, new byte[0]); Items.LockItemsForRead(false); + client.SendTaskInventory(m_part.UUID, 0, new byte[0]); return; } if (!changed) { + Items.LockItemsForRead(false); + xferManager.AddNewFile(filename, m_inventoryFileData); client.SendTaskInventory(m_part.UUID, (short)m_inventoryFileNameSerial, Util.StringToBytes256(filename)); - Items.LockItemsForRead(false); return; } @@ -1249,10 +1240,17 @@ namespace OpenSim.Region.Framework.Scenes // if (HasInventoryChanged) // { Items.LockItemsForRead(true); - datastore.StorePrimInventory(m_part.UUID, Items.Values); - Items.LockItemsForRead(false); + try + { + datastore.StorePrimInventory(m_part.UUID, Items.Values); + } + catch {} HasInventoryChanged = false; + + Items.LockItemsForRead(false); + + // } } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index ca682d397b..eb6cf23861 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -5283,7 +5283,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { return item.AssetID.ToString(); } - m_host.TaskInventory.LockItemsForRead(false); return UUID.Zero.ToString(); } @@ -10203,7 +10202,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api case 4: return (int)item.NextPermissions; } - m_host.TaskInventory.LockItemsForRead(false); return -1; } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 7081416d08..d2a59807da 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -991,7 +991,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api else animID = UUID.Zero; } - m_host.TaskInventory.LockItemsForRead(false); + if (animID == UUID.Zero) target.Animator.RemoveAnimation(animation);