aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2019-02-14 18:07:15 +0100
committerSverker Eriksson <[email protected]>2019-02-14 18:07:15 +0100
commit750e9be58c7c245d49d6a7227b972bf0fd8c09ab (patch)
treec3f6c26669a21a4f23c42fdd5f494028d6c9c8cc /erts/emulator
parent0d6eeb82210b5ad848af972c3b2f687a52edd156 (diff)
downloadotp-750e9be58c7c245d49d6a7227b972bf0fd8c09ab.tar.gz
otp-750e9be58c7c245d49d6a7227b972bf0fd8c09ab.tar.bz2
otp-750e9be58c7c245d49d6a7227b972bf0fd8c09ab.zip
erts: Avoid heart killing a nicely exiting emulator
Symptom: Heart kills exiting emulator before is has flushed all ports and with HEART_KILL_SIGNAL=SIGABRT it may also produce unnecessary core dumps from doing init:reboot() for example. Problem: Heart port is closed together with all the others in handle_reap_ports() which is detected by heart OS process. Solution 1: Leave the heart port alone in handle_reap_ports() and let it be closed by OS when emulator exists. It doesn't need to be flushed anyway. Solution 2: When heart OS process gets EOF on connection let it wait max 5 seconds for emulator process to self terminate before trying to kill it.
Diffstat (limited to 'erts/emulator')
-rw-r--r--erts/emulator/beam/erl_process.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c
index ffbfbc4e56..a4f312f101 100644
--- a/erts/emulator/beam/erl_process.c
+++ b/erts/emulator/beam/erl_process.c
@@ -2625,6 +2625,13 @@ handle_reap_ports(ErtsAuxWorkData *awdp, erts_aint32_t aux_work, int waiting)
erts_smp_port_lock(prt);
+ if (prt->common.u.alive.reg &&
+ prt->common.u.alive.reg->name == am_heart_port) {
+ /* Leave heart port to not get killed before flushing is done*/
+ erts_port_release(prt);
+ continue;
+ }
+
state = erts_atomic32_read_nob(&prt->state);
if (!(state & (ERTS_PORT_SFLGS_INVALID_DRIVER_LOOKUP
| ERTS_PORT_SFLG_HALT))) {