aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2013-01-16 02:07:43 +0000
committerJustin Clark-Casey (justincc)2013-01-16 02:07:43 +0000
commit0963ece25bdef16852f5fd8ae4515a2f05d8b6e4 (patch)
treef95a3eef3e94df4408d555a30cd62bce629623f2 /OpenSim/Region/Framework/Scenes
parentRevert "Implement co-operative script termination if termination comes during... (diff)
downloadopensim-SC-0963ece25bdef16852f5fd8ae4515a2f05d8b6e4.zip
opensim-SC-0963ece25bdef16852f5fd8ae4515a2f05d8b6e4.tar.gz
opensim-SC-0963ece25bdef16852f5fd8ae4515a2f05d8b6e4.tar.bz2
opensim-SC-0963ece25bdef16852f5fd8ae4515a2f05d8b6e4.tar.xz
Implement co-operative script termination if termination comes during a script wait event (llSleep(), etc.)
This makes use of EventWaitHandles since various web references indicate that Thread.Interrupt() can also cause runtime instability. If co-op termination is enabled, then termination sets the wait handle instead of waiting for a timeout before possibly aborting the thread. This allows the script to cleanly terminate if it's in a llSleep/LL function delay or the next time it enters such a wait without any timeout period. Co-op termination is not yet testable since checking for termination request within loops that never trigger a wait is not yet implemented. This commit, unlike 1b5c41c, passes the wait handle as an extra parameter through IScript.Initialize() instead of passing IScriptInstance itself.
Diffstat (limited to 'OpenSim/Region/Framework/Scenes')
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Inventory.cs26
1 files changed, 23 insertions, 3 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 5c8b097..92bf85a 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1738,6 +1738,21 @@ namespace OpenSim.Region.Framework.Scenes
1738 /// <returns>The part where the script was rezzed if successful. False otherwise.</returns> 1738 /// <returns>The part where the script was rezzed if successful. False otherwise.</returns>
1739 public SceneObjectPart RezNewScript(UUID agentID, InventoryItemBase itemBase) 1739 public SceneObjectPart RezNewScript(UUID agentID, InventoryItemBase itemBase)
1740 { 1740 {
1741 return RezNewScript(
1742 agentID,
1743 itemBase,
1744 "default\n{\n state_entry()\n {\n llSay(0, \"Script running\");\n }\n}");
1745 }
1746
1747 /// <summary>
1748 /// Rez a new script from nothing with given script text.
1749 /// </summary>
1750 /// <param name="remoteClient"></param>
1751 /// <param name="itemBase">Template item.</param>
1752 /// <param name="scriptText"></param>
1753 /// <returns>The part where the script was rezzed if successful. False otherwise.</returns>
1754 public SceneObjectPart RezNewScript(UUID agentID, InventoryItemBase itemBase, string scriptText)
1755 {
1741 // The part ID is the folder ID! 1756 // The part ID is the folder ID!
1742 SceneObjectPart part = GetSceneObjectPart(itemBase.Folder); 1757 SceneObjectPart part = GetSceneObjectPart(itemBase.Folder);
1743 if (part == null) 1758 if (part == null)
@@ -1757,9 +1772,14 @@ namespace OpenSim.Region.Framework.Scenes
1757 return null; 1772 return null;
1758 } 1773 }
1759 1774
1760 AssetBase asset = CreateAsset(itemBase.Name, itemBase.Description, (sbyte)itemBase.AssetType, 1775 AssetBase asset
1761 Encoding.ASCII.GetBytes("default\n{\n state_entry()\n {\n llSay(0, \"Script running\");\n }\n}"), 1776 = CreateAsset(
1762 agentID); 1777 itemBase.Name,
1778 itemBase.Description,
1779 (sbyte)itemBase.AssetType,
1780 Encoding.ASCII.GetBytes(scriptText),
1781 agentID);
1782
1763 AssetService.Store(asset); 1783 AssetService.Store(asset);
1764 1784
1765 TaskInventoryItem taskItem = new TaskInventoryItem(); 1785 TaskInventoryItem taskItem = new TaskInventoryItem();