Commit a9698525 authored by Kalin Toshev's avatar Kalin Toshev
Browse files

Need to protect the translator pool with (global) lock during add/remove

parent 9e671dcc
...@@ -99,6 +99,11 @@ namespace NLua ...@@ -99,6 +99,11 @@ namespace NLua
private LuaNativeFunction panicCallback; private LuaNativeFunction panicCallback;
private ObjectTranslator translator; private ObjectTranslator translator;
/// <summary>
/// Used to protect the (global) object translator pool during add/remove
/// </summary>
private static readonly object translatorPoolLock = new object();
/// <summary> /// <summary>
/// Used to ensure multiple .net threads all get serialized by this single lock for access to the lua stack/objects /// Used to ensure multiple .net threads all get serialized by this single lock for access to the lua stack/objects
/// </summary> /// </summary>
...@@ -318,7 +323,10 @@ end ...@@ -318,7 +323,10 @@ end
LuaLib.LuaSetTable (luaState, -3); LuaLib.LuaSetTable (luaState, -3);
LuaLib.LuaNetPopGlobalTable (luaState); LuaLib.LuaNetPopGlobalTable (luaState);
translator = new ObjectTranslator (this, luaState); translator = new ObjectTranslator (this, luaState);
ObjectTranslatorPool.Instance.Add (luaState, translator); lock (translatorPoolLock)
{
ObjectTranslatorPool.Instance.Add (luaState, translator);
}
LuaLib.LuaNetPopGlobalTable (luaState); LuaLib.LuaNetPopGlobalTable (luaState);
LuaLib.LuaLDoString (luaState, Lua.initLuanet); LuaLib.LuaLDoString (luaState, Lua.initLuanet);
} }
...@@ -329,8 +337,11 @@ end ...@@ -329,8 +337,11 @@ end
return; return;
if (! CheckNull.IsNull(luaState)) { if (! CheckNull.IsNull(luaState)) {
ObjectTranslatorPool.Instance.Remove (luaState); lock (translatorPoolLock)
LuaCore.LuaClose (luaState); {
LuaCore.LuaClose (luaState);
ObjectTranslatorPool.Instance.Remove (luaState);
}
} }
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment