diff options
author | Rickard Green <rickard@erlang.org> | 2020-02-11 17:05:34 +0100 |
---|---|---|
committer | Rickard Green <rickard@erlang.org> | 2020-02-11 18:25:52 +0100 |
commit | 765ad4aabb66d53254af0d41abb5d00563d916ce (patch) | |
tree | 250db2641ca4d70c52994ab16906b2f82b67ba57 | |
parent | 02eb36c4a46815d3d9128fec9f57e823de54f1ed (diff) | |
download | erlang-765ad4aabb66d53254af0d41abb5d00563d916ce.tar.gz |
Fix erroneous mapping of kill exit reason to killed
-rw-r--r-- | erts/emulator/beam/bif.c | 4 | ||||
-rw-r--r-- | erts/emulator/beam/dist.c | 2 | ||||
-rw-r--r-- | erts/emulator/beam/erl_process.c | 5 | ||||
-rw-r--r-- | erts/emulator/beam/erl_process.h | 1 |
4 files changed, 9 insertions, 3 deletions
diff --git a/erts/emulator/beam/bif.c b/erts/emulator/beam/bif.c index d7a25adccb..2e3d3c97de 100644 --- a/erts/emulator/beam/bif.c +++ b/erts/emulator/beam/bif.c @@ -1631,11 +1631,13 @@ BIF_RETTYPE exit_2(BIF_ALIST_2) * The pid is internal. Verify that it refers to an existing process. */ ErtsProcLocks rp_locks; + Uint32 flags = ERTS_XSIG_FLG_EXIT2; if (BIF_ARG_1 == BIF_P->common.id) { rp_locks = ERTS_PROC_LOCKS_ALL; rp = BIF_P; erts_smp_proc_lock(rp, ERTS_PROC_LOCKS_ALL_MINOR); + flags |= ERTS_XSIG_FLG_NO_IGN_NORMAL; } else { rp_locks = ERTS_PROC_LOCKS_XSIG_SEND; @@ -1656,7 +1658,7 @@ BIF_RETTYPE exit_2(BIF_ALIST_2) BIF_ARG_2, NIL, NULL, - BIF_P == rp ? ERTS_XSIG_FLG_NO_IGN_NORMAL : 0); + flags); #ifdef ERTS_SMP if (rp == BIF_P) rp_locks &= ~ERTS_PROC_LOCK_MAIN; diff --git a/erts/emulator/beam/dist.c b/erts/emulator/beam/dist.c index 9fddac8980..de837d8a40 100644 --- a/erts/emulator/beam/dist.c +++ b/erts/emulator/beam/dist.c @@ -1680,7 +1680,7 @@ int erts_net_message(Port *prt, reason, token, NULL, - 0); + ERTS_XSIG_FLG_EXIT2); erts_smp_proc_unlock(rp, rp_locks); } break; diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c index 9f6adb03d0..566becebe5 100644 --- a/erts/emulator/beam/erl_process.c +++ b/erts/emulator/beam/erl_process.c @@ -13298,7 +13298,10 @@ send_exit_signal(Process *c_p, /* current process if and only ) { erts_aint32_t state = erts_smp_atomic32_read_nob(&rp->state); - Eterm rsn = reason == am_kill ? am_killed : reason; + Eterm rsn = reason; + + if ((flags & ERTS_XSIG_FLG_EXIT2) && reason == am_kill) + rsn = am_killed; ERTS_SMP_LC_ASSERT(*rp_locks == erts_proc_lc_my_proc_locks(rp)); ERTS_SMP_LC_ASSERT((*rp_locks & ERTS_PROC_LOCKS_XSIG_SEND) diff --git a/erts/emulator/beam/erl_process.h b/erts/emulator/beam/erl_process.h index 5cac939771..3895946918 100644 --- a/erts/emulator/beam/erl_process.h +++ b/erts/emulator/beam/erl_process.h @@ -1530,6 +1530,7 @@ extern int erts_system_profile_ts_type; /* Option flags to erts_send_exit_signal() */ #define ERTS_XSIG_FLG_IGN_KILL (((Uint32) 1) << 0) #define ERTS_XSIG_FLG_NO_IGN_NORMAL (((Uint32) 1) << 1) +#define ERTS_XSIG_FLG_EXIT2 (((Uint32) 1) << 2) #define CANCEL_TIMER(P) \ do { \ |