diff --git a/src/lj_dispatch.c b/src/lj_dispatch.c index af269c44..0146d8cd 100644 --- a/src/lj_dispatch.c +++ b/src/lj_dispatch.c @@ -362,11 +362,19 @@ static void callhook(lua_State *L, int event, BCLine line) /* Top frame, nextframe = NULL. */ ar.i_ci = (int)((L->base-1) - tvref(L->stack)); lj_state_checkstack(L, 1+LUA_MINSTACK); +#if LJ_HASPROFILE && !LJ_PROFILE_SIGPROF + lj_profile_hook_enter(g); +#else hook_enter(g); +#endif hookf(L, &ar); lua_assert(hook_active(g)); setgcref(g->cur_L, obj2gco(L)); +#if LJ_HASPROFILE && !LJ_PROFILE_SIGPROF + lj_profile_hook_leave(g); +#else hook_leave(g); +#endif } } diff --git a/src/lj_profile.c b/src/lj_profile.c index 1984a676..b4bab7f8 100644 --- a/src/lj_profile.c +++ b/src/lj_profile.c @@ -87,6 +87,34 @@ static ProfileState profile_state; /* Default sample interval in milliseconds. */ #define LJ_PROFILE_INTERVAL_DEFAULT 10 +/* -- Profiler/hook interaction ------------------------------------------- */ + +#if !LJ_PROFILE_SIGPROF +void LJ_FASTCALL lj_profile_hook_enter(global_State *g) +{ + ProfileState *ps = &profile_state; + if (ps->g) { + profile_lock(ps); + hook_enter(g); + profile_unlock(ps); + } else { + hook_enter(g); + } +} + +void LJ_FASTCALL lj_profile_hook_leave(global_State *g) +{ + ProfileState *ps = &profile_state; + if (ps->g) { + profile_lock(ps); + hook_leave(g); + profile_unlock(ps); + } else { + hook_leave(g); + } +} +#endif + /* -- Profile callbacks --------------------------------------------------- */ /* Callback from profile hook (HOOK_PROFILE already cleared). */ diff --git a/src/lj_profile.h b/src/lj_profile.h index ad26f2b6..3feb3c1e 100644 --- a/src/lj_profile.h +++ b/src/lj_profile.h @@ -11,6 +11,10 @@ #if LJ_HASPROFILE LJ_FUNC void LJ_FASTCALL lj_profile_interpreter(lua_State *L); +#if !LJ_PROFILE_SIGPROF +LJ_FUNC void LJ_FASTCALL lj_profile_hook_enter(global_State *g); +LJ_FUNC void LJ_FASTCALL lj_profile_hook_leave(global_State *g); +#endif #endif