Merge pull request #5370 from pavlos256/lua-dispose-crash

Possible fix for lua crash #5269
This commit is contained in:
Paul Chote
2014-05-20 12:38:40 +12:00
3 changed files with 56 additions and 23 deletions

View File

@@ -81,11 +81,12 @@ namespace OpenRA.Scripting
public ScriptGlobalAttribute(string name) { Name = name; }
}
public class ScriptContext
public class ScriptContext : IDisposable
{
public World World { get; private set; }
public WorldRenderer WorldRenderer { get; private set; }
bool disposed;
readonly MemoryConstrainedLuaRuntime runtime;
readonly LuaFunction tick;
@@ -188,26 +189,34 @@ namespace OpenRA.Scripting
public void Tick(Actor self)
{
if (error)
if (error || disposed)
return;
using (new PerfSample("tick_lua"))
tick.Call().Dispose();
}
public void Dispose()
protected void Dispose(bool disposing)
{
if (runtime == null)
if (disposed)
return;
if (disposing)
runtime.Dispose();
disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
runtime.Dispose();
}
~ScriptContext()
{
if (runtime != null)
Game.RunAfterTick(Dispose);
// Dispose unmanaged resources only
Dispose(false);
}
static Type[] ExtractRequiredTypes(Type t)