aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/erl_process.c
diff options
context:
space:
mode:
authorLukas Larsson <[email protected]>2019-04-18 14:24:31 +0200
committerLukas Larsson <[email protected]>2019-04-18 14:24:31 +0200
commit659ed4c005bb8c943c217d52383c219c0998aafa (patch)
tree1a92dbdc38bd517027c1f3e08edfea9afdcdd423 /erts/emulator/beam/erl_process.c
parentd0482d868f4662ebebeb115878ea1f99da69f062 (diff)
parentbc39fa234dd2d2834985dcdd37159cbc9e4d8a51 (diff)
downloadotp-659ed4c005bb8c943c217d52383c219c0998aafa.tar.gz
otp-659ed4c005bb8c943c217d52383c219c0998aafa.tar.bz2
otp-659ed4c005bb8c943c217d52383c219c0998aafa.zip
Merge branch 'lukas/OTP-22-rc2/misc-fixes/OTP-15773'
* lukas/OTP-22-rc2/misc-fixes/OTP-15773: erts: Yield correctly when iterating over distr exit messages erts: Fix cerl -rr to use correct etp file erts: Fix etp-process-info to print exiting and free processes tools: Adjust instrument abort tc to better trigger faults erts: Fix cleanup of message factory undo erts: Make dump_SUITE:free_dump not dump via rpc erts: Add extra debugging to dist frag testcases erts: Run smaller dist frag test to 32 bit machines erl_docgen: Remove accidentally merged debug printout erts: Fix z_SUITE to always look for cerl in ERL_TOP otp: make top Makefile app target respect TYPE variable vxworks: Make vxworks configure use environment CFLAGS erts: Make erts_free debug failure easier to diagnose erts: Fix gcc warning in to_erl
Diffstat (limited to 'erts/emulator/beam/erl_process.c')
-rw-r--r--erts/emulator/beam/erl_process.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c
index 2b45d2d353..76eec96372 100644
--- a/erts/emulator/beam/erl_process.c
+++ b/erts/emulator/beam/erl_process.c
@@ -12095,6 +12095,7 @@ erts_proc_exit_handle_dist_monitor(ErtsMonitor *mon, void *vctxt, Sint reds)
Eterm watched;
Uint watcher_sz, ref_sz;
ErtsHeapFactory factory;
+ Sint reds_consumed = 0;
ASSERT(erts_monitor_is_target(mon) && mon->type == ERTS_MON_TYPE_DIST_PROC);
@@ -12139,11 +12140,13 @@ erts_proc_exit_handle_dist_monitor(ErtsMonitor *mon, void *vctxt, Sint reds)
watched,
ref,
reason);
+ reds_consumed = reds - (ctx.reds / TERM_TO_BINARY_LOOP_FACTOR);
switch (code) {
case ERTS_DSIG_SEND_CONTINUE:
case ERTS_DSIG_SEND_YIELD:
erts_set_gc_state(c_p, 0);
ctxt->dist_state = erts_dsend_export_trap_context(c_p, &ctx);
+ reds_consumed = reds; /* force yield */
break;
case ERTS_DSIG_SEND_OK:
break;
@@ -12163,7 +12166,7 @@ erts_proc_exit_handle_dist_monitor(ErtsMonitor *mon, void *vctxt, Sint reds)
erts_monitor_release(mon);
else
erts_monitor_release_both(mdp);
- return reds - (ctx.reds / TERM_TO_BINARY_LOOP_FACTOR);
+ return reds_consumed;
}
int
@@ -12350,6 +12353,7 @@ erts_proc_exit_handle_dist_link(ErtsLink *lnk, void *vctxt, Sint reds)
ErtsLink *dlnk;
ErtsLinkData *ldp = NULL;
ErtsHeapFactory factory;
+ Sint reds_consumed = 0;
ASSERT(lnk->type == ERTS_LNK_TYPE_DIST_PROC);
dlnk = erts_link_to_other(lnk, &ldp);
@@ -12386,11 +12390,13 @@ erts_proc_exit_handle_dist_link(ErtsLink *lnk, void *vctxt, Sint reds)
item,
reason,
SEQ_TRACE_TOKEN(c_p));
+ reds_consumed = reds - (ctx.reds / TERM_TO_BINARY_LOOP_FACTOR);
switch (code) {
case ERTS_DSIG_SEND_YIELD:
case ERTS_DSIG_SEND_CONTINUE:
erts_set_gc_state(c_p, 0);
ctxt->dist_state = erts_dsend_export_trap_context(c_p, &ctx);
+ reds_consumed = reds; /* force yield */
break;
case ERTS_DSIG_SEND_OK:
break;
@@ -12410,7 +12416,7 @@ erts_proc_exit_handle_dist_link(ErtsLink *lnk, void *vctxt, Sint reds)
erts_link_release_both(ldp);
else if (lnk)
erts_link_release(lnk);
- return reds - (ctx.reds / TERM_TO_BINARY_LOOP_FACTOR);
+ return reds_consumed;
}
int