Merge branch 'careminster' into careminster-presence-refactor

This commit is contained in:
Melanie
2010-04-13 04:36:08 +01:00
25 changed files with 694 additions and 203 deletions

View File

@@ -212,8 +212,7 @@ namespace OpenSim.Region.Framework.Scenes
{
// Needs to determine which engine was running it and use that
//
part.Inventory.CreateScriptInstance(item.ItemID, 0, false, DefaultScriptEngine, 0);
errors = part.Inventory.GetScriptErrors(item.ItemID);
errors = part.Inventory.CreateScriptInstanceEr(item.ItemID, 0, false, DefaultScriptEngine, 0);
}
else
{

View File

@@ -156,6 +156,20 @@ namespace OpenSim.Region.Framework.Scenes
public IXfer XferManager;
protected ISnmpModule m_snmpService = null;
public ISnmpModule SnmpService
{
get
{
if (m_snmpService == null)
{
m_snmpService = RequestModuleInterface<ISnmpModule>();
}
return m_snmpService;
}
}
protected IAssetService m_AssetService;
protected IAuthorizationService m_AuthorizationService;
@@ -1727,7 +1741,7 @@ namespace OpenSim.Region.Framework.Scenes
public void SaveTerrain()
{
m_storageManager.DataStore.StoreTerrain(Heightmap.GetDoubles(), RegionInfo.RegionID);
}
}
public void StoreWindlightProfile(RegionLightShareData wl)
{

View File

@@ -104,8 +104,12 @@ namespace OpenSim.Region.Framework.Scenes
/// since the group's last persistent backup
/// </summary>
private bool m_hasGroupChanged = false;
private long timeFirstChanged;
private long timeLastChanged;
private long timeFirstChanged = 0;
private long timeLastChanged = 0;
private long m_maxPersistTime = 0;
private long m_minPersistTime = 0;
private Random m_rand;
private System.Threading.ReaderWriterLockSlim m_partsLock = new System.Threading.ReaderWriterLockSlim();
public void lockPartsForRead(bool locked)
@@ -182,6 +186,32 @@ namespace OpenSim.Region.Framework.Scenes
timeLastChanged = DateTime.Now.Ticks;
if (!m_hasGroupChanged)
timeFirstChanged = DateTime.Now.Ticks;
if (m_rootPart != null && m_rootPart.UUID != null && m_scene != null)
{
if (m_rand == null)
{
byte[] val = new byte[16];
m_rootPart.UUID.ToBytes(val, 0);
m_rand = new Random(BitConverter.ToInt32(val, 0));
}
if (m_scene.GetRootAgentCount() == 0)
{
//If the region is empty, this change has been made by an automated process
//and thus we delay the persist time by a random amount between 1.5 and 2.5.
float factor = 1.5f + (float)(m_rand.NextDouble());
m_maxPersistTime = (long)((float)m_scene.m_persistAfter * factor);
m_minPersistTime = (long)((float)m_scene.m_dontPersistBefore * factor);
}
else
{
//If the region is not empty, we want to obey the minimum and maximum persist times
//but add a random factor so we stagger the object persistance a little
m_maxPersistTime = (long)((float)m_scene.m_persistAfter * (1.0d - (m_rand.NextDouble() / 5.0d))); //Multiply by 1.0-1.5
m_minPersistTime = (long)((float)m_scene.m_dontPersistBefore * (1.0d + (m_rand.NextDouble() / 2.0d))); //Multiply by 0.8-1.0
}
}
}
m_hasGroupChanged = value;
}
@@ -197,8 +227,19 @@ namespace OpenSim.Region.Framework.Scenes
return false;
if (m_scene.ShuttingDown)
return true;
if (m_minPersistTime == 0 || m_maxPersistTime == 0)
{
m_maxPersistTime = m_scene.m_persistAfter;
m_minPersistTime = m_scene.m_dontPersistBefore;
}
long currentTime = DateTime.Now.Ticks;
if (currentTime - timeLastChanged > m_scene.m_dontPersistBefore || currentTime - timeFirstChanged > m_scene.m_persistAfter)
if (timeLastChanged == 0) timeLastChanged = currentTime;
if (timeFirstChanged == 0) timeFirstChanged = currentTime;
if (currentTime - timeLastChanged > m_minPersistTime || currentTime - timeFirstChanged > m_maxPersistTime)
return true;
return false;
}
@@ -530,6 +571,7 @@ namespace OpenSim.Region.Framework.Scenes
/// </summary>
public SceneObjectGroup()
{
}
/// <summary>
@@ -546,7 +588,7 @@ namespace OpenSim.Region.Framework.Scenes
/// Constructor. This object is added to the scene later via AttachToScene()
/// </summary>
public SceneObjectGroup(UUID ownerID, Vector3 pos, Quaternion rot, PrimitiveBaseShape shape)
{
{
SetRootPart(new SceneObjectPart(ownerID, shape, pos, rot, Vector3.Zero));
}

View File

@@ -45,6 +45,8 @@ namespace OpenSim.Region.Framework.Scenes
private string m_inventoryFileName = String.Empty;
private int m_inventoryFileNameSerial = 0;
private Dictionary<UUID, ArrayList> m_scriptErrors = new Dictionary<UUID, ArrayList>();
/// <value>
/// The part to which the inventory belongs.
@@ -210,7 +212,7 @@ namespace OpenSim.Region.Framework.Scenes
}
}
public ArrayList GetScriptErrors(UUID itemID)
private ArrayList GetScriptErrors(UUID itemID)
{
ArrayList ret = new ArrayList();
@@ -269,7 +271,10 @@ namespace OpenSim.Region.Framework.Scenes
// item.Name, item.ItemID, Name, UUID);
if (!m_part.ParentGroup.Scene.Permissions.CanRunScript(item.ItemID, m_part.UUID, item.OwnerID))
{
StoreScriptError(item.ItemID, "no permission");
return;
}
m_part.AddFlag(PrimFlags.Scripted);
@@ -284,6 +289,7 @@ namespace OpenSim.Region.Framework.Scenes
m_items.LockItemsForWrite(false);
m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
m_part.LocalId, item.ItemID, String.Empty, startParam, postOnRez, engine, stateSource);
StoreScriptErrors(item.ItemID, GetScriptErrors(item.ItemID));
m_part.ParentGroup.AddActiveScriptCount(1);
m_part.ScheduleFullUpdate();
return;
@@ -293,11 +299,13 @@ namespace OpenSim.Region.Framework.Scenes
{
if (null == asset)
{
string msg = String.Format("asset ID {0} could not be found", item.AssetID);
StoreScriptError(item.ItemID, msg);
m_log.ErrorFormat(
"[PRIM INVENTORY]: " +
"Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found",
"Couldn't start script {0}, {1} at {2} in {3} since {4}",
item.Name, item.ItemID, m_part.AbsolutePosition,
m_part.ParentGroup.Scene.RegionInfo.RegionName, item.AssetID);
m_part.ParentGroup.Scene.RegionInfo.RegionName, msg);
}
else
{
@@ -310,11 +318,16 @@ namespace OpenSim.Region.Framework.Scenes
string script = Utils.BytesToString(asset.Data);
m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource);
StoreScriptErrors(item.ItemID, GetScriptErrors(item.ItemID));
m_part.ParentGroup.AddActiveScriptCount(1);
m_part.ScheduleFullUpdate();
}
});
}
else
{
StoreScriptError(item.ItemID, "scripts disabled");
}
}
private void RestoreSavedScriptState(UUID oldID, UUID newID)
@@ -391,24 +404,71 @@ namespace OpenSim.Region.Framework.Scenes
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 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);
"Couldn't start script with ID {0} since it {1}", itemId, msg);
}
}
else
{
m_items.LockItemsForRead(false);
string msg = String.Format("couldn't be found for prim {0}, {1}", m_part.Name, m_part.UUID);
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}",
itemId, m_part.Name, m_part.UUID);
"Couldn't start script with ID {0} since it {1}", itemId, msg);
}
}
public ArrayList CreateScriptInstanceEr(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource)
{
ArrayList errors;
lock (m_scriptErrors)
{
m_scriptErrors.Remove(itemId);
}
CreateScriptInstance(itemId, startParam, postOnRez, engine, stateSource);
lock (m_scriptErrors)
{
while (!m_scriptErrors.TryGetValue(itemId, out errors))
{
if (!System.Threading.Monitor.Wait(m_scriptErrors, 15000))
{
m_log.ErrorFormat(
"[PRIM INVENTORY]: " +
"timedout waiting for script {0} errors", itemId);
if (!m_scriptErrors.TryGetValue(itemId, out errors))
{
errors = new ArrayList(1);
errors.Add("timedout waiting for errors");
}
break;
}
}
m_scriptErrors.Remove(itemId);
}
return errors;
}
private void StoreScriptErrors(UUID itemId, ArrayList errors)
{
lock (m_scriptErrors)
{
m_scriptErrors[itemId] = errors;
System.Threading.Monitor.PulseAll(m_scriptErrors);
}
}
private void StoreScriptError(UUID itemId, string message)
{
ArrayList errors = new ArrayList(1);
errors.Add(message);
StoreScriptErrors(itemId, errors);
}
/// <summary>
/// Stop a script which is in this prim's inventory.
/// </summary>