aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
diff options
context:
space:
mode:
authorCasperW2009-11-23 20:25:53 +0100
committerCasperW2009-11-23 20:25:53 +0100
commit247c66b3fe792692468ede6a516d85c6c9852d23 (patch)
tree8779f401224313320b2cad370b16892aef8276c2 /OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
parentFixed nullrefs (diff)
downloadopensim-SC-247c66b3fe792692468ede6a516d85c6c9852d23.zip
opensim-SC-247c66b3fe792692468ede6a516d85c6c9852d23.tar.gz
opensim-SC-247c66b3fe792692468ede6a516d85c6c9852d23.tar.bz2
opensim-SC-247c66b3fe792692468ede6a516d85c6c9852d23.tar.xz
Swap the locking of m_EventQueue and m_Script to ease locks on script inventory operations
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs234
1 files changed, 119 insertions, 115 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index ed3fdbe..063d50f 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -640,154 +640,158 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
640 /// <returns></returns> 640 /// <returns></returns>
641 public object EventProcessor() 641 public object EventProcessor()
642 { 642 {
643
644 EventParams data = null;
645
646 lock (m_EventQueue)
647 {
643 lock (m_Script) 648 lock (m_Script)
644 { 649 {
645 EventParams data = null; 650 data = (EventParams) m_EventQueue.Dequeue();
646 651 if (data == null) // Shouldn't happen
647 lock (m_EventQueue)
648 { 652 {
649 data = (EventParams) m_EventQueue.Dequeue(); 653 if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown))
650 if (data == null) // Shouldn't happen
651 { 654 {
652 if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown)) 655 m_CurrentResult = m_Engine.QueueEventHandler(this);
653 {
654 m_CurrentResult = m_Engine.QueueEventHandler(this);
655 }
656 else
657 {
658 m_CurrentResult = null;
659 }
660 return 0;
661 } 656 }
662 657 else
663 if (data.EventName == "timer")
664 m_TimerQueued = false;
665 if (data.EventName == "control")
666 { 658 {
667 if (m_ControlEventsInQueue > 0) 659 m_CurrentResult = null;
668 m_ControlEventsInQueue--;
669 } 660 }
670 if (data.EventName == "collision") 661 return 0;
671 m_CollisionInQueue = false;
672 } 662 }
673
674 //m_log.DebugFormat("[XENGINE]: Processing event {0} for {1}", data.EventName, this);
675 663
676 m_DetectParams = data.DetectParams; 664 if (data.EventName == "timer")
677 665 m_TimerQueued = false;
678 if (data.EventName == "state") // Hardcoded state change 666 if (data.EventName == "control")
679 { 667 {
680 // m_log.DebugFormat("[Script] Script {0}.{1} state set to {2}", 668 if (m_ControlEventsInQueue > 0)
681 // m_PrimName, m_ScriptName, data.Params[0].ToString()); 669 m_ControlEventsInQueue--;
682 m_State=data.Params[0].ToString(); 670 }
683 AsyncCommandManager.RemoveScript(m_Engine, 671 if (data.EventName == "collision")
684 m_LocalID, m_ItemID); 672 m_CollisionInQueue = false;
673 }
674 }
675 lock(m_Script)
676 {
677
678 //m_log.DebugFormat("[XENGINE]: Processing event {0} for {1}", data.EventName, this);
685 679
686 SceneObjectPart part = m_Engine.World.GetSceneObjectPart( 680 m_DetectParams = data.DetectParams;
687 m_LocalID); 681
688 if (part != null) 682 if (data.EventName == "state") // Hardcoded state change
689 { 683 {
690 part.SetScriptEvents(m_ItemID, 684// m_log.DebugFormat("[Script] Script {0}.{1} state set to {2}",
691 (int)m_Script.GetStateEventFlags(State)); 685// m_PrimName, m_ScriptName, data.Params[0].ToString());
692 } 686 m_State=data.Params[0].ToString();
687 AsyncCommandManager.RemoveScript(m_Engine,
688 m_LocalID, m_ItemID);
689
690 SceneObjectPart part = m_Engine.World.GetSceneObjectPart(
691 m_LocalID);
692 if (part != null)
693 {
694 part.SetScriptEvents(m_ItemID,
695 (int)m_Script.GetStateEventFlags(State));
693 } 696 }
694 else 697 }
698 else
699 {
700 if (m_Engine.World.PipeEventsForScript(m_LocalID) ||
701 data.EventName == "control") // Don't freeze avies!
695 { 702 {
696 if (m_Engine.World.PipeEventsForScript(m_LocalID) || 703 SceneObjectPart part = m_Engine.World.GetSceneObjectPart(
697 data.EventName == "control") // Don't freeze avies! 704 m_LocalID);
698 { 705 // m_log.DebugFormat("[Script] Delivered event {2} in state {3} to {0}.{1}",
699 SceneObjectPart part = m_Engine.World.GetSceneObjectPart( 706 // m_PrimName, m_ScriptName, data.EventName, m_State);
700 m_LocalID);
701 // m_log.DebugFormat("[Script] Delivered event {2} in state {3} to {0}.{1}",
702 // m_PrimName, m_ScriptName, data.EventName, m_State);
703 707
704 try 708 try
705 { 709 {
706 m_CurrentEvent = data.EventName; 710 m_CurrentEvent = data.EventName;
707 m_EventStart = DateTime.Now; 711 m_EventStart = DateTime.Now;
708 m_InEvent = true; 712 m_InEvent = true;
709 713
710 m_Script.ExecuteEvent(State, data.EventName, data.Params); 714 m_Script.ExecuteEvent(State, data.EventName, data.Params);
711 715
712 m_InEvent = false; 716 m_InEvent = false;
713 m_CurrentEvent = String.Empty; 717 m_CurrentEvent = String.Empty;
714 718
715 if (m_SaveState) 719 if (m_SaveState)
716 { 720 {
717 // This will be the very first event we deliver 721 // This will be the very first event we deliver
718 // (state_entry) in default state 722 // (state_entry) in default state
719 // 723 //
720 724
721 SaveState(m_Assembly); 725 SaveState(m_Assembly);
722 726
723 m_SaveState = false; 727 m_SaveState = false;
724 }
725 } 728 }
726 catch (Exception e) 729 }
727 { 730 catch (Exception e)
728 // m_log.DebugFormat("[SCRIPT] Exception: {0}", e.Message); 731 {
729 m_InEvent = false; 732 // m_log.DebugFormat("[SCRIPT] Exception: {0}", e.Message);
730 m_CurrentEvent = String.Empty; 733 m_InEvent = false;
734 m_CurrentEvent = String.Empty;
731 735
732 if ((!(e is TargetInvocationException) || (!(e.InnerException is SelfDeleteException) && !(e.InnerException is ScriptDeleteException))) && !(e is ThreadAbortException)) 736 if ((!(e is TargetInvocationException) || (!(e.InnerException is SelfDeleteException) && !(e.InnerException is ScriptDeleteException))) && !(e is ThreadAbortException))
733 { 737 {
734 try 738 try
735 {
736 // DISPLAY ERROR INWORLD
737 string text = FormatException(e);
738
739 if (text.Length > 1000)
740 text = text.Substring(0, 1000);
741 m_Engine.World.SimChat(Utils.StringToBytes(text),
742 ChatTypeEnum.DebugChannel, 2147483647,
743 part.AbsolutePosition,
744 part.Name, part.UUID, false);
745 }
746 catch (Exception)
747 {
748 }
749 // catch (Exception e2) // LEGIT: User Scripting
750 // {
751 // m_log.Error("[SCRIPT]: "+
752 // "Error displaying error in-world: " +
753 // e2.ToString());
754 // m_log.Error("[SCRIPT]: " +
755 // "Errormessage: Error compiling script:\r\n" +
756 // e.ToString());
757 // }
758 }
759 else if ((e is TargetInvocationException) && (e.InnerException is SelfDeleteException))
760 { 739 {
761 m_InSelfDelete = true; 740 // DISPLAY ERROR INWORLD
762 if (part != null && part.ParentGroup != null) 741 string text = FormatException(e);
763 m_Engine.World.DeleteSceneObject(part.ParentGroup, false); 742
743 if (text.Length > 1000)
744 text = text.Substring(0, 1000);
745 m_Engine.World.SimChat(Utils.StringToBytes(text),
746 ChatTypeEnum.DebugChannel, 2147483647,
747 part.AbsolutePosition,
748 part.Name, part.UUID, false);
764 } 749 }
765 else if ((e is TargetInvocationException) && (e.InnerException is ScriptDeleteException)) 750 catch (Exception)
766 { 751 {
767 m_InSelfDelete = true;
768 if (part != null && part.ParentGroup != null)
769 part.Inventory.RemoveInventoryItem(m_ItemID);
770 } 752 }
753 // catch (Exception e2) // LEGIT: User Scripting
754 // {
755 // m_log.Error("[SCRIPT]: "+
756 // "Error displaying error in-world: " +
757 // e2.ToString());
758 // m_log.Error("[SCRIPT]: " +
759 // "Errormessage: Error compiling script:\r\n" +
760 // e.ToString());
761 // }
762 }
763 else if ((e is TargetInvocationException) && (e.InnerException is SelfDeleteException))
764 {
765 m_InSelfDelete = true;
766 if (part != null && part.ParentGroup != null)
767 m_Engine.World.DeleteSceneObject(part.ParentGroup, false);
768 }
769 else if ((e is TargetInvocationException) && (e.InnerException is ScriptDeleteException))
770 {
771 m_InSelfDelete = true;
772 if (part != null && part.ParentGroup != null)
773 part.Inventory.RemoveInventoryItem(m_ItemID);
771 } 774 }
772 } 775 }
773 } 776 }
777 }
774 778
775 lock (m_EventQueue) 779 lock (m_EventQueue)
780 {
781 if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown))
776 { 782 {
777 if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown)) 783 m_CurrentResult = m_Engine.QueueEventHandler(this);
778 { 784 }
779 m_CurrentResult = m_Engine.QueueEventHandler(this); 785 else
780 } 786 {
781 else 787 m_CurrentResult = null;
782 {
783 m_CurrentResult = null;
784 }
785 } 788 }
789 }
786 790
787 m_DetectParams = null; 791 m_DetectParams = null;
788 792
789 return 0; 793 return 0;
790 } 794 }
791 } 795 }
792 796
793 public int EventTime() 797 public int EventTime()