summaryrefslogtreecommitdiff
path: root/erts
diff options
context:
space:
mode:
authorSverker Eriksson <sverker@erlang.org>2019-09-06 20:16:56 +0200
committerSverker Eriksson <sverker@erlang.org>2019-09-06 20:16:56 +0200
commita02bc2774c0e9b984cb46e49efe039faa6965c13 (patch)
tree3c43185ddb216a5776e7552a020c7b8b9651c6e0 /erts
parent65f393250df79b21fb0266eaab7c5bacb41311fb (diff)
parentbae7f99ac25fa39cf793325be7a1c6da55d0375e (diff)
downloaderlang-a02bc2774c0e9b984cb46e49efe039faa6965c13.tar.gz
Merge branch 'sverker/proc-exit-dist-trap' into maint
* sverker/proc-exit-dist-trap: erts: Fix bugs for exiting process and ERTS_DSIG_SEND_YIELD
Diffstat (limited to 'erts')
-rw-r--r--erts/emulator/beam/erl_process.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c
index 1c1ef1db84..a564a1d7c5 100644
--- a/erts/emulator/beam/erl_process.c
+++ b/erts/emulator/beam/erl_process.c
@@ -12072,6 +12072,7 @@ erts_proc_exit_handle_dist_monitor(ErtsMonitor *mon, void *vctxt, Sint reds)
ASSERT(c_p->flags & F_DISABLE_GC);
ASSERT(erts_monitor_is_target(mon) && mon->type == ERTS_MON_TYPE_DIST_PROC);
+ ASSERT(ctxt->dist_state == NIL);
mdp = erts_monitor_to_data(mon);
@@ -12116,8 +12117,10 @@ erts_proc_exit_handle_dist_monitor(ErtsMonitor *mon, void *vctxt, Sint reds)
reason);
reds_consumed = reds - (ctx.reds / TERM_TO_BINARY_LOOP_FACTOR);
switch (code) {
- case ERTS_DSIG_SEND_CONTINUE:
case ERTS_DSIG_SEND_YIELD:
+ reds_consumed = reds; /* force yield */
+ break;
+ case ERTS_DSIG_SEND_CONTINUE:
ctxt->dist_state = erts_dsend_export_trap_context(c_p, &ctx);
reds_consumed = reds; /* force yield */
break;
@@ -12330,6 +12333,8 @@ erts_proc_exit_handle_dist_link(ErtsLink *lnk, void *vctxt, Sint reds)
ASSERT(c_p->flags & F_DISABLE_GC);
ASSERT(lnk->type == ERTS_LNK_TYPE_DIST_PROC);
+ ASSERT(ctxt->dist_state == NIL);
+
dlnk = erts_link_to_other(lnk, &ldp);
dist = ((ErtsLinkDataExtended *) ldp)->dist;
@@ -12367,6 +12372,8 @@ erts_proc_exit_handle_dist_link(ErtsLink *lnk, void *vctxt, Sint reds)
reds_consumed = reds - (ctx.reds / TERM_TO_BINARY_LOOP_FACTOR);
switch (code) {
case ERTS_DSIG_SEND_YIELD:
+ reds_consumed = reds; /* force yield */
+ break;
case ERTS_DSIG_SEND_CONTINUE:
ctxt->dist_state = erts_dsend_export_trap_context(c_p, &ctx);
reds_consumed = reds; /* force yield */
@@ -12875,6 +12882,8 @@ restart:
erts_kill_dist_connection(ctx->dep, ctx->connection_id);
break;
case ERTS_DSIG_SEND_YIELD: /*SEND_YIELD_RETURN*/
+ trap_state->pectxt.dist_state = NIL;
+ goto yield;
case ERTS_DSIG_SEND_CONTINUE: { /*SEND_YIELD_CONTINUE*/
goto yield;
}