From 1c8e60f91a647e681fa700d8b8ec9b49a940061f Mon Sep 17 00:00:00 2001 From: Mattes D Date: Mon, 28 Sep 2015 21:30:31 +0200 Subject: Added LuaState tracker and memory stats logging. --- src/Bindings/LuaState.cpp | 72 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) (limited to 'src/Bindings/LuaState.cpp') diff --git a/src/Bindings/LuaState.cpp b/src/Bindings/LuaState.cpp index 1509bd19f..385b1f659 100644 --- a/src/Bindings/LuaState.cpp +++ b/src/Bindings/LuaState.cpp @@ -42,6 +42,76 @@ const cLuaState::cRet cLuaState::Return = {}; +//////////////////////////////////////////////////////////////////////////////// +// cLuaStateTracker: + +void cLuaStateTracker::Add(cLuaState & a_LuaState) +{ + auto & Instance = Get(); + cCSLock Lock(Instance.m_CSLuaStates); + Instance.m_LuaStates.push_back(&a_LuaState); +} + + + + +void cLuaStateTracker::Del(cLuaState & a_LuaState) +{ + auto & Instance = Get(); + cCSLock Lock(Instance.m_CSLuaStates); + Instance.m_LuaStates.erase( + std::remove_if( + Instance.m_LuaStates.begin(), Instance.m_LuaStates.end(), + [&a_LuaState](cLuaStatePtr a_StoredLuaState) + { + return (&a_LuaState == a_StoredLuaState); + } + ), + Instance.m_LuaStates.end() + ); +} + + + + + +AString cLuaStateTracker::GetStats(void) +{ + auto & Instance = Get(); + cCSLock Lock(Instance.m_CSLuaStates); + AString res; + int Total = 0; + for (auto state: Instance.m_LuaStates) + { + int Mem = 0; + if (!state->Call("collectgarbage", "count", cLuaState::Return, Mem)) + { + res.append(Printf("Cannot query memory for state \"%s\"\n", state->GetSubsystemName().c_str())); + } + else + { + res.append(Printf("State \"%s\" is using %d KiB of memory\n", state->GetSubsystemName().c_str(), Mem)); + Total += Mem; + } + } + res.append(Printf("Total memory used by Lua: %d KiB\n", Total)); + return res; +} + + + + + +cLuaStateTracker & cLuaStateTracker::Get(void) +{ + static cLuaStateTracker Inst; // The singleton + return Inst; +} + + + + + //////////////////////////////////////////////////////////////////////////////// // cLuaState: @@ -98,6 +168,7 @@ void cLuaState::Create(void) m_LuaState = lua_open(); luaL_openlibs(m_LuaState); m_IsOwned = true; + cLuaStateTracker::Add(*this); } @@ -133,6 +204,7 @@ void cLuaState::Close(void) Detach(); return; } + cLuaStateTracker::Del(*this); lua_close(m_LuaState); m_LuaState = nullptr; m_IsOwned = false; -- cgit v1.2.3