1
0
mirror of https://github.com/0O0o0oOoO00/Alas.git synced 2026-05-14 15:49:25 +08:00

add: register debug hook when init and hold it

This commit is contained in:
0O0o0oOoO00
2025-11-21 22:13:15 +08:00
parent 4627c6cf11
commit 550f852dac
2 changed files with 27 additions and 7 deletions

View File

@@ -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<std::mutex>(m_pauser_lock); \
auto __pg = LuaStatePauserGuard(&m_lua_state_pauser);
Cracker::Cracker(bool need_pause)
: m_state([]() -> lua_State* {