From 12cebb12d5b095fc8d1a2936b9537ad0e0e7dbe7 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 15 Mar 2012 00:06:52 +0000 Subject: [PATCH 1/6] 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. --- .../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 b84073067c..6a9cd728e9 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 ab41873bcf..44397b7095 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) From 2f81e53f63012f0ed1623dc6159da01a3807fbf6 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 15 Mar 2012 00:20:47 +0000 Subject: [PATCH 2/6] 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 +---------- .../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 9e59d5040b..3a066d426e 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 44397b7095..105d97da47 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) From 5ddda892388fe22912d8992f1c9d24b3667926f0 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 15 Mar 2012 00:48:19 +0000 Subject: [PATCH 3/6] Remove duplication of m_RunEvents and Running --- .../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 6a9cd728e9..cc4be735d9 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); } From f0c1746063dff537d83babcf617b7cf88ed612dc Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 15 Mar 2012 01:26:38 +0000 Subject: [PATCH 4/6] minor: correct indentation levels --- .../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 cc4be735d9..afa9191b5e 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); From 2d32401e23f216565f64163fb3220d035e45b0a8 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 15 Mar 2012 01:32:16 +0000 Subject: [PATCH 5/6] Simplify some logic in the ScriptInstance constructor - running is set to false in both if/else branches --- .../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 afa9191b5e..8b0dbaa672 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 From acb1355ff203b55ae2581b5606e251b8fa91b252 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 15 Mar 2012 02:02:31 +0000 Subject: [PATCH 6/6] Remove property/field duplication in ScriptInstance where it's unnecessary. --- .../Interfaces/IScriptInstance.cs | 8 + .../Shared/Instance/ScriptInstance.cs | 275 +++++++----------- 2 files changed, 114 insertions(+), 169 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs index f00e41f3e1..8762642903 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 8b0dbaa672..968351b450 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 int StartParam { get; set; } + + public TaskInventoryItem ScriptTask { get; private set; } public void ClearQueue() { m_TimerQueued = false; - m_EventQueue.Clear(); - } - - public int StartParam - { - get { return m_StartParam; } - set { m_StartParam = value; } - } - - public TaskInventoryItem ScriptTask - { - get { return m_thisScriptTask; } + 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; + State = "default"; + EventQueue = new Queue(32); - m_LocalID = part.LocalId; - m_ObjectID = part.UUID; - m_ItemID = itemID; - m_AssetID = assetID; - m_PrimName = primName; - m_ScriptName = scriptName; + 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); }