From 62085e1b49ce2d8a630373e410812d5c4a9eecc2 Mon Sep 17 00:00:00 2001 From: chai Date: Fri, 29 Mar 2019 08:56:55 +0800 Subject: *luax --- source/3rd-party/Luax/luax_vm.cpp | 62 ++++++++++++++++++++++++++++++++++----- 1 file changed, 54 insertions(+), 8 deletions(-) (limited to 'source/3rd-party/Luax/luax_vm.cpp') diff --git a/source/3rd-party/Luax/luax_vm.cpp b/source/3rd-party/Luax/luax_vm.cpp index 4257b4d..549e20b 100644 --- a/source/3rd-party/Luax/luax_vm.cpp +++ b/source/3rd-party/Luax/luax_vm.cpp @@ -3,27 +3,73 @@ namespace Luax { - LuaxVM::LuaxVM(lua_State* L) - : state(L) + LuaxVM::ThreadMap threadMap; // 通过线程查找虚拟机,为了方便 + + LuaxVM* LuaxVM::TryGetVM(lua_State* L) { - assert(state); + auto it = threadMap.find(L); + if (it != threadMap.end()) + return it->second; + else + return nullptr; + } + + LuaxVM::LuaxVM() + : mStrongRefTable() + , mWeakRefTable() + { + mMainThread = luaL_newstate(); + assert(mMainThread); + mThreads.insert(mMainThread); + + threadMap.insert(std::pair(mMainThread, this)); } LuaxVM::~LuaxVM() { + lua_close(mMainThread); } // 初始化context void LuaxVM::Setup() { - SetupRefTables(); + LUAX_STATE(mMainThread); + // 设置全局引用表 + mStrongRefTable.Init(state, "_LUAX_STRONGREF_TABLE"); + mWeakRefTable.Init(state, "_LUAX_WEAKREF_TABLE", "v"); + } + + lua_State* LuaxVM::CreateThread() + { + lua_State* thread = lua_newthread(mMainThread); + assert(thread); + mThreads.insert(thread); + return thread; + } + + lua_State* LuaxVM::GetMainThread() + { + return mMainThread; + } + + LuaxRefTable& LuaxVM::GetStrongRefTable() + { + return mStrongRefTable; + } + + LuaxRefTable& LuaxVM::GetWeakRefTable() + { + return mWeakRefTable; + } + + bool LuaxVM::HasThread(lua_State* L) + { + return mThreads.find(L) != mThreads.end(); } - void LuaxVM::SetupRefTables() + int LuaxVM::GetThreadCount() { - // strong ref和 weak ref - strongRefTable.Init(state, "_LUAX_STRONGREF_TABLE"); - weakRefTable.Init(state, "_LUAX_WEAKREF_TABLE", "v"); + return mThreads.size(); } } \ No newline at end of file -- cgit v1.1-26-g67d0