From 1284369a329d3ae621c0ef0596d01d67e8c70e62 Mon Sep 17 00:00:00 2001 From: Tedd Hansen Date: Sat, 18 Aug 2007 18:18:14 +0000 Subject: Started on AppDomains for ScriptEngine. Moved llFunctions in LSL_BaseClass.cs to LSL_BuiltIn_Commands.cs. Changed how scripts are loaded. --- .../ScriptEngine/DotNetEngine/AppDomainManager.cs | 115 +++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 OpenSim/Region/ScriptEngine/DotNetEngine/AppDomainManager.cs (limited to 'OpenSim/Region/ScriptEngine/DotNetEngine/AppDomainManager.cs') diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/AppDomainManager.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/AppDomainManager.cs new file mode 100644 index 0000000..1e20547 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/DotNetEngine/AppDomainManager.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Reflection; +using System.Threading; +using System.Runtime.Remoting; +using System.IO; + +namespace OpenSim.Region.ScriptEngine.DotNetEngine +{ + public class AppDomainManager + { + private int MaxScriptsPerAppDomain = 10; + private List AppDomains = new List(); + private struct AppDomainStructure + { + /// + /// The AppDomain itself + /// + public AppDomain CurrentAppDomain; + /// + /// Number of scripts loaded into AppDomain + /// + public int ScriptsLoaded; + /// + /// Number of dead scripts + /// + public int ScriptsWaitingUnload; + } + private AppDomainStructure CurrentAD; + private object GetLock = new object(); + + private ScriptEngine m_scriptEngine; + public AppDomainManager(ScriptEngine scriptEngine) + { + m_scriptEngine = scriptEngine; + } + + internal AppDomain GetFreeAppDomain() + { + lock(GetLock) { + // No current or current full? + if (CurrentAD.CurrentAppDomain == null || CurrentAD.ScriptsLoaded >= MaxScriptsPerAppDomain) + { + // Create a new current AppDomain + CurrentAD = new AppDomainStructure(); + CurrentAD.ScriptsWaitingUnload = 0; // to avoid compile warning for not in use + CurrentAD.CurrentAppDomain = PrepareNewAppDomain(); + AppDomains.Add(CurrentAD); + + } + + // Increase number of scripts loaded + CurrentAD.ScriptsLoaded++; + // Return AppDomain + return CurrentAD.CurrentAppDomain; + } // lock + } + + private int AppDomainNameCount; + private AppDomain PrepareNewAppDomain() + { + // Create and prepare a new AppDomain + AppDomainNameCount++; + // TODO: Currently security and configuration match current appdomain + + // Construct and initialize settings for a second AppDomain. + AppDomainSetup ads = new AppDomainSetup(); + ads.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; + //Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ScriptEngines"); + //ads.ApplicationName = "DotNetScriptEngine"; + //ads.DynamicBase = ads.ApplicationBase; + + Console.WriteLine("AppDomain BaseDirectory: " + ads.ApplicationBase); + ads.DisallowBindingRedirects = false; + ads.DisallowCodeDownload = true; + ads.ShadowCopyFiles = "true"; + + ads.ConfigurationFile = + AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; + + AppDomain AD = AppDomain.CreateDomain("ScriptAppDomain_" + AppDomainNameCount, null, ads); + foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies()) + { + //Console.WriteLine("Loading: " + a.GetName(true)); + try + { + AD.Load(a.GetName(true)); + + } + catch (Exception e) + { + //Console.WriteLine("FAILED load"); + } + + } + + Console.WriteLine("Assembly file: " + this.GetType().Assembly.CodeBase); + Console.WriteLine("Assembly name: " + this.GetType().ToString()); + //AD.CreateInstanceFrom(this.GetType().Assembly.CodeBase, "OpenSim.Region.ScriptEngine.DotNetEngine.ScriptEngine"); + + //AD.Load(this.GetType().Assembly.CodeBase); + + Console.WriteLine("Done preparing new appdomain."); + return AD; + + } + + public class NOOP : MarshalByRefType + { + public NOOP() { + } + } + } +} -- cgit v1.1