From 12cebb12d5b095fc8d1a2936b9537ad0e0e7dbe7 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 15 Mar 2012 00:06:52 +0000
Subject: Alleviate an issue where calling Thread.Abort() on script WorkItems
can fail to release locks, resulting in a crippled simulator.
This seems to be a particular problem with ReaderWriterLockSlim, though other locks can be affected as well.
It has been seen to happen when llDie() is called in a linkset running more than one script.
Alleviation here means supplying a ScriptInstance.Stop() timeout of 1000ms rather than 0ms, to give events a chance to complete.
Also, we check the IsRunning status at the top of the ScriptInstance.EventProcessor() so that another event doesn't start in the mean time.
Ultimately, a better solution may have to be found since a long-running event would still exceed the timeout and be aborted.
---
.../Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | 13 ++++++++++---
OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 6 +++++-
2 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index b840730..6a9cd72 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -546,7 +546,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
public bool Stop(int timeout)
{
// m_log.DebugFormat(
-// "[SCRIPT INSTANCE]: Stopping script {0} {1} with timeout {2}", ScriptName, ItemID, timeout);
+// "[SCRIPT INSTANCE]: Stopping script {0} {1} in {2} {3} with timeout {4} {5} {6}",
+// ScriptName, ItemID, PrimName, ObjectID, timeout, m_InSelfDelete, DateTime.Now.Ticks);
IScriptWorkItem workItem;
@@ -575,7 +576,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
}
// Wait for the current event to complete.
- if (workItem.Wait(new TimeSpan((long)timeout * 100000)))
+ if (!m_InSelfDelete && workItem.Wait(new TimeSpan((long)timeout * 100000)))
{
return true;
}
@@ -592,7 +593,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
// forcibly abort the work item (this aborts the underlying thread).
if (!m_InSelfDelete)
{
-// m_log.ErrorFormat("[SCRIPT INSTANCE]: Aborting script {0} {1}", ScriptName, ItemID);
+// m_log.ErrorFormat(
+// "[SCRIPT INSTANCE]: Aborting script {0} {1} in prim {2} {3} {4} {5}",
+// ScriptName, ItemID, PrimName, ObjectID, m_InSelfDelete, DateTime.Now.Ticks);
workItem.Abort();
}
@@ -706,6 +709,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
///
public object EventProcessor()
{
+ // We check here as the thread stopping this instance from running may itself hold the m_Script lock.
+ if (!Running)
+ return 0;
+
lock (m_Script)
{
// m_log.DebugFormat("[XEngine]: EventProcessor() invoked for {0}.{1}", PrimName, ScriptName);
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index ab41873..44397b7 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -1118,7 +1118,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine
}
instance.ClearQueue();
- instance.Stop(0);
+
+ // Give the script some time to finish processing its last event. Simply aborting the script thread can
+ // cause issues on mono 2.6, 2.10 and possibly later where locks are not released properly on abort.
+ instance.Stop(1000);
+
// bool objectRemoved = false;
lock (m_PrimObjects)
--
cgit v1.1
From 2f81e53f63012f0ed1623dc6159da01a3807fbf6 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 15 Mar 2012 00:20:47 +0000
Subject: Fix a problem where multiple near simultaneous calls to llDie() from
multiple scripts in the same linkset can cause unnecessary thread aborts.
The first llDie() could lock Scene.m_deleting_scene_object.
The second llDie() would then wait at this lock.
The first llDie() would go on to remove the second script but always abort it since the second script's WorkItem would not go away.
Easiest solution here is to remove the m_deleting_scene_object since it's no longer justified - we no longer lock m_parts but take a copy instead.
This also requires an adjustment in XEngine.OnRemoveScript not to use instance.ObjectID instead when firing the OnObjectRemoved event.
---
OpenSim/Region/Framework/Scenes/Scene.cs | 11 +----------
OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 19 +++++++++----------
2 files changed, 10 insertions(+), 20 deletions(-)
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 9e59d50..3a066d4 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -219,8 +219,6 @@ namespace OpenSim.Region.Framework.Scenes
private int m_lastUpdate;
private bool m_firstHeartbeat = true;
-
- private object m_deleting_scene_object = new object();
private UpdatePrioritizationSchemes m_priorityScheme = UpdatePrioritizationSchemes.Time;
private bool m_reprioritizationEnabled = true;
@@ -1994,15 +1992,8 @@ namespace OpenSim.Region.Framework.Scenes
public void DeleteSceneObject(SceneObjectGroup group, bool silent)
{
// m_log.DebugFormat("[SCENE]: Deleting scene object {0} {1}", group.Name, group.UUID);
-
- //SceneObjectPart rootPart = group.GetChildPart(group.UUID);
- // Serialise calls to RemoveScriptInstances to avoid
- // deadlocking on m_parts inside SceneObjectGroup
- lock (m_deleting_scene_object)
- {
- group.RemoveScriptInstances(true);
- }
+ group.RemoveScriptInstances(true);
SceneObjectPart[] partList = group.Parts;
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 44397b7..105d97d 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -176,12 +176,16 @@ namespace OpenSim.Region.ScriptEngine.XEngine
get { return m_ConfigSource; }
}
+ ///
+ /// Event fired after the script engine has finished removing a script.
+ ///
public event ScriptRemoved OnScriptRemoved;
+
+ ///
+ /// Event fired after the script engine has finished removing a script from an object.
+ ///
public event ObjectRemoved OnObjectRemoved;
- //
- // IRegionModule functions
- //
public void Initialise(IConfigSource configSource)
{
if (configSource.Configs["XEngine"] == null)
@@ -1122,7 +1126,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
// Give the script some time to finish processing its last event. Simply aborting the script thread can
// cause issues on mono 2.6, 2.10 and possibly later where locks are not released properly on abort.
instance.Stop(1000);
-
+
// bool objectRemoved = false;
lock (m_PrimObjects)
@@ -1153,14 +1157,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
UnloadAppDomain(instance.AppDomain);
}
- instance = null;
-
ObjectRemoved handlerObjectRemoved = OnObjectRemoved;
if (handlerObjectRemoved != null)
- {
- SceneObjectPart part = m_Scene.GetSceneObjectPart(localID);
- handlerObjectRemoved(part.UUID);
- }
+ handlerObjectRemoved(instance.ObjectID);
ScriptRemoved handlerScriptRemoved = OnScriptRemoved;
if (handlerScriptRemoved != null)
--
cgit v1.1
From 5ddda892388fe22912d8992f1c9d24b3667926f0 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 15 Mar 2012 00:48:19 +0000
Subject: Remove duplication of m_RunEvents and Running
---
.../ScriptEngine/Shared/Instance/ScriptInstance.cs | 28 +++++++++-------------
1 file changed, 11 insertions(+), 17 deletions(-)
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index 6a9cd72..cc4be73 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -68,7 +68,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
private IScriptWorkItem m_CurrentWorkItem;
private Queue m_EventQueue = new Queue(32);
- private bool m_RunEvents = false;
private UUID m_ItemID;
private uint m_LocalID;
private UUID m_ObjectID;
@@ -141,11 +140,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
}
}
- public bool Running
- {
- get { return m_RunEvents; }
- set { m_RunEvents = value; }
- }
+ public bool Running { get; set; }
public bool Suspended
{
@@ -164,7 +159,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
lock (m_EventQueue)
{
// Need to place ourselves back in a work item if there are events to process
- if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown))
+ if ((m_EventQueue.Count > 0) && Running && (!m_ShuttingDown))
m_CurrentWorkItem = m_Engine.QueueEventHandler(this);
}
}
@@ -369,13 +364,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
part.SetScriptEvents(m_ItemID,
(int)m_Script.GetStateEventFlags(State));
- if (m_RunEvents && (!m_ShuttingDown))
+ if (Running && (!m_ShuttingDown))
{
- m_RunEvents = false;
+ Running = false;
}
else
{
- m_RunEvents = false;
+ Running = false;
m_startOnInit = false;
}
@@ -531,7 +526,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
if (Running)
return;
- m_RunEvents = true;
+ Running = true;
if (m_EventQueue.Count > 0)
{
@@ -559,7 +554,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
// If we're not running or waiting to run an event then we can safely stop.
if (m_CurrentWorkItem == null)
{
- m_RunEvents = false;
+ Running = false;
return true;
}
@@ -567,12 +562,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
if (m_CurrentWorkItem.Cancel())
{
m_CurrentWorkItem = null;
- m_RunEvents = false;
+ Running = false;
return true;
}
workItem = m_CurrentWorkItem;
- m_RunEvents = false;
+ Running = false;
}
// Wait for the current event to complete.
@@ -727,7 +722,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
data = (EventParams) m_EventQueue.Dequeue();
if (data == null) // Shouldn't happen
{
- if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown))
+ if (m_EventQueue.Count > 0 && Running && !m_ShuttingDown)
{
m_CurrentWorkItem = m_Engine.QueueEventHandler(this);
}
@@ -853,12 +848,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
}
}
-
// If there are more events and we are currently running and not shutting down, then ask the
// script engine to run the next event.
lock (m_EventQueue)
{
- if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown))
+ if (m_EventQueue.Count > 0 && Running && (!m_ShuttingDown))
{
m_CurrentWorkItem = m_Engine.QueueEventHandler(this);
}
--
cgit v1.1
From f0c1746063dff537d83babcf617b7cf88ed612dc Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 15 Mar 2012 01:26:38 +0000
Subject: minor: correct indentation levels
---
.../ScriptEngine/Shared/Instance/ScriptInstance.cs | 25 +++++++++++-----------
1 file changed, 12 insertions(+), 13 deletions(-)
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index cc4be73..afa9191 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -282,19 +282,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
{
m_Apis[api] = am.CreateApi(api);
m_Apis[api].Initialize(engine, part, m_LocalID, itemID);
- }
-
- try
- {
- if (dom != System.AppDomain.CurrentDomain)
- m_Script = (IScript)dom.CreateInstanceAndUnwrap(
- Path.GetFileNameWithoutExtension(assembly),
- "SecondLife.Script");
- else
- m_Script = (IScript)Assembly.Load(
- Path.GetFileNameWithoutExtension(assembly)).CreateInstance(
- "SecondLife.Script");
-
+ }
+
+ try
+ {
+ if (dom != System.AppDomain.CurrentDomain)
+ m_Script = (IScript)dom.CreateInstanceAndUnwrap(
+ Path.GetFileNameWithoutExtension(assembly),
+ "SecondLife.Script");
+ else
+ m_Script = (IScript)Assembly.Load(
+ Path.GetFileNameWithoutExtension(assembly)).CreateInstance(
+ "SecondLife.Script");
//ILease lease = (ILease)RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass);
//RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass);
--
cgit v1.1
From 2d32401e23f216565f64163fb3220d035e45b0a8 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 15 Mar 2012 01:32:16 +0000
Subject: Simplify some logic in the ScriptInstance constructor - running is
set to false in both if/else branches
---
.../Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | 12 +++---------
1 file changed, 3 insertions(+), 9 deletions(-)
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index afa9191..8b0dbaa 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -363,15 +363,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
part.SetScriptEvents(m_ItemID,
(int)m_Script.GetStateEventFlags(State));
- if (Running && (!m_ShuttingDown))
- {
- Running = false;
- }
- else
- {
- Running = false;
+ Running = false;
+
+ if (m_ShuttingDown)
m_startOnInit = false;
- }
// we get new rez events on sim restart, too
// but if there is state, then we fire the change
@@ -380,7 +375,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
// We loaded state, don't force a re-save
m_SaveState = false;
m_startedFromSavedState = true;
-
}
}
else
--
cgit v1.1
From acb1355ff203b55ae2581b5606e251b8fa91b252 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Thu, 15 Mar 2012 02:02:31 +0000
Subject: Remove property/field duplication in ScriptInstance where it's
unnecessary.
---
.../ScriptEngine/Interfaces/IScriptInstance.cs | 8 +
.../ScriptEngine/Shared/Instance/ScriptInstance.cs | 277 ++++++++-------------
2 files changed, 115 insertions(+), 170 deletions(-)
diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
index f00e41f..8762642 100644
--- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
@@ -68,8 +68,16 @@ namespace OpenSim.Region.ScriptEngine.Interfaces
///
bool Suspended { get; set; }
+ ///
+ /// Is the script shutting down?
+ ///
bool ShuttingDown { get; set; }
+
+ ///
+ /// Script state
+ ///
string State { get; set; }
+
IScriptEngine Engine { get; }
UUID AppDomain { get; set; }
string PrimName { get; }
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index 8b0dbaa..968351b 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -56,43 +56,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
public class ScriptInstance : MarshalByRefObject, IScriptInstance
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
-
- private IScriptEngine m_Engine;
///
/// The current work item if an event for this script is running or waiting to run,
///
///
- /// Null if there is no running or waiting to run event. Must be changed only under an m_EventQueue lock.
+ /// Null if there is no running or waiting to run event. Must be changed only under an EventQueue lock.
///
private IScriptWorkItem m_CurrentWorkItem;
- private Queue m_EventQueue = new Queue(32);
- private UUID m_ItemID;
- private uint m_LocalID;
- private UUID m_ObjectID;
- private UUID m_AssetID;
private IScript m_Script;
- private UUID m_AppDomain;
private DetectParams[] m_DetectParams;
private bool m_TimerQueued;
private DateTime m_EventStart;
private bool m_InEvent;
- private string m_PrimName;
- private string m_ScriptName;
private string m_Assembly;
- private int m_StartParam;
private string m_CurrentEvent = String.Empty;
private bool m_InSelfDelete;
private int m_MaxScriptQueue;
private bool m_SaveState = true;
- private bool m_ShuttingDown;
private int m_ControlEventsInQueue;
private int m_LastControlLevel;
private bool m_CollisionInQueue;
- private TaskInventoryItem m_thisScriptTask;
+
// The following is for setting a minimum delay between events
private double m_minEventDelay;
+
private long m_eventDelayTicks;
private long m_nextEventTimeTicks;
private bool m_startOnInit = true;
@@ -103,21 +92,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
private UUID m_CurrentStateHash;
private UUID m_RegionID;
- private Dictionary, KeyValuePair>
- m_LineMap;
-
- public Dictionary, KeyValuePair>
- LineMap
- {
- get { return m_LineMap; }
- set { m_LineMap = value; }
- }
+ public Dictionary, KeyValuePair> LineMap { get; set; }
private Dictionary m_Apis = new Dictionary();
- // Script state
- private string m_State = "default";
-
public Object[] PluginData = new Object[0];
///
@@ -156,11 +134,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
if (wasSuspended && !m_Suspended)
{
- lock (m_EventQueue)
+ lock (EventQueue)
{
// Need to place ourselves back in a work item if there are events to process
- if ((m_EventQueue.Count > 0) && Running && (!m_ShuttingDown))
- m_CurrentWorkItem = m_Engine.QueueEventHandler(this);
+ if (EventQueue.Count > 0 && Running && !ShuttingDown)
+ m_CurrentWorkItem = Engine.QueueEventHandler(this);
}
}
}
@@ -168,79 +146,36 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
}
private bool m_Suspended;
- public bool ShuttingDown
- {
- get { return m_ShuttingDown; }
- set { m_ShuttingDown = value; }
- }
+ public bool ShuttingDown { get; set; }
- public string State
- {
- get { return m_State; }
- set { m_State = value; }
- }
+ public string State { get; set; }
- public IScriptEngine Engine
- {
- get { return m_Engine; }
- }
+ public IScriptEngine Engine { get; private set; }
- public UUID AppDomain
- {
- get { return m_AppDomain; }
- set { m_AppDomain = value; }
- }
+ public UUID AppDomain { get; set; }
- public string PrimName
- {
- get { return m_PrimName; }
- }
+ public string PrimName { get; private set; }
- public string ScriptName
- {
- get { return m_ScriptName; }
- }
+ public string ScriptName { get; private set; }
- public UUID ItemID
- {
- get { return m_ItemID; }
- }
+ public UUID ItemID { get; private set; }
- public UUID ObjectID
- {
- get { return m_ObjectID; }
- }
+ public UUID ObjectID { get; private set; }
- public uint LocalID
- {
- get { return m_LocalID; }
- }
+ public uint LocalID { get; private set; }
- public UUID AssetID
- {
- get { return m_AssetID; }
- }
+ public UUID AssetID { get; private set; }
- public Queue EventQueue
- {
- get { return m_EventQueue; }
- }
+ public Queue EventQueue { get; private set; }
- public void ClearQueue()
- {
- m_TimerQueued = false;
- m_EventQueue.Clear();
- }
+ public int StartParam { get; set; }
- public int StartParam
- {
- get { return m_StartParam; }
- set { m_StartParam = value; }
- }
+ public TaskInventoryItem ScriptTask { get; private set; }
- public TaskInventoryItem ScriptTask
+ public void ClearQueue()
{
- get { return m_thisScriptTask; }
+ m_TimerQueued = false;
+ EventQueue.Clear();
}
public ScriptInstance(IScriptEngine engine, SceneObjectPart part,
@@ -249,16 +184,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
int startParam, bool postOnRez, StateSource stateSource,
int maxScriptQueue)
{
- m_Engine = engine;
-
- m_LocalID = part.LocalId;
- m_ObjectID = part.UUID;
- m_ItemID = itemID;
- m_AssetID = assetID;
- m_PrimName = primName;
- m_ScriptName = scriptName;
+ State = "default";
+ EventQueue = new Queue(32);
+
+ Engine = engine;
+ LocalID = part.LocalId;
+ ObjectID = part.UUID;
+ ItemID = itemID;
+ AssetID = assetID;
+ PrimName = primName;
+ ScriptName = scriptName;
m_Assembly = assembly;
- m_StartParam = startParam;
+ StartParam = startParam;
m_MaxScriptQueue = maxScriptQueue;
m_stateSource = stateSource;
m_postOnRez = postOnRez;
@@ -269,9 +206,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
{
lock (part.TaskInventory)
{
- if (part.TaskInventory.ContainsKey(m_ItemID))
+ if (part.TaskInventory.ContainsKey(ItemID))
{
- m_thisScriptTask = part.TaskInventory[m_ItemID];
+ ScriptTask = part.TaskInventory[ItemID];
}
}
}
@@ -281,7 +218,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
foreach (string api in am.GetApis())
{
m_Apis[api] = am.CreateApi(api);
- m_Apis[api].Initialize(engine, part, m_LocalID, itemID);
+ m_Apis[api].Initialize(engine, part, LocalID, itemID);
}
try
@@ -315,7 +252,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
// // m_log.Debug("[Script] Script instance created");
- part.SetScriptEvents(m_ItemID,
+ part.SetScriptEvents(ItemID,
(int)m_Script.GetStateEventFlags(State));
}
catch (Exception e)
@@ -330,7 +267,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
m_SaveState = true;
string savedState = Path.Combine(Path.GetDirectoryName(assembly),
- m_ItemID.ToString() + ".state");
+ ItemID.ToString() + ".state");
if (File.Exists(savedState))
{
string xml = String.Empty;
@@ -354,18 +291,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
ScriptSerializer.Deserialize(xml, this);
- AsyncCommandManager.CreateFromData(m_Engine,
- m_LocalID, m_ItemID, m_ObjectID,
+ AsyncCommandManager.CreateFromData(Engine,
+ LocalID, ItemID, ObjectID,
PluginData);
-// m_log.DebugFormat("[Script] Successfully retrieved state for script {0}.{1}", m_PrimName, m_ScriptName);
+// m_log.DebugFormat("[Script] Successfully retrieved state for script {0}.{1}", PrimName, m_ScriptName);
- part.SetScriptEvents(m_ItemID,
+ part.SetScriptEvents(ItemID,
(int)m_Script.GetStateEventFlags(State));
Running = false;
- if (m_ShuttingDown)
+ if (ShuttingDown)
m_startOnInit = false;
// we get new rez events on sim restart, too
@@ -393,7 +330,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
}
// else
// {
-// ScenePresence presence = m_Engine.World.GetScenePresence(part.OwnerID);
+// ScenePresence presence = Engine.World.GetScenePresence(part.OwnerID);
// if (presence != null && (!postOnRez))
// presence.ControllingClient.SendAgentAlertMessage("Compile successful", false);
@@ -411,7 +348,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
if (m_postOnRez)
{
PostEvent(new EventParams("on_rez",
- new Object[] {new LSL_Types.LSLInteger(m_StartParam)}, new DetectParams[0]));
+ new Object[] {new LSL_Types.LSLInteger(StartParam)}, new DetectParams[0]));
}
if (m_stateSource == StateSource.AttachedRez)
@@ -445,7 +382,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
if (m_postOnRez)
{
PostEvent(new EventParams("on_rez",
- new Object[] {new LSL_Types.LSLInteger(m_StartParam)}, new DetectParams[0]));
+ new Object[] {new LSL_Types.LSLInteger(StartParam)}, new DetectParams[0]));
}
if (m_stateSource == StateSource.AttachedRez)
@@ -459,7 +396,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
private void ReleaseControls()
{
- SceneObjectPart part = m_Engine.World.GetSceneObjectPart(m_LocalID);
+ SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID);
if (part != null)
{
@@ -467,18 +404,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
UUID permsGranter;
lock (part.TaskInventory)
{
- if (!part.TaskInventory.ContainsKey(m_ItemID))
+ if (!part.TaskInventory.ContainsKey(ItemID))
return;
- permsGranter = part.TaskInventory[m_ItemID].PermsGranter;
- permsMask = part.TaskInventory[m_ItemID].PermsMask;
+ permsGranter = part.TaskInventory[ItemID].PermsGranter;
+ permsMask = part.TaskInventory[ItemID].PermsMask;
}
if ((permsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0)
{
- ScenePresence presence = m_Engine.World.GetScenePresence(permsGranter);
+ ScenePresence presence = Engine.World.GetScenePresence(permsGranter);
if (presence != null)
- presence.UnRegisterControlEventsToScript(m_LocalID, m_ItemID);
+ presence.UnRegisterControlEventsToScript(LocalID, ItemID);
}
}
}
@@ -486,13 +423,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
public void DestroyScriptInstance()
{
ReleaseControls();
- AsyncCommandManager.RemoveScript(m_Engine, m_LocalID, m_ItemID);
+ AsyncCommandManager.RemoveScript(Engine, LocalID, ItemID);
}
public void RemoveState()
{
string savedState = Path.Combine(Path.GetDirectoryName(m_Assembly),
- m_ItemID.ToString() + ".state");
+ ItemID.ToString() + ".state");
try
{
@@ -505,7 +442,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
public void VarDump(Dictionary vars)
{
- // m_log.Info("Variable dump for script "+ m_ItemID.ToString());
+ // m_log.Info("Variable dump for script "+ ItemID.ToString());
// foreach (KeyValuePair v in vars)
// {
// m_log.Info("Variable: "+v.Key+" = "+v.Value.ToString());
@@ -514,17 +451,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
public void Start()
{
- lock (m_EventQueue)
+ lock (EventQueue)
{
if (Running)
return;
Running = true;
- if (m_EventQueue.Count > 0)
+ if (EventQueue.Count > 0)
{
if (m_CurrentWorkItem == null)
- m_CurrentWorkItem = m_Engine.QueueEventHandler(this);
+ m_CurrentWorkItem = Engine.QueueEventHandler(this);
// else
// m_log.Error("[Script] Tried to start a script that was already queued");
}
@@ -539,7 +476,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
IScriptWorkItem workItem;
- lock (m_EventQueue)
+ lock (EventQueue)
{
if (!Running)
return true;
@@ -569,7 +506,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
return true;
}
- lock (m_EventQueue)
+ lock (EventQueue)
{
workItem = m_CurrentWorkItem;
}
@@ -588,7 +525,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
workItem.Abort();
}
- lock (m_EventQueue)
+ lock (EventQueue)
{
m_CurrentWorkItem = null;
}
@@ -621,7 +558,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
public void PostEvent(EventParams data)
{
// m_log.DebugFormat("[Script] Posted event {2} in state {3} to {0}.{1}",
-// m_PrimName, m_ScriptName, data.EventName, m_State);
+// PrimName, ScriptName, data.EventName, State);
if (!Running)
return;
@@ -636,9 +573,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
m_nextEventTimeTicks = DateTime.Now.Ticks + m_eventDelayTicks;
}
- lock (m_EventQueue)
+ lock (EventQueue)
{
- if (m_EventQueue.Count >= m_MaxScriptQueue)
+ if (EventQueue.Count >= m_MaxScriptQueue)
return;
if (data.EventName == "timer")
@@ -682,11 +619,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
m_CollisionInQueue = true;
}
- m_EventQueue.Enqueue(data);
+ EventQueue.Enqueue(data);
if (m_CurrentWorkItem == null)
{
- m_CurrentWorkItem = m_Engine.QueueEventHandler(this);
+ m_CurrentWorkItem = Engine.QueueEventHandler(this);
}
}
}
@@ -710,14 +647,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
EventParams data = null;
- lock (m_EventQueue)
+ lock (EventQueue)
{
- data = (EventParams) m_EventQueue.Dequeue();
+ data = (EventParams)EventQueue.Dequeue();
if (data == null) // Shouldn't happen
{
- if (m_EventQueue.Count > 0 && Running && !m_ShuttingDown)
+ if (EventQueue.Count > 0 && Running && !ShuttingDown)
{
- m_CurrentWorkItem = m_Engine.QueueEventHandler(this);
+ m_CurrentWorkItem = Engine.QueueEventHandler(this);
}
else
{
@@ -744,28 +681,28 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
if (data.EventName == "state") // Hardcoded state change
{
// m_log.DebugFormat("[Script] Script {0}.{1} state set to {2}",
- // m_PrimName, m_ScriptName, data.Params[0].ToString());
- m_State = data.Params[0].ToString();
- AsyncCommandManager.RemoveScript(m_Engine,
- m_LocalID, m_ItemID);
+ // PrimName, ScriptName, data.Params[0].ToString());
+ State = data.Params[0].ToString();
+ AsyncCommandManager.RemoveScript(Engine,
+ LocalID, ItemID);
- SceneObjectPart part = m_Engine.World.GetSceneObjectPart(
- m_LocalID);
+ SceneObjectPart part = Engine.World.GetSceneObjectPart(
+ LocalID);
if (part != null)
{
- part.SetScriptEvents(m_ItemID,
+ part.SetScriptEvents(ItemID,
(int)m_Script.GetStateEventFlags(State));
}
}
else
{
- if (m_Engine.World.PipeEventsForScript(m_LocalID) ||
+ if (Engine.World.PipeEventsForScript(LocalID) ||
data.EventName == "control") // Don't freeze avies!
{
- SceneObjectPart part = m_Engine.World.GetSceneObjectPart(
- m_LocalID);
+ SceneObjectPart part = Engine.World.GetSceneObjectPart(
+ LocalID);
// m_log.DebugFormat("[Script] Delivered event {2} in state {3} to {0}.{1}",
- // m_PrimName, m_ScriptName, data.EventName, m_State);
+ // PrimName, ScriptName, data.EventName, State);
try
{
@@ -807,7 +744,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
if (text.Length > 1000)
text = text.Substring(0, 1000);
- m_Engine.World.SimChat(Utils.StringToBytes(text),
+ Engine.World.SimChat(Utils.StringToBytes(text),
ChatTypeEnum.DebugChannel, 2147483647,
part.AbsolutePosition,
part.Name, part.UUID, false);
@@ -829,13 +766,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
{
m_InSelfDelete = true;
if (part != null)
- m_Engine.World.DeleteSceneObject(part.ParentGroup, false);
+ Engine.World.DeleteSceneObject(part.ParentGroup, false);
}
else if ((e is TargetInvocationException) && (e.InnerException is ScriptDeleteException))
{
m_InSelfDelete = true;
if (part != null)
- part.Inventory.RemoveInventoryItem(m_ItemID);
+ part.Inventory.RemoveInventoryItem(ItemID);
}
}
}
@@ -843,11 +780,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
// If there are more events and we are currently running and not shutting down, then ask the
// script engine to run the next event.
- lock (m_EventQueue)
+ lock (EventQueue)
{
- if (m_EventQueue.Count > 0 && Running && (!m_ShuttingDown))
+ if (EventQueue.Count > 0 && Running && !ShuttingDown)
{
- m_CurrentWorkItem = m_Engine.QueueEventHandler(this);
+ m_CurrentWorkItem = Engine.QueueEventHandler(this);
}
else
{
@@ -880,15 +817,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
ReleaseControls();
Stop(0);
- SceneObjectPart part=m_Engine.World.GetSceneObjectPart(m_LocalID);
- part.Inventory.GetInventoryItem(m_ItemID).PermsMask = 0;
- part.Inventory.GetInventoryItem(m_ItemID).PermsGranter = UUID.Zero;
- AsyncCommandManager.RemoveScript(m_Engine, m_LocalID, m_ItemID);
- m_EventQueue.Clear();
+ SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID);
+ part.Inventory.GetInventoryItem(ItemID).PermsMask = 0;
+ part.Inventory.GetInventoryItem(ItemID).PermsGranter = UUID.Zero;
+ AsyncCommandManager.RemoveScript(Engine, LocalID, ItemID);
+ EventQueue.Clear();
m_Script.ResetVars();
- m_State = "default";
+ State = "default";
- part.SetScriptEvents(m_ItemID,
+ part.SetScriptEvents(ItemID,
(int)m_Script.GetStateEventFlags(State));
if (running)
Start();
@@ -905,16 +842,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
ReleaseControls();
m_Script.ResetVars();
- SceneObjectPart part=m_Engine.World.GetSceneObjectPart(m_LocalID);
- part.Inventory.GetInventoryItem(m_ItemID).PermsMask = 0;
- part.Inventory.GetInventoryItem(m_ItemID).PermsGranter = UUID.Zero;
- AsyncCommandManager.RemoveScript(m_Engine, m_LocalID, m_ItemID);
+ SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID);
+ part.Inventory.GetInventoryItem(ItemID).PermsMask = 0;
+ part.Inventory.GetInventoryItem(ItemID).PermsGranter = UUID.Zero;
+ AsyncCommandManager.RemoveScript(Engine, LocalID, ItemID);
- m_EventQueue.Clear();
+ EventQueue.Clear();
m_Script.ResetVars();
- m_State = "default";
+ State = "default";
- part.SetScriptEvents(m_ItemID,
+ part.SetScriptEvents(ItemID,
(int)m_Script.GetStateEventFlags(State));
if (m_CurrentEvent != "state_entry")
@@ -969,7 +906,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
return;
}
- PluginData = AsyncCommandManager.GetSerializationData(m_Engine, m_ItemID);
+ PluginData = AsyncCommandManager.GetSerializationData(Engine, ItemID);
string xml = ScriptSerializer.Serialize(this);
@@ -981,7 +918,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
{
try
{
- FileStream fs = File.Create(Path.Combine(Path.GetDirectoryName(assembly), m_ItemID.ToString() + ".state"));
+ FileStream fs = File.Create(Path.Combine(Path.GetDirectoryName(assembly), ItemID.ToString() + ".state"));
System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
Byte[] buf = enc.GetBytes(xml);
fs.Write(buf, 0, buf.Length);
@@ -991,7 +928,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
{
// m_log.Error("Unable to save xml\n"+e.ToString());
}
- //if (!File.Exists(Path.Combine(Path.GetDirectoryName(assembly), m_ItemID.ToString() + ".state")))
+ //if (!File.Exists(Path.Combine(Path.GetDirectoryName(assembly), ItemID.ToString() + ".state")))
//{
// throw new Exception("Completed persistence save, but no file was created");
//}
@@ -1008,7 +945,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
public override string ToString()
{
- return String.Format("{0} {1} on {2}", m_ScriptName, m_ItemID, m_PrimName);
+ return String.Format("{0} {1} on {2}", ScriptName, ItemID, PrimName);
}
string FormatException(Exception e)
@@ -1076,7 +1013,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
// Force an update of the in-memory plugin data
//
- PluginData = AsyncCommandManager.GetSerializationData(m_Engine, m_ItemID);
+ PluginData = AsyncCommandManager.GetSerializationData(Engine, ItemID);
return ScriptSerializer.Serialize(this);
}
--
cgit v1.1