diff options
author | Tedd Hansen | 2008-11-26 11:12:57 +0000 |
---|---|---|
committer | Tedd Hansen | 2008-11-26 11:12:57 +0000 |
commit | e6ddb5de7de4ed61fa19b3805cd77104328eb20a (patch) | |
tree | 37c975b8d660174d96c05830daf7aab92eaf2309 /OpenSim/Region/ScriptEngine | |
parent | Comment one more field that can't be tested that way anymore (diff) | |
download | opensim-SC_OLD-e6ddb5de7de4ed61fa19b3805cd77104328eb20a.zip opensim-SC_OLD-e6ddb5de7de4ed61fa19b3805cd77104328eb20a.tar.gz opensim-SC_OLD-e6ddb5de7de4ed61fa19b3805cd77104328eb20a.tar.bz2 opensim-SC_OLD-e6ddb5de7de4ed61fa19b3805cd77104328eb20a.tar.xz |
Attempt to give script objects a proper lease time (DNE and xengine). Relies on GC. Also removed lease for LSL_Api as it strictly speaking should not be MarshalByRef. Or should it? If so I broke scripting! :)
Diffstat (limited to 'OpenSim/Region/ScriptEngine')
5 files changed, 48 insertions, 16 deletions
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs index bd60759..b5cbd25 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs +++ b/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs | |||
@@ -28,6 +28,8 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Reflection; | 29 | using System.Reflection; |
30 | using System.Globalization; | 30 | using System.Globalization; |
31 | using System.Runtime.Remoting; | ||
32 | using System.Runtime.Remoting.Lifetime; | ||
31 | using log4net; | 33 | using log4net; |
32 | using OpenMetaverse; | 34 | using OpenMetaverse; |
33 | using OpenSim.Framework; | 35 | using OpenSim.Framework; |
@@ -39,6 +41,7 @@ using System.Collections.Generic; | |||
39 | using System.IO; | 41 | using System.IO; |
40 | using System.Runtime.Serialization.Formatters.Binary; | 42 | using System.Runtime.Serialization.Formatters.Binary; |
41 | using System.Threading; | 43 | using System.Threading; |
44 | using OpenSim.Region.ScriptEngine.Shared.Api.Runtime; | ||
42 | using OpenSim.Region.ScriptEngine.Shared.ScriptBase; | 45 | using OpenSim.Region.ScriptEngine.Shared.ScriptBase; |
43 | using OpenSim.Region.ScriptEngine.Shared.CodeTools; | 46 | using OpenSim.Region.ScriptEngine.Shared.CodeTools; |
44 | 47 | ||
@@ -56,6 +59,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine | |||
56 | public Dictionary<string, IScriptApi> Apis; | 59 | public Dictionary<string, IScriptApi> Apis; |
57 | public Dictionary<KeyValuePair<int,int>, KeyValuePair<int,int>> | 60 | public Dictionary<KeyValuePair<int,int>, KeyValuePair<int,int>> |
58 | LineMap; | 61 | LineMap; |
62 | public ISponsor ScriptSponsor; | ||
59 | } | 63 | } |
60 | 64 | ||
61 | public class ScriptManager | 65 | public class ScriptManager |
@@ -164,6 +168,11 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine | |||
164 | CompiledScript = | 168 | CompiledScript = |
165 | m_scriptEngine.m_AppDomainManager.LoadScript( | 169 | m_scriptEngine.m_AppDomainManager.LoadScript( |
166 | CompiledScriptFile, out id.AppDomain); | 170 | CompiledScriptFile, out id.AppDomain); |
171 | //Register the sponsor | ||
172 | ISponsor scriptSponsor = new ScriptSponsor(); | ||
173 | ILease lease = (ILease)RemotingServices.GetLifetimeService(CompiledScript as MarshalByRefObject); | ||
174 | lease.Register(scriptSponsor); | ||
175 | id.ScriptSponsor = scriptSponsor; | ||
167 | 176 | ||
168 | id.LineMap = LSLCompiler.LineMap(); | 177 | id.LineMap = LSLCompiler.LineMap(); |
169 | id.Script = CompiledScript; | 178 | id.Script = CompiledScript; |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 17dca98..cbd99bb 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -29,6 +29,7 @@ using System; | |||
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Runtime.Remoting.Lifetime; | 31 | using System.Runtime.Remoting.Lifetime; |
32 | using System.Security.Permissions; | ||
32 | using System.Text; | 33 | using System.Text; |
33 | using System.Threading; | 34 | using System.Threading; |
34 | using Nini.Config; | 35 | using Nini.Config; |
@@ -64,7 +65,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
64 | /// <summary> | 65 | /// <summary> |
65 | /// Contains all LSL ll-functions. This class will be in Default AppDomain. | 66 | /// Contains all LSL ll-functions. This class will be in Default AppDomain. |
66 | /// </summary> | 67 | /// </summary> |
67 | public class LSL_Api : MarshalByRefObject, ILSL_Api, IScriptApi | 68 | public class LSL_Api : ILSL_Api, IScriptApi |
68 | { | 69 | { |
69 | protected IScriptEngine m_ScriptEngine; | 70 | protected IScriptEngine m_ScriptEngine; |
70 | protected SceneObjectPart m_host; | 71 | protected SceneObjectPart m_host; |
@@ -98,17 +99,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
98 | AsyncCommands = new AsyncCommandManager(ScriptEngine); | 99 | AsyncCommands = new AsyncCommandManager(ScriptEngine); |
99 | } | 100 | } |
100 | 101 | ||
101 | // Object never expires | ||
102 | public override Object InitializeLifetimeService() | ||
103 | { | ||
104 | ILease lease = (ILease)base.InitializeLifetimeService(); | ||
105 | 102 | ||
106 | if (lease.CurrentState == LeaseState.Initial) | 103 | |
107 | { | ||
108 | lease.InitialLeaseTime = TimeSpan.Zero; | ||
109 | } | ||
110 | return lease; | ||
111 | } | ||
112 | 104 | ||
113 | protected void ScriptSleep(int delay) | 105 | protected void ScriptSleep(int delay) |
114 | { | 106 | { |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs index 25c823d..06307bb 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs | |||
@@ -27,6 +27,7 @@ | |||
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Runtime.Remoting.Lifetime; | 29 | using System.Runtime.Remoting.Lifetime; |
30 | using System.Security.Permissions; | ||
30 | using System.Threading; | 31 | using System.Threading; |
31 | using System.Reflection; | 32 | using System.Reflection; |
32 | using System.Collections; | 33 | using System.Collections; |
@@ -40,16 +41,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
40 | { | 41 | { |
41 | private Dictionary<string,MethodInfo> inits = new Dictionary<string,MethodInfo>(); | 42 | private Dictionary<string,MethodInfo> inits = new Dictionary<string,MethodInfo>(); |
42 | 43 | ||
43 | // | 44 | // Object expires if we don't keep it alive |
44 | // Never expire this object | 45 | // sponsor will be added on object load |
45 | // | 46 | [SecurityPermissionAttribute(SecurityAction.Demand, |
47 | Flags = SecurityPermissionFlag.Infrastructure)] | ||
46 | public override Object InitializeLifetimeService() | 48 | public override Object InitializeLifetimeService() |
47 | { | 49 | { |
48 | ILease lease = (ILease)base.InitializeLifetimeService(); | 50 | ILease lease = (ILease)base.InitializeLifetimeService(); |
49 | |||
50 | if (lease.CurrentState == LeaseState.Initial) | 51 | if (lease.CurrentState == LeaseState.Initial) |
51 | { | 52 | { |
52 | lease.InitialLeaseTime = TimeSpan.Zero; | 53 | lease.InitialLeaseTime = TimeSpan.FromMinutes(1); |
54 | lease.SponsorshipTimeout = TimeSpan.FromMinutes(2); | ||
55 | lease.RenewOnCallTime = TimeSpan.FromSeconds(2); | ||
53 | } | 56 | } |
54 | return lease; | 57 | return lease; |
55 | } | 58 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptSponsor.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptSponsor.cs new file mode 100644 index 0000000..87401bb --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptSponsor.cs | |||
@@ -0,0 +1,17 @@ | |||
1 | using System; | ||
2 | using System.Collections.Generic; | ||
3 | using System.Runtime.Remoting.Lifetime; | ||
4 | using System.Text; | ||
5 | |||
6 | namespace OpenSim.Region.ScriptEngine.Shared.Api.Runtime | ||
7 | { | ||
8 | public class ScriptSponsor: ISponsor | ||
9 | { | ||
10 | // In theory: I execute, therefore I am. | ||
11 | // If GC collects this class then sponsorship will expire | ||
12 | public TimeSpan Renewal(ILease lease) | ||
13 | { | ||
14 | return TimeSpan.FromMinutes(2); | ||
15 | } | ||
16 | } | ||
17 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index ad86494..2a8bba8 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | |||
@@ -27,6 +27,8 @@ | |||
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.IO; | 29 | using System.IO; |
30 | using System.Runtime.Remoting; | ||
31 | using System.Runtime.Remoting.Lifetime; | ||
30 | using System.Threading; | 32 | using System.Threading; |
31 | using System.Collections; | 33 | using System.Collections; |
32 | using System.Collections.Generic; | 34 | using System.Collections.Generic; |
@@ -44,6 +46,7 @@ using OpenSim.Region.Environment.Scenes; | |||
44 | using OpenSim.Region.Environment.Interfaces; | 46 | using OpenSim.Region.Environment.Interfaces; |
45 | using OpenSim.Region.ScriptEngine.Shared; | 47 | using OpenSim.Region.ScriptEngine.Shared; |
46 | using OpenSim.Region.ScriptEngine.Shared.Api; | 48 | using OpenSim.Region.ScriptEngine.Shared.Api; |
49 | using OpenSim.Region.ScriptEngine.Shared.Api.Runtime; | ||
47 | using OpenSim.Region.ScriptEngine.Shared.ScriptBase; | 50 | using OpenSim.Region.ScriptEngine.Shared.ScriptBase; |
48 | using OpenSim.Region.ScriptEngine.Shared.CodeTools; | 51 | using OpenSim.Region.ScriptEngine.Shared.CodeTools; |
49 | using OpenSim.Region.ScriptEngine.Interfaces; | 52 | using OpenSim.Region.ScriptEngine.Interfaces; |
@@ -80,6 +83,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
80 | private int m_ControlEventsInQueue = 0; | 83 | private int m_ControlEventsInQueue = 0; |
81 | private int m_LastControlLevel = 0; | 84 | private int m_LastControlLevel = 0; |
82 | private bool m_CollisionInQueue = false; | 85 | private bool m_CollisionInQueue = false; |
86 | private ISponsor m_ScriptSponsor; | ||
83 | private Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>> | 87 | private Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>> |
84 | m_LineMap; | 88 | m_LineMap; |
85 | 89 | ||
@@ -204,6 +208,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
204 | m_Script = (IScript)dom.CreateInstanceAndUnwrap( | 208 | m_Script = (IScript)dom.CreateInstanceAndUnwrap( |
205 | Path.GetFileNameWithoutExtension(assembly), | 209 | Path.GetFileNameWithoutExtension(assembly), |
206 | "SecondLife.Script"); | 210 | "SecondLife.Script"); |
211 | |||
212 | // Add a sponsor to the script | ||
213 | ISponsor scriptSponsor = new ScriptSponsor(); | ||
214 | ILease lease = (ILease)RemotingServices.GetLifetimeService(m_Script as MarshalByRefObject); | ||
215 | lease.Register(scriptSponsor); | ||
216 | m_ScriptSponsor = scriptSponsor; | ||
217 | |||
207 | } | 218 | } |
208 | catch (Exception e) | 219 | catch (Exception e) |
209 | { | 220 | { |