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);