From 550f852dac980bbcd8315a3e3344b245d3150ee0 Mon Sep 17 00:00:00 2001 From: 0O0o0oOoO00 <11174151+0O0o0oOoO00@users.noreply.github.com> Date: Fri, 21 Nov 2025 22:13:15 +0800 Subject: [PATCH] add: register debug hook when init and hold it --- blcrack/cracker/cracker.cpp | 31 ++++++++++++++++++++++++------- blcrack/cracker/cracker.hpp | 3 +++ 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/blcrack/cracker/cracker.cpp b/blcrack/cracker/cracker.cpp index e590f1bc4..d0d7a4794 100644 --- a/blcrack/cracker/cracker.cpp +++ b/blcrack/cracker/cracker.cpp @@ -57,15 +57,20 @@ static fnset_TimeScaleT get_Time_set_timeScale() { SPDLOG_INFO("{} called", #f); \ } -LuaStatePauser::LuaStatePauser(lua_State* L) : m_L(L) {} - -void LuaStatePauser::set() { +LuaStatePauser::LuaStatePauser(lua_State* L) : m_L(L) { thiz = this; - m_ready_flag = false; register_debug_hook(); } +void LuaStatePauser::set() { + if (lua_gethook(m_L) != LuaStatePauser::debug_hook) { + register_debug_hook(); + } + m_ready_flag = false; +} + void LuaStatePauser::wait_paused() { + m_need_pause = true; m_pause_flag.wait(false); } @@ -76,14 +81,14 @@ void LuaStatePauser::ready() { } void LuaStatePauser::release() { - thiz = nullptr; + m_need_pause = false; m_pause_flag = false; - unregister_debug_hook(); } LuaStatePauser* LuaStatePauser::thiz = nullptr; void LuaStatePauser::register_debug_hook() { + SPDLOG_INFO("registering debug hook"); int ret = lua_sethook(m_L, LuaStatePauser::debug_hook, LUA_MASKCALL, 0); if (ret != 1) { SPDLOG_INFO("set pause hook failed with code: {}", ret); @@ -106,10 +111,20 @@ void LuaStatePauser::wait_ready() { m_ready_flag.wait(false); } +bool LuaStatePauser::need_pause() { + return m_need_pause.load(); +} + extern bool g_is_game_loaded; void LuaStatePauser::debug_hook(lua_State *L, lua_Debug *ar) { if (g_is_game_loaded) { + if (!thiz) { + return; + } + if (!thiz->need_pause()) { + return; + } SPDLOG_INFO("pause triggered, notify to operate lua state"); thiz->paused(); thiz->wait_ready(); @@ -126,7 +141,9 @@ LuaStatePauserGuard::~LuaStatePauserGuard() { m_p->release(); } -#define LUA_STATUS_PAUSER_GUARD() auto _ = LuaStatePauserGuard(&m_lua_state_pauser) +#define LUA_STATUS_PAUSER_GUARD() \ + auto __pc = std::lock_guard(m_pauser_lock); \ + auto __pg = LuaStatePauserGuard(&m_lua_state_pauser); Cracker::Cracker(bool need_pause) : m_state([]() -> lua_State* { diff --git a/blcrack/cracker/cracker.hpp b/blcrack/cracker/cracker.hpp index 67670ed8c..2facd8668 100644 --- a/blcrack/cracker/cracker.hpp +++ b/blcrack/cracker/cracker.hpp @@ -36,6 +36,7 @@ private: void paused(); void wait_ready(); + bool need_pause(); static LuaStatePauser* thiz; static void debug_hook(lua_State *L, lua_Debug *ar); @@ -43,6 +44,7 @@ private: std::atomic_bool m_pause_flag = ATOMIC_FLAG_INIT; std::atomic_bool m_ready_flag = ATOMIC_FLAG_INIT; lua_State* m_L; + std::atomic m_need_pause = false; }; class LuaStatePauserGuard { @@ -446,6 +448,7 @@ private: std::atomic m_global_speedup_rate = 1.0; std::atomic m_better_global_speedup_rate = 1.0; LuaStatePauser m_lua_state_pauser; + std::mutex m_pauser_lock; std::atomic m_better_global_speedup_need_pause = false; std::atomic m_skip_battle_celebrate_need_pause = false; };