From afea5f22055fd645e95c4e1dcad01e68716fa049 Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Thu, 13 Sep 2007 11:41:42 +0000 Subject: remove ^M, as native storage should be UNIX format, and ^M in/out mashing will happen on the windows side now that eol-style is correct --- .../ScriptEngine/DotNetEngine/AppDomainManager.cs | 394 ++++++++++----------- 1 file changed, 197 insertions(+), 197 deletions(-) (limited to 'OpenSim/Region/ScriptEngine/DotNetEngine/AppDomainManager.cs') diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/AppDomainManager.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/AppDomainManager.cs index 96670f1..b0b4662 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/AppDomainManager.cs +++ b/OpenSim/Region/ScriptEngine/DotNetEngine/AppDomainManager.cs @@ -1,197 +1,197 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Reflection; -using System.Threading; -using System.Runtime.Remoting; -using System.IO; -using OpenSim.Region.Environment.Scenes; -using OpenSim.Region.Environment.Scenes.Scripting; -using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL; -using OpenSim.Region.ScriptEngine.Common; -using libsecondlife; - -namespace OpenSim.Region.ScriptEngine.DotNetEngine -{ - public class AppDomainManager - { - private int maxScriptsPerAppDomain = 1; - /// - /// Internal list of all AppDomains - /// - private List appDomains = new List(); - /// - /// Structure to keep track of data around AppDomain - /// - private class AppDomainStructure - { - /// - /// The AppDomain itself - /// - public AppDomain CurrentAppDomain; - /// - /// Number of scripts loaded into AppDomain - /// - public int ScriptsLoaded; - /// - /// Number of dead scripts - /// - public int ScriptsWaitingUnload; - } - /// - /// Current AppDomain - /// - private AppDomainStructure currentAD; - private object getLock = new object(); // Mutex - private object freeLock = new object(); // Mutex - - //private ScriptEngine m_scriptEngine; - //public AppDomainManager(ScriptEngine scriptEngine) - public AppDomainManager() - { - //m_scriptEngine = scriptEngine; - } - - /// - /// Find a free AppDomain, creating one if necessary - /// - /// Free AppDomain - private AppDomainStructure GetFreeAppDomain() - { - Console.WriteLine("Finding free AppDomain"); - lock (getLock) - { - // Current full? - if (currentAD != null && currentAD.ScriptsLoaded >= maxScriptsPerAppDomain) - { - // Add it to AppDomains list and empty current - appDomains.Add(currentAD); - currentAD = null; - } - // No current - if (currentAD == null) - { - // Create a new current AppDomain - currentAD = new AppDomainStructure(); - currentAD.CurrentAppDomain = PrepareNewAppDomain(); - } - - Console.WriteLine("Scripts loaded in this Appdomain: " + currentAD.ScriptsLoaded); - return currentAD; - } // lock - } - - private int AppDomainNameCount; - /// - /// Create and prepare a new AppDomain for scripts - /// - /// The new AppDomain - private AppDomain PrepareNewAppDomain() - { - // Create and prepare a new AppDomain - AppDomainNameCount++; - // TODO: Currently security match current appdomain - - // Construct and initialize settings for a second AppDomain. - AppDomainSetup ads = new AppDomainSetup(); - ads.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; - ads.DisallowBindingRedirects = false; - ads.DisallowCodeDownload = true; - ads.ShadowCopyFiles = "true"; // Enabled shadowing - ads.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; - - AppDomain AD = AppDomain.CreateDomain("ScriptAppDomain_" + AppDomainNameCount, null, ads); - - // Return the new AppDomain - return AD; - - } - - /// - /// Unload appdomains that are full and have only dead scripts - /// - private void UnloadAppDomains() - { - lock (freeLock) - { - // Go through all - foreach (AppDomainStructure ads in new System.Collections.ArrayList(appDomains)) - { - // Don't process current AppDomain - if (ads.CurrentAppDomain != currentAD.CurrentAppDomain) - { - // Not current AppDomain - // Is number of unloaded bigger or equal to number of loaded? - if (ads.ScriptsLoaded <= ads.ScriptsWaitingUnload) - { - Console.WriteLine("Found empty AppDomain, unloading"); - // Remove from internal list - appDomains.Remove(ads); -#if DEBUG - long m = GC.GetTotalMemory(true); -#endif - // Unload - AppDomain.Unload(ads.CurrentAppDomain); -#if DEBUG - Console.WriteLine("AppDomain unload freed " + (m - GC.GetTotalMemory(true)) + " bytes of memory"); -#endif - } - } - } // foreach - } // lock - } - - - - public OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass LoadScript(string FileName) - { - // Find next available AppDomain to put it in - AppDomainStructure FreeAppDomain = GetFreeAppDomain(); - - Console.WriteLine("Loading into AppDomain: " + FileName); - LSL_BaseClass mbrt = (LSL_BaseClass)FreeAppDomain.CurrentAppDomain.CreateInstanceFromAndUnwrap(FileName, "SecondLife.Script"); - //Console.WriteLine("ScriptEngine AppDomainManager: is proxy={0}", RemotingServices.IsTransparentProxy(mbrt)); - FreeAppDomain.ScriptsLoaded++; - - return mbrt; - } - - - /// - /// Increase "dead script" counter for an AppDomain - /// - /// - //[Obsolete("Needs fixing, needs a real purpose in life!!!")] - public void StopScript(AppDomain ad) - { - lock (freeLock) - { - Console.WriteLine("Stopping script in AppDomain"); - // Check if it is current AppDomain - if (currentAD.CurrentAppDomain == ad) - { - // Yes - increase - currentAD.ScriptsWaitingUnload++; - return; - } - - // Lopp through all AppDomains - foreach (AppDomainStructure ads in new System.Collections.ArrayList(appDomains)) - { - if (ads.CurrentAppDomain == ad) - { - // Found it - ads.ScriptsWaitingUnload++; - break; - } - } // foreach - } // lock - - UnloadAppDomains(); // Outsite lock, has its own GetLock - - - } - - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Reflection; +using System.Threading; +using System.Runtime.Remoting; +using System.IO; +using OpenSim.Region.Environment.Scenes; +using OpenSim.Region.Environment.Scenes.Scripting; +using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL; +using OpenSim.Region.ScriptEngine.Common; +using libsecondlife; + +namespace OpenSim.Region.ScriptEngine.DotNetEngine +{ + public class AppDomainManager + { + private int maxScriptsPerAppDomain = 1; + /// + /// Internal list of all AppDomains + /// + private List appDomains = new List(); + /// + /// Structure to keep track of data around AppDomain + /// + private class AppDomainStructure + { + /// + /// The AppDomain itself + /// + public AppDomain CurrentAppDomain; + /// + /// Number of scripts loaded into AppDomain + /// + public int ScriptsLoaded; + /// + /// Number of dead scripts + /// + public int ScriptsWaitingUnload; + } + /// + /// Current AppDomain + /// + private AppDomainStructure currentAD; + private object getLock = new object(); // Mutex + private object freeLock = new object(); // Mutex + + //private ScriptEngine m_scriptEngine; + //public AppDomainManager(ScriptEngine scriptEngine) + public AppDomainManager() + { + //m_scriptEngine = scriptEngine; + } + + /// + /// Find a free AppDomain, creating one if necessary + /// + /// Free AppDomain + private AppDomainStructure GetFreeAppDomain() + { + Console.WriteLine("Finding free AppDomain"); + lock (getLock) + { + // Current full? + if (currentAD != null && currentAD.ScriptsLoaded >= maxScriptsPerAppDomain) + { + // Add it to AppDomains list and empty current + appDomains.Add(currentAD); + currentAD = null; + } + // No current + if (currentAD == null) + { + // Create a new current AppDomain + currentAD = new AppDomainStructure(); + currentAD.CurrentAppDomain = PrepareNewAppDomain(); + } + + Console.WriteLine("Scripts loaded in this Appdomain: " + currentAD.ScriptsLoaded); + return currentAD; + } // lock + } + + private int AppDomainNameCount; + /// + /// Create and prepare a new AppDomain for scripts + /// + /// The new AppDomain + private AppDomain PrepareNewAppDomain() + { + // Create and prepare a new AppDomain + AppDomainNameCount++; + // TODO: Currently security match current appdomain + + // Construct and initialize settings for a second AppDomain. + AppDomainSetup ads = new AppDomainSetup(); + ads.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; + ads.DisallowBindingRedirects = false; + ads.DisallowCodeDownload = true; + ads.ShadowCopyFiles = "true"; // Enabled shadowing + ads.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; + + AppDomain AD = AppDomain.CreateDomain("ScriptAppDomain_" + AppDomainNameCount, null, ads); + + // Return the new AppDomain + return AD; + + } + + /// + /// Unload appdomains that are full and have only dead scripts + /// + private void UnloadAppDomains() + { + lock (freeLock) + { + // Go through all + foreach (AppDomainStructure ads in new System.Collections.ArrayList(appDomains)) + { + // Don't process current AppDomain + if (ads.CurrentAppDomain != currentAD.CurrentAppDomain) + { + // Not current AppDomain + // Is number of unloaded bigger or equal to number of loaded? + if (ads.ScriptsLoaded <= ads.ScriptsWaitingUnload) + { + Console.WriteLine("Found empty AppDomain, unloading"); + // Remove from internal list + appDomains.Remove(ads); +#if DEBUG + long m = GC.GetTotalMemory(true); +#endif + // Unload + AppDomain.Unload(ads.CurrentAppDomain); +#if DEBUG + Console.WriteLine("AppDomain unload freed " + (m - GC.GetTotalMemory(true)) + " bytes of memory"); +#endif + } + } + } // foreach + } // lock + } + + + + public OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass LoadScript(string FileName) + { + // Find next available AppDomain to put it in + AppDomainStructure FreeAppDomain = GetFreeAppDomain(); + + Console.WriteLine("Loading into AppDomain: " + FileName); + LSL_BaseClass mbrt = (LSL_BaseClass)FreeAppDomain.CurrentAppDomain.CreateInstanceFromAndUnwrap(FileName, "SecondLife.Script"); + //Console.WriteLine("ScriptEngine AppDomainManager: is proxy={0}", RemotingServices.IsTransparentProxy(mbrt)); + FreeAppDomain.ScriptsLoaded++; + + return mbrt; + } + + + /// + /// Increase "dead script" counter for an AppDomain + /// + /// + //[Obsolete("Needs fixing, needs a real purpose in life!!!")] + public void StopScript(AppDomain ad) + { + lock (freeLock) + { + Console.WriteLine("Stopping script in AppDomain"); + // Check if it is current AppDomain + if (currentAD.CurrentAppDomain == ad) + { + // Yes - increase + currentAD.ScriptsWaitingUnload++; + return; + } + + // Lopp through all AppDomains + foreach (AppDomainStructure ads in new System.Collections.ArrayList(appDomains)) + { + if (ads.CurrentAppDomain == ad) + { + // Found it + ads.ScriptsWaitingUnload++; + break; + } + } // foreach + } // lock + + UnloadAppDomains(); // Outsite lock, has its own GetLock + + + } + + + } +} -- cgit v1.1