diff options
author | Justin Clark-Casey (justincc) | 2013-01-16 02:07:43 +0000 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2013-01-16 02:07:43 +0000 |
commit | 0963ece25bdef16852f5fd8ae4515a2f05d8b6e4 (patch) | |
tree | f95a3eef3e94df4408d555a30cd62bce629623f2 /OpenSim/Region/Framework/Scenes | |
parent | Revert "Implement co-operative script termination if termination comes during... (diff) | |
download | opensim-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.cs | 26 |
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(); |