try to manage lua memory leak prevention in a way thats safer from re-entrancy during finalization thread

This commit is contained in:
zeromus 2015-03-28 05:53:03 +00:00
parent 6982df8035
commit e12c711a0e
4 changed files with 28 additions and 3 deletions

View File

@ -159,6 +159,11 @@ namespace BizHawk.Client.EmuHawk
EventsLibrary.CurrentThread = script; EventsLibrary.CurrentThread = script;
_currThread = script; _currThread = script;
var execResult = script.Resume(0); var execResult = script.Resume(0);
_lua.RunScheduledDisposes();
//not sure how this is going to work out, so do this too
script.RunScheduledDisposes();
_currThread = null; _currThread = null;
var result = new ResumeResult(); var result = new ResumeResult();
if (execResult == 0) if (execResult == 0)

View File

@ -959,6 +959,26 @@ namespace LuaInterface
#endregion #endregion
List<int> scheduledDisposes = new List<int>();
internal void ScheduleDispose(int reference)
{
//TODO - theres a race condition here, see comment elsewhere
lock (scheduledDisposes)
scheduledDisposes.Add(reference);
}
public void RunScheduledDisposes()
{
//TODO - theres a race condition here, in case GC happens during this method
lock (scheduledDisposes)
{
foreach (var item in scheduledDisposes)
dispose(item);
scheduledDisposes.Clear();
}
}
internal void dispose(int reference) internal void dispose(int reference)
{ {
if (luaState != IntPtr.Zero) //Fix submitted by Qingrui Li if (luaState != IntPtr.Zero) //Fix submitted by Qingrui Li

View File

@ -16,7 +16,7 @@ namespace LuaInterface
~LuaBase() ~LuaBase()
{ {
//Dispose(false); //Dispose(false);
Dispose(true); //zero 28-feb-2014 - fix memory leak? Dispose(true); //zero 28-feb-2015 - fix memory leak?
} }
public void Dispose() public void Dispose()
@ -31,8 +31,8 @@ namespace LuaInterface
{ {
if (disposeManagedResources) if (disposeManagedResources)
{ {
if (_Reference != 0) if (_Reference != 0 && _Interpreter != null)
_Interpreter.dispose(_Reference); _Interpreter.ScheduleDispose(_Reference);
} }
_Interpreter = null; _Interpreter = null;
_Disposed = true; _Disposed = true;

Binary file not shown.