diff options
Diffstat (limited to 'source/3rd-party/Luax/luax_vm.cpp')
-rw-r--r-- | source/3rd-party/Luax/luax_vm.cpp | 62 |
1 files changed, 54 insertions, 8 deletions
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<lua_State*, LuaxVM*>(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 |