summaryrefslogtreecommitdiff
path: root/erts/emulator/beam/erl_process.c
diff options
context:
space:
mode:
Diffstat (limited to 'erts/emulator/beam/erl_process.c')
-rw-r--r--erts/emulator/beam/erl_process.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c
index 77edf8cb23..016487f6c0 100644
--- a/erts/emulator/beam/erl_process.c
+++ b/erts/emulator/beam/erl_process.c
@@ -10057,9 +10057,12 @@ Process *erts_schedule(ErtsSchedulerData *esdp, Process *p, int calls)
static void
trace_schedule_in(Process *p, erts_aint32_t state)
{
+ ErtsThrPrgrDelayHandle dhndl;
ASSERT(IS_TRACED(p));
ERTS_LC_ASSERT(erts_proc_lc_my_proc_locks(p) == ERTS_PROC_LOCK_MAIN);
+ dhndl = erts_thr_progress_unmanaged_delay();
+
/* Clear tracer if it has been removed */
if (erts_is_tracer_proc_enabled(p, ERTS_PROC_LOCK_MAIN, &p->common)) {
@@ -10075,14 +10078,17 @@ trace_schedule_in(Process *p, erts_aint32_t state)
if (IS_TRACED_FL(p, F_TRACE_CALLS))
erts_schedule_time_break(p, ERTS_BP_CALL_TIME_SCHEDULE_IN);
}
-
+ erts_thr_progress_unmanaged_continue(dhndl);
}
static void
trace_schedule_out(Process *p, erts_aint32_t state)
{
+ ErtsThrPrgrDelayHandle dhndl;
ASSERT(IS_TRACED(p));
ERTS_LC_ASSERT(erts_proc_lc_my_proc_locks(p) == ERTS_PROC_LOCK_MAIN);
+
+ dhndl = erts_thr_progress_unmanaged_delay();
if (IS_TRACED_FL(p, F_TRACE_CALLS) && !(state & ERTS_PSFLG_FREE))
erts_schedule_time_break(p, ERTS_BP_CALL_TIME_SCHEDULE_OUT);
@@ -10096,6 +10102,7 @@ trace_schedule_out(Process *p, erts_aint32_t state)
ARE_TRACE_FLAGS_ON(p, F_TRACE_SCHED_PROCS))
trace_sched(p, ERTS_PROC_LOCK_MAIN, am_out);
}
+ erts_thr_progress_unmanaged_continue(dhndl);
}
static int