Moved script loading from ScriptManager to AppDomainManager. Now increases scripts loaded count in AppDomain properly.

afrisby
Tedd Hansen 2007-08-19 06:52:59 +00:00
parent 75f6c3d364
commit 1893164d26
2 changed files with 36 additions and 33 deletions

View File

@ -5,6 +5,10 @@ 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;
namespace OpenSim.Region.ScriptEngine.DotNetEngine
{
@ -51,7 +55,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
/// Find a free AppDomain, creating one if necessary
/// </summary>
/// <returns>Free AppDomain</returns>
internal AppDomain GetFreeAppDomain()
private AppDomainStructure GetFreeAppDomain()
{
FreeAppDomains();
lock(GetLock) {
@ -78,9 +82,9 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
// - We assume that every time someone wants an AppDomain they will load into it
// if this assumption is wrong we end up with a miscount and will never unload it.
//
CurrentAD.ScriptsLoaded++;
// Return AppDomain
return CurrentAD.CurrentAppDomain;
return CurrentAD;
} // lock
}
@ -137,12 +141,36 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
} // lock
}
public OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass LoadScript(string FileName, IScriptHost host)
{
//LSL_BaseClass mbrt = (LSL_BaseClass)FreeAppDomain.CreateInstanceAndUnwrap(FileName, "SecondLife.Script");
//Console.WriteLine("Base directory: " + AppDomain.CurrentDomain.BaseDirectory);
// * Find next available AppDomain to put it in
AppDomainStructure FreeAppDomain = GetFreeAppDomain();
LSL_BaseClass mbrt = (LSL_BaseClass)FreeAppDomain.CurrentAppDomain.CreateInstanceFromAndUnwrap(FileName, "SecondLife.Script");
//LSL_BuiltIn_Commands_Interface mbrt = (LSL_BuiltIn_Commands_Interface)FreeAppDomain.CreateInstanceFromAndUnwrap(FileName, "SecondLife.Script");
//Type mytype = mbrt.GetType();
//Console.WriteLine("is proxy={0}", RemotingServices.IsTransparentProxy(mbrt));
FreeAppDomain.ScriptsLoaded++;
//mbrt.Start();
return mbrt;
//return (LSL_BaseClass)mbrt;
}
/// <summary>
/// Increase "dead script" counter for an AppDomain
/// </summary>
/// <param name="ad"></param>
[Obsolete("Needs optimizing!!!")]
public void StopScriptInAppDomain(AppDomain ad)
[Obsolete("Needs fixing!!!")]
public void StopScript(AppDomain ad)
{
lock (FreeLock)
{
@ -170,5 +198,6 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
} // lock
}
}
}

View File

@ -172,15 +172,12 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
// * Insert yield into code
FileName = ProcessYield(FileName);
// * Find next available AppDomain to put it in
AppDomain FreeAppDomain = m_scriptEngine.myAppDomainManager.GetFreeAppDomain();
// * Load and start script, for now with dummy host
//OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSO.LSL_BaseClass Script = LoadAndInitAssembly(FreeAppDomain, FileName);
//OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass Script = LoadAndInitAssembly(FreeAppDomain, FileName, ObjectID);
OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass Script = LoadAndInitAssembly(FreeAppDomain, FileName, ObjectID);
OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass Script = m_scriptEngine.myAppDomainManager.LoadScript(FileName, ObjectID);
// Add it to our temporary active script keeper
//Scripts.Add(FullScriptID, Script);
@ -207,30 +204,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
return FileName;
}
/// <summary>
/// Does actual loading and initialization of script Assembly
/// </summary>
/// <param name="FreeAppDomain">AppDomain to load script into</param>
/// <param name="FileName">FileName of script assembly (.dll)</param>
/// <returns></returns>
private OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass LoadAndInitAssembly(AppDomain FreeAppDomain, string FileName, IScriptHost host)
{
//LSL_BaseClass mbrt = (LSL_BaseClass)FreeAppDomain.CreateInstanceAndUnwrap(FileName, "SecondLife.Script");
//Console.WriteLine("Base directory: " + AppDomain.CurrentDomain.BaseDirectory);
LSL_BaseClass mbrt = (LSL_BaseClass)FreeAppDomain.CreateInstanceFromAndUnwrap(FileName, "SecondLife.Script");
//LSL_BuiltIn_Commands_Interface mbrt = (LSL_BuiltIn_Commands_Interface)FreeAppDomain.CreateInstanceFromAndUnwrap(FileName, "SecondLife.Script");
Type mytype = mbrt.GetType();
Console.WriteLine("is proxy={0}", RemotingServices.IsTransparentProxy(mbrt));
//mbrt.Start();
return mbrt;
//return (LSL_BaseClass)mbrt;
}
/// <summary>
/// Execute a LL-event-function in Script