aboutsummaryrefslogtreecommitdiff
path: root/src/lj_trace.c
diff options
context:
space:
mode:
authorMike Pall <mike>2026-05-25 01:23:26 +0200
committerMike Pall <mike>2026-05-25 01:23:26 +0200
commit75abb0d934fef3e3d5aab46e60e34059ac8a1c08 (patch)
tree136333fa8c3628e7e99e3b58d23efd0263bd9b99 /src/lj_trace.c
parent64b1f10835acc18bf8923adf248dce4894867882 (diff)
downloadluajit-75abb0d934fef3e3d5aab46e60e34059ac8a1c08.tar.gz
luajit-75abb0d934fef3e3d5aab46e60e34059ac8a1c08.tar.bz2
luajit-75abb0d934fef3e3d5aab46e60e34059ac8a1c08.zip
Avoid race condition with profiler thread during dispatch table update.
Reported by artemking4. #1460
Diffstat (limited to 'src/lj_trace.c')
-rw-r--r--src/lj_trace.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/lj_trace.c b/src/lj_trace.c
index e55045f4e..24a1f7e45 100644
--- a/src/lj_trace.c
+++ b/src/lj_trace.c
@@ -656,7 +656,7 @@ static int trace_abort(jit_State *J)
656 } else if (e == LJ_TRERR_MCODEAL) { 656 } else if (e == LJ_TRERR_MCODEAL) {
657 if (!J->mcarea) { /* Disable JIT compiler if first mcode alloc fails. */ 657 if (!J->mcarea) { /* Disable JIT compiler if first mcode alloc fails. */
658 J->flags &= ~JIT_F_ON; 658 J->flags &= ~JIT_F_ON;
659 lj_dispatch_update(J2G(J)); 659 lj_dispatch_update(J2G(J), 0);
660 } 660 }
661 lj_trace_flushall(L); 661 lj_trace_flushall(L);
662 } 662 }
@@ -687,7 +687,7 @@ static TValue *trace_state(lua_State *L, lua_CFunction dummy, void *ud)
687 case LJ_TRACE_START: 687 case LJ_TRACE_START:
688 J->state = LJ_TRACE_RECORD; /* trace_start() may change state. */ 688 J->state = LJ_TRACE_RECORD; /* trace_start() may change state. */
689 trace_start(J); 689 trace_start(J);
690 lj_dispatch_update(J2G(J)); 690 lj_dispatch_update(J2G(J), 0);
691 if (J->state != LJ_TRACE_RECORD_1ST) 691 if (J->state != LJ_TRACE_RECORD_1ST)
692 break; 692 break;
693 /* fallthrough */ 693 /* fallthrough */
@@ -745,7 +745,7 @@ static TValue *trace_state(lua_State *L, lua_CFunction dummy, void *ud)
745 trace_stop(J); 745 trace_stop(J);
746 setvmstate(J2G(J), INTERP); 746 setvmstate(J2G(J), INTERP);
747 J->state = LJ_TRACE_IDLE; 747 J->state = LJ_TRACE_IDLE;
748 lj_dispatch_update(J2G(J)); 748 lj_dispatch_update(J2G(J), 0);
749 return NULL; 749 return NULL;
750 750
751 default: /* Trace aborted asynchronously. */ 751 default: /* Trace aborted asynchronously. */
@@ -757,7 +757,7 @@ static TValue *trace_state(lua_State *L, lua_CFunction dummy, void *ud)
757 goto retry; 757 goto retry;
758 setvmstate(J2G(J), INTERP); 758 setvmstate(J2G(J), INTERP);
759 J->state = LJ_TRACE_IDLE; 759 J->state = LJ_TRACE_IDLE;
760 lj_dispatch_update(J2G(J)); 760 lj_dispatch_update(J2G(J), 0);
761 return NULL; 761 return NULL;
762 } 762 }
763 } while (J->state > LJ_TRACE_RECORD); 763 } while (J->state > LJ_TRACE_RECORD);