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:
@@ -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* {
|
||||
|
||||
Reference in New Issue
Block a user