diff options
author | Mike Pall <mike> | 2019-12-08 19:56:56 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2019-12-08 19:56:56 +0100 |
commit | 92fa45f9eb5d9aa732c6b972a85c26120d7612b4 (patch) | |
tree | d77d6d6d99b040b38d9c596528aeea02044a3814 /src | |
parent | 9600e4318e17ef73d73c1980008d648c1c98f959 (diff) | |
download | luajit-92fa45f9eb5d9aa732c6b972a85c26120d7612b4.tar.gz luajit-92fa45f9eb5d9aa732c6b972a85c26120d7612b4.tar.bz2 luajit-92fa45f9eb5d9aa732c6b972a85c26120d7612b4.zip |
Fix interaction between profiler hooks and finalizers.
Thanks to Julien Desgats.
Diffstat (limited to 'src')
-rw-r--r-- | src/lj_gc.c | 2 | ||||
-rw-r--r-- | src/lj_obj.h | 3 | ||||
-rw-r--r-- | src/lj_profile.c | 2 |
3 files changed, 5 insertions, 2 deletions
diff --git a/src/lj_gc.c b/src/lj_gc.c index 2aaf5b2c..012d0879 100644 --- a/src/lj_gc.c +++ b/src/lj_gc.c | |||
@@ -466,6 +466,7 @@ static void gc_call_finalizer(global_State *g, lua_State *L, | |||
466 | TValue *top; | 466 | TValue *top; |
467 | lj_trace_abort(g); | 467 | lj_trace_abort(g); |
468 | hook_entergc(g); /* Disable hooks and new traces during __gc. */ | 468 | hook_entergc(g); /* Disable hooks and new traces during __gc. */ |
469 | if (LJ_HASPROFILE && (oldh & HOOK_PROFILE)) lj_dispatch_update(g); | ||
469 | g->gc.threshold = LJ_MAX_MEM; /* Prevent GC steps. */ | 470 | g->gc.threshold = LJ_MAX_MEM; /* Prevent GC steps. */ |
470 | top = L->top; | 471 | top = L->top; |
471 | copyTV(L, top++, mo); | 472 | copyTV(L, top++, mo); |
@@ -474,6 +475,7 @@ static void gc_call_finalizer(global_State *g, lua_State *L, | |||
474 | L->top = top+1; | 475 | L->top = top+1; |
475 | errcode = lj_vm_pcall(L, top, 1+0, -1); /* Stack: |mo|o| -> | */ | 476 | errcode = lj_vm_pcall(L, top, 1+0, -1); /* Stack: |mo|o| -> | */ |
476 | hook_restore(g, oldh); | 477 | hook_restore(g, oldh); |
478 | if (LJ_HASPROFILE && (oldh & HOOK_PROFILE)) lj_dispatch_update(g); | ||
477 | g->gc.threshold = oldt; /* Restore GC threshold. */ | 479 | g->gc.threshold = oldt; /* Restore GC threshold. */ |
478 | if (errcode) | 480 | if (errcode) |
479 | lj_err_throw(L, errcode); /* Propagate errors. */ | 481 | lj_err_throw(L, errcode); /* Propagate errors. */ |
diff --git a/src/lj_obj.h b/src/lj_obj.h index 72b7ace8..5d5cc49b 100644 --- a/src/lj_obj.h +++ b/src/lj_obj.h | |||
@@ -638,7 +638,8 @@ typedef struct global_State { | |||
638 | #define HOOK_PROFILE 0x80 | 638 | #define HOOK_PROFILE 0x80 |
639 | #define hook_active(g) ((g)->hookmask & HOOK_ACTIVE) | 639 | #define hook_active(g) ((g)->hookmask & HOOK_ACTIVE) |
640 | #define hook_enter(g) ((g)->hookmask |= HOOK_ACTIVE) | 640 | #define hook_enter(g) ((g)->hookmask |= HOOK_ACTIVE) |
641 | #define hook_entergc(g) ((g)->hookmask |= (HOOK_ACTIVE|HOOK_GC)) | 641 | #define hook_entergc(g) \ |
642 | ((g)->hookmask = ((g)->hookmask | (HOOK_ACTIVE|HOOK_GC)) & ~HOOK_PROFILE) | ||
642 | #define hook_vmevent(g) ((g)->hookmask |= (HOOK_ACTIVE|HOOK_VMEVENT)) | 643 | #define hook_vmevent(g) ((g)->hookmask |= (HOOK_ACTIVE|HOOK_VMEVENT)) |
643 | #define hook_leave(g) ((g)->hookmask &= ~HOOK_ACTIVE) | 644 | #define hook_leave(g) ((g)->hookmask &= ~HOOK_ACTIVE) |
644 | #define hook_save(g) ((g)->hookmask & ~HOOK_EVENTMASK) | 645 | #define hook_save(g) ((g)->hookmask & ~HOOK_EVENTMASK) |
diff --git a/src/lj_profile.c b/src/lj_profile.c index 3223697f..e2966e0c 100644 --- a/src/lj_profile.c +++ b/src/lj_profile.c | |||
@@ -153,7 +153,7 @@ static void profile_trigger(ProfileState *ps) | |||
153 | profile_lock(ps); | 153 | profile_lock(ps); |
154 | ps->samples++; /* Always increment number of samples. */ | 154 | ps->samples++; /* Always increment number of samples. */ |
155 | mask = g->hookmask; | 155 | mask = g->hookmask; |
156 | if (!(mask & (HOOK_PROFILE|HOOK_VMEVENT))) { /* Set profile hook. */ | 156 | if (!(mask & (HOOK_PROFILE|HOOK_VMEVENT|HOOK_GC))) { /* Set profile hook. */ |
157 | int st = g->vmstate; | 157 | int st = g->vmstate; |
158 | ps->vmstate = st >= 0 ? 'N' : | 158 | ps->vmstate = st >= 0 ? 'N' : |
159 | st == ~LJ_VMST_INTERP ? 'I' : | 159 | st == ~LJ_VMST_INTERP ? 'I' : |