summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRickard Green <rickard@erlang.org>2020-02-11 17:05:34 +0100
committerRickard Green <rickard@erlang.org>2020-02-11 18:25:52 +0100
commit765ad4aabb66d53254af0d41abb5d00563d916ce (patch)
tree250db2641ca4d70c52994ab16906b2f82b67ba57
parent02eb36c4a46815d3d9128fec9f57e823de54f1ed (diff)
downloaderlang-765ad4aabb66d53254af0d41abb5d00563d916ce.tar.gz
Fix erroneous mapping of kill exit reason to killed
-rw-r--r--erts/emulator/beam/bif.c4
-rw-r--r--erts/emulator/beam/dist.c2
-rw-r--r--erts/emulator/beam/erl_process.c5
-rw-r--r--erts/emulator/beam/erl_process.h1
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 { \