aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs68
-rw-r--r--OpenSim/Region/ScriptEngine/XEngine/XEngine.cs8
2 files changed, 54 insertions, 22 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index 17c06e7..9ff2e4d 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -139,7 +139,31 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
139 set { m_RunEvents = value; } 139 set { m_RunEvents = value; }
140 } 140 }
141 141
142 public bool Suspended { get; set; } 142 public bool Suspended
143 {
144 get { return m_Suspended; }
145
146 set
147 {
148 // Need to do this inside a lock in order to avoid races with EventProcessor()
149 lock (m_Script)
150 {
151 bool wasSuspended = m_Suspended;
152 m_Suspended = value;
153
154 if (wasSuspended && !m_Suspended)
155 {
156 lock (m_EventQueue)
157 {
158 // Need to place ourselves back in a work item if there are events to process
159 if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown))
160 m_CurrentResult = m_Engine.QueueEventHandler(this);
161 }
162 }
163 }
164 }
165 }
166 private bool m_Suspended;
143 167
144 public bool ShuttingDown 168 public bool ShuttingDown
145 { 169 {
@@ -650,38 +674,38 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
650 { 674 {
651 EventParams data = null; 675 EventParams data = null;
652 676
677// m_log.DebugFormat("[XEngine]: EventProcessor() invoked for {0}.{1}", PrimName, ScriptName);
678
653 if (Suspended) 679 if (Suspended)
654 return 0; 680 return 0;
655 681
656 lock (m_EventQueue) 682 lock (m_EventQueue)
657 { 683 {
658 lock (m_Script) 684 data = (EventParams) m_EventQueue.Dequeue();
685 if (data == null) // Shouldn't happen
659 { 686 {
660 data = (EventParams) m_EventQueue.Dequeue(); 687 if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown))
661 if (data == null) // Shouldn't happen
662 { 688 {
663 if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown)) 689 m_CurrentResult = m_Engine.QueueEventHandler(this);
664 {
665 m_CurrentResult = m_Engine.QueueEventHandler(this);
666 }
667 else
668 {
669 m_CurrentResult = null;
670 }
671 return 0;
672 } 690 }
673 691 else
674 if (data.EventName == "timer")
675 m_TimerQueued = false;
676 if (data.EventName == "control")
677 { 692 {
678 if (m_ControlEventsInQueue > 0) 693 m_CurrentResult = null;
679 m_ControlEventsInQueue--;
680 } 694 }
681 if (data.EventName == "collision") 695 return 0;
682 m_CollisionInQueue = false;
683 } 696 }
697
698 if (data.EventName == "timer")
699 m_TimerQueued = false;
700 if (data.EventName == "control")
701 {
702 if (m_ControlEventsInQueue > 0)
703 m_ControlEventsInQueue--;
704 }
705 if (data.EventName == "collision")
706 m_CollisionInQueue = false;
684 } 707 }
708
685 lock(m_Script) 709 lock(m_Script)
686 { 710 {
687 711
@@ -693,7 +717,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
693 { 717 {
694 // m_log.DebugFormat("[Script] Script {0}.{1} state set to {2}", 718 // m_log.DebugFormat("[Script] Script {0}.{1} state set to {2}",
695 // m_PrimName, m_ScriptName, data.Params[0].ToString()); 719 // m_PrimName, m_ScriptName, data.Params[0].ToString());
696 m_State=data.Params[0].ToString(); 720 m_State = data.Params[0].ToString();
697 AsyncCommandManager.RemoveScript(m_Engine, 721 AsyncCommandManager.RemoveScript(m_Engine,
698 m_LocalID, m_ItemID); 722 m_LocalID, m_ItemID);
699 723
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 696c216..aa11eca 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -1009,7 +1009,15 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1009 // Do we even have it? 1009 // Do we even have it?
1010 if (!m_Scripts.ContainsKey(itemID)) 1010 if (!m_Scripts.ContainsKey(itemID))
1011 { 1011 {
1012 // Do we even have it?
1013 if (!m_Scripts.ContainsKey(itemID))
1014 return;
1015
1012 lockScriptsForRead(false); 1016 lockScriptsForRead(false);
1017 lockScriptsForWrite(true);
1018 m_Scripts.Remove(itemID);
1019 lockScriptsForWrite(false);
1020
1013 return; 1021 return;
1014 } 1022 }
1015 1023