mirror of
https://github.com/opensim/opensim.git
synced 2026-08-07 17:55:48 +08:00
Merge branch 'primcounts'
This commit is contained in:
@@ -805,7 +805,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
ILandObject landUnderPrim = GetLandObject(position.X, position.Y);
|
||||
if (landUnderPrim != null)
|
||||
{
|
||||
landUnderPrim.AddPrimToCount(obj);
|
||||
((LandObject)landUnderPrim).AddPrimToCount(obj);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -243,7 +243,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
}
|
||||
|
||||
remote_client.SendLandProperties(seq_id,
|
||||
snap_selection, request_result, LandData,
|
||||
snap_selection, request_result, this,
|
||||
(float)m_scene.RegionInfo.RegionSettings.ObjectBonus,
|
||||
GetParcelMaxPrimCount(this),
|
||||
GetSimulatorMaxPrimCount(this), regionFlags);
|
||||
|
||||
@@ -51,8 +51,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
|
||||
public class PrimCountModule : IPrimCountModule, INonSharedRegionModule
|
||||
{
|
||||
// private static readonly ILog m_log =
|
||||
// LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private Scene m_Scene;
|
||||
private Dictionary<UUID, PrimCounts> m_PrimCounts =
|
||||
@@ -123,6 +122,11 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
{
|
||||
if (!m_Tainted)
|
||||
AddObject(obj);
|
||||
// else
|
||||
// m_log.DebugFormat(
|
||||
// "[PRIM COUNT MODULE]: Ignoring OnParcelPrimCountAdd() for {0} on {1} since count is tainted",
|
||||
// obj.Name, m_Scene.RegionInfo.RegionName);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -133,11 +137,18 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
{
|
||||
if (!m_Tainted)
|
||||
RemoveObject(obj);
|
||||
// else
|
||||
// m_log.DebugFormat(
|
||||
// "[PRIM COUNT MODULE]: Ignoring OnObjectBeingRemovedFromScene() for {0} on {1} since count is tainted",
|
||||
// obj.Name, m_Scene.RegionInfo.RegionName);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnParcelPrimCountTainted()
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[PRIM COUNT MODULE]: OnParcelPrimCountTainted() called on {0}", m_Scene.RegionInfo.RegionName);
|
||||
|
||||
lock (m_TaintLock)
|
||||
m_Tainted = true;
|
||||
}
|
||||
@@ -163,7 +174,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
// NOTE: Call under Taint Lock
|
||||
private void AddObject(SceneObjectGroup obj)
|
||||
{
|
||||
// m_log.DebugFormat("[PRIM COUNT MODULE]: Adding object {0} to prim count", obj.Name);
|
||||
// m_log.DebugFormat("[PRIM COUNT MODULE]: Adding object {0} {1} to prim count", obj.Name, obj.UUID);
|
||||
|
||||
if (obj.IsAttachment)
|
||||
return;
|
||||
@@ -214,10 +225,16 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
// NOTE: Call under Taint Lock
|
||||
private void RemoveObject(SceneObjectGroup obj)
|
||||
{
|
||||
// m_log.DebugFormat("[PRIM COUNT MODULE]: Removing object {0} {1} from prim count", obj.Name, obj.UUID);
|
||||
|
||||
// Currently this is being done by tainting the count instead.
|
||||
}
|
||||
|
||||
public IPrimCounts GetPrimCounts(UUID parcelID)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[PRIM COUNT MODULE]: GetPrimCounts for parcel {0} in {1}", parcelID, m_Scene.RegionInfo.RegionName);
|
||||
|
||||
PrimCounts primCounts;
|
||||
|
||||
lock (m_PrimCounts)
|
||||
@@ -239,7 +256,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
/// <returns></returns>
|
||||
public int GetOwnerCount(UUID parcelID)
|
||||
{
|
||||
// m_log.DebugFormat("[PRIM COUNT MODULE]: GetOwnerCount for {0}", parcelID);
|
||||
int count = 0;
|
||||
|
||||
lock (m_TaintLock)
|
||||
{
|
||||
@@ -248,9 +265,14 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
|
||||
ParcelCounts counts;
|
||||
if (m_ParcelCounts.TryGetValue(parcelID, out counts))
|
||||
return counts.Owner;
|
||||
count = counts.Owner;
|
||||
}
|
||||
return 0;
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[PRIM COUNT MODULE]: GetOwnerCount for parcel {0} in {1} returning {2}",
|
||||
// parcelID, m_Scene.RegionInfo.RegionName, count);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -260,6 +282,8 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
/// <returns></returns>
|
||||
public int GetGroupCount(UUID parcelID)
|
||||
{
|
||||
int count = 0;
|
||||
|
||||
lock (m_TaintLock)
|
||||
{
|
||||
if (m_Tainted)
|
||||
@@ -267,9 +291,14 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
|
||||
ParcelCounts counts;
|
||||
if (m_ParcelCounts.TryGetValue(parcelID, out counts))
|
||||
return counts.Group;
|
||||
count = counts.Group;
|
||||
}
|
||||
return 0;
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[PRIM COUNT MODULE]: GetGroupCount for parcel {0} in {1} returning {2}",
|
||||
// parcelID, m_Scene.RegionInfo.RegionName, count);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -279,6 +308,8 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
/// <returns></returns>
|
||||
public int GetOthersCount(UUID parcelID)
|
||||
{
|
||||
int count = 0;
|
||||
|
||||
lock (m_TaintLock)
|
||||
{
|
||||
if (m_Tainted)
|
||||
@@ -286,9 +317,45 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
|
||||
ParcelCounts counts;
|
||||
if (m_ParcelCounts.TryGetValue(parcelID, out counts))
|
||||
return counts.Others;
|
||||
count = counts.Others;
|
||||
}
|
||||
return 0;
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[PRIM COUNT MODULE]: GetOthersCount for parcel {0} in {1} returning {2}",
|
||||
// parcelID, m_Scene.RegionInfo.RegionName, count);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the total count of owner, group and others prims on the parcel.
|
||||
/// FIXME: Need to do selected prims once this is reimplemented.
|
||||
/// </summary>
|
||||
/// <param name="parcelID"></param>
|
||||
/// <returns></returns>
|
||||
public int GetTotalCount(UUID parcelID)
|
||||
{
|
||||
int count = 0;
|
||||
|
||||
lock (m_TaintLock)
|
||||
{
|
||||
if (m_Tainted)
|
||||
Recount();
|
||||
|
||||
ParcelCounts counts;
|
||||
if (m_ParcelCounts.TryGetValue(parcelID, out counts))
|
||||
{
|
||||
count = counts.Owner;
|
||||
count += counts.Group;
|
||||
count += counts.Others;
|
||||
}
|
||||
}
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[PRIM COUNT MODULE]: GetTotalCount for parcel {0} in {1} returning {2}",
|
||||
// parcelID, m_Scene.RegionInfo.RegionName, count);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -298,6 +365,8 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
/// <returns></returns>
|
||||
public int GetSimulatorCount(UUID parcelID)
|
||||
{
|
||||
int count = 0;
|
||||
|
||||
lock (m_TaintLock)
|
||||
{
|
||||
if (m_Tainted)
|
||||
@@ -308,10 +377,15 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
{
|
||||
int val;
|
||||
if (m_SimwideCounts.TryGetValue(owner, out val))
|
||||
return val;
|
||||
count = val;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[PRIM COUNT MODULE]: GetOthersCount for parcel {0} in {1} returning {2}",
|
||||
// parcelID, m_Scene.RegionInfo.RegionName, count);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -322,6 +396,8 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
/// <returns></returns>
|
||||
public int GetUserCount(UUID parcelID, UUID userID)
|
||||
{
|
||||
int count = 0;
|
||||
|
||||
lock (m_TaintLock)
|
||||
{
|
||||
if (m_Tainted)
|
||||
@@ -332,10 +408,15 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
{
|
||||
int val;
|
||||
if (counts.Users.TryGetValue(userID, out val))
|
||||
return val;
|
||||
count = val;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[PRIM COUNT MODULE]: GetUserCount for user {0} in parcel {1} in region {2} returning {3}",
|
||||
// userID, parcelID, m_Scene.RegionInfo.RegionName, count);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
// NOTE: This method MUST be called while holding the taint lock!
|
||||
@@ -367,6 +448,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
if (!m_OwnerMap.ContainsKey(k))
|
||||
m_PrimCounts.Remove(k);
|
||||
}
|
||||
|
||||
m_Tainted = false;
|
||||
}
|
||||
}
|
||||
@@ -408,6 +490,14 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
return m_Parent.GetOthersCount(m_ParcelID);
|
||||
}
|
||||
}
|
||||
|
||||
public int Total
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_Parent.GetTotalCount(m_ParcelID);
|
||||
}
|
||||
}
|
||||
|
||||
public int Simulator
|
||||
{
|
||||
|
||||
@@ -78,9 +78,10 @@ namespace OpenSim.Region.CoreModules.World.Land.Tests
|
||||
Assert.That(pc.Owner, Is.EqualTo(0));
|
||||
Assert.That(pc.Group, Is.EqualTo(0));
|
||||
Assert.That(pc.Others, Is.EqualTo(0));
|
||||
Assert.That(pc.Total, Is.EqualTo(0));
|
||||
Assert.That(pc.Users[m_userId], Is.EqualTo(0));
|
||||
Assert.That(pc.Users[m_dummyUserId], Is.EqualTo(0));
|
||||
Assert.That(pc.Simulator, Is.EqualTo(0));
|
||||
Assert.That(pc.Simulator, Is.EqualTo(0));
|
||||
|
||||
SceneObjectGroup sog = SceneSetupHelpers.CreateSceneObject(3, m_userId, 0x01);
|
||||
m_scene.AddNewSceneObject(sog, false);
|
||||
@@ -88,6 +89,7 @@ namespace OpenSim.Region.CoreModules.World.Land.Tests
|
||||
Assert.That(pc.Owner, Is.EqualTo(3));
|
||||
Assert.That(pc.Group, Is.EqualTo(0));
|
||||
Assert.That(pc.Others, Is.EqualTo(0));
|
||||
Assert.That(pc.Total, Is.EqualTo(3));
|
||||
Assert.That(pc.Users[m_userId], Is.EqualTo(3));
|
||||
Assert.That(pc.Users[m_dummyUserId], Is.EqualTo(0));
|
||||
Assert.That(pc.Simulator, Is.EqualTo(3));
|
||||
@@ -99,11 +101,36 @@ namespace OpenSim.Region.CoreModules.World.Land.Tests
|
||||
Assert.That(pc.Owner, Is.EqualTo(5));
|
||||
Assert.That(pc.Group, Is.EqualTo(0));
|
||||
Assert.That(pc.Others, Is.EqualTo(0));
|
||||
Assert.That(pc.Total, Is.EqualTo(5));
|
||||
Assert.That(pc.Users[m_userId], Is.EqualTo(5));
|
||||
Assert.That(pc.Users[m_dummyUserId], Is.EqualTo(0));
|
||||
Assert.That(pc.Simulator, Is.EqualTo(5));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Test count after a parcel owner owned copied object is added.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TestCopiedOwnerObject()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
// log4net.Config.XmlConfigurator.Configure();
|
||||
|
||||
IPrimCounts pc = m_lo.PrimCounts;
|
||||
|
||||
SceneObjectGroup sog = SceneSetupHelpers.CreateSceneObject(3, m_userId, 0x01);
|
||||
m_scene.AddNewSceneObject(sog, false);
|
||||
m_scene.SceneGraph.DuplicateObject(sog.LocalId, Vector3.Zero, 0, m_userId, UUID.Zero, Quaternion.Identity);
|
||||
|
||||
Assert.That(pc.Owner, Is.EqualTo(6));
|
||||
Assert.That(pc.Group, Is.EqualTo(0));
|
||||
Assert.That(pc.Others, Is.EqualTo(0));
|
||||
Assert.That(pc.Total, Is.EqualTo(6));
|
||||
Assert.That(pc.Users[m_userId], Is.EqualTo(6));
|
||||
Assert.That(pc.Users[m_dummyUserId], Is.EqualTo(0));
|
||||
Assert.That(pc.Simulator, Is.EqualTo(6));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Test count after a parcel owner owned object is removed.
|
||||
/// </summary>
|
||||
@@ -123,9 +150,33 @@ namespace OpenSim.Region.CoreModules.World.Land.Tests
|
||||
Assert.That(pc.Owner, Is.EqualTo(1));
|
||||
Assert.That(pc.Group, Is.EqualTo(0));
|
||||
Assert.That(pc.Others, Is.EqualTo(0));
|
||||
Assert.That(pc.Total, Is.EqualTo(1));
|
||||
Assert.That(pc.Users[m_userId], Is.EqualTo(1));
|
||||
Assert.That(pc.Users[m_dummyUserId], Is.EqualTo(0));
|
||||
Assert.That(pc.Simulator, Is.EqualTo(1));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Test the count is correct after is has been tainted.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TestTaint()
|
||||
{
|
||||
TestHelper.InMethod();
|
||||
IPrimCounts pc = m_lo.PrimCounts;
|
||||
|
||||
SceneObjectGroup sog = SceneSetupHelpers.CreateSceneObject(3, m_userId, 0x01);
|
||||
m_scene.AddNewSceneObject(sog, false);
|
||||
|
||||
m_pcm.TaintPrimCount();
|
||||
|
||||
Assert.That(pc.Owner, Is.EqualTo(3));
|
||||
Assert.That(pc.Group, Is.EqualTo(0));
|
||||
Assert.That(pc.Others, Is.EqualTo(0));
|
||||
Assert.That(pc.Total, Is.EqualTo(3));
|
||||
Assert.That(pc.Users[m_userId], Is.EqualTo(3));
|
||||
Assert.That(pc.Users[m_dummyUserId], Is.EqualTo(0));
|
||||
Assert.That(pc.Simulator, Is.EqualTo(3));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user