From the PIR-1 code:
Code:
if ( LockLua(1000) ) {
lua_State * L = g_L;
if ( L != 0 && m_CB != LUA_NOREF ) {
lua_rawgeti(L, LUA_REGISTRYINDEX, m_CB);
lua_pushstring(L, serial.c_str());
lua_pushnumber(L, arriveRemove);
lua_pushstring(L,"_TRACEBACK");
lua_gettable(L, LUA_GLOBALSINDEX);
lua_insert( L, -2-2);
if (lua_pcall (L,2,0,-2-2) != 0)
{
luaP_print(L, lua_tostring(L,-1));
}
lua_settop(L,0);
}
UnlockLua();
}
g_L comes from gir_info. The plugin stores the Lua state when Girder calls that function with GIRINFO_SCRIPT_AFTER_STARTED. Girder holds the Lua lock during that time so it should be thread safe.
Code:
int WINAPI gir_info(int message, int wparam, int lparam)
{
switch ( message )
{
case GIRINFO_SCRIPT_AFTER_STARTED:
g_L = ( lua_State * ) lparam;
register_lua(g_L);
break;
case GIRINFO_SCRIPT_BEFORE_STOPPED:
unregister_lua(( lua_State * ) lparam);
g_L = 0;
break;
case GIRINFO_DEVICE_CHANGE:
break;
}
return GIR_TRUE;
}