aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/io.c
diff options
context:
space:
mode:
authorRaimo Niskanen <[email protected]>2012-03-22 14:29:55 +0100
committerRaimo Niskanen <[email protected]>2012-03-22 15:41:18 +0100
commitf67487b67bfb9ab04b01ef87bbfc39a24f604f11 (patch)
tree3029c7a42a621670cdf4834a3712bca2f9376b9d /erts/emulator/beam/io.c
parent5d7ed57d07118f95cf970ee655ea8eea76cbe6fd (diff)
parent1e13b92d5c6543c82219610aa1336dbdf1f4dc2d (diff)
downloadotp-f67487b67bfb9ab04b01ef87bbfc39a24f604f11.tar.gz
otp-f67487b67bfb9ab04b01ef87bbfc39a24f604f11.tar.bz2
otp-f67487b67bfb9ab04b01ef87bbfc39a24f604f11.zip
Merge branch 'maint'
Conflicts: erts/doc/src/erlang.xml erts/emulator/beam/erl_process.c erts/emulator/beam/erl_process.h erts/emulator/test/bif_SUITE.erl erts/preloaded/ebin/erlang.beam erts/preloaded/src/erlang.erl lib/hipe/cerl/erl_bif_types.erl
Diffstat (limited to 'erts/emulator/beam/io.c')
-rw-r--r--erts/emulator/beam/io.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/erts/emulator/beam/io.c b/erts/emulator/beam/io.c
index 603a6c47aa..7604365ab6 100644
--- a/erts/emulator/beam/io.c
+++ b/erts/emulator/beam/io.c
@@ -1838,6 +1838,7 @@ terminate_port(Port *prt)
Eterm send_closed_port_id;
Eterm connected_id = NIL /* Initialize to silence compiler */;
erts_driver_t *drv;
+ int halt;
ERTS_SMP_CHK_NO_PROC_LOCKS;
ERTS_SMP_LC_ASSERT(erts_lc_is_port_locked(prt));
@@ -1845,6 +1846,8 @@ terminate_port(Port *prt)
ASSERT(!prt->nlinks);
ASSERT(!prt->monitors);
+ /* prt->status may be altered by kill_port()below */
+ halt = (prt->status & ERTS_PORT_SFLG_HALT) != 0;
if (prt->status & ERTS_PORT_SFLG_SEND_CLOSED) {
erts_port_status_band_set(prt, ~ERTS_PORT_SFLG_SEND_CLOSED);
send_closed_port_id = prt->id;
@@ -1896,6 +1899,10 @@ terminate_port(Port *prt)
* We don't want to send the closed message until after the
* port has been removed from the port table (in kill_port()).
*/
+ if (halt && (erts_smp_atomic32_dec_read_nob(&erts_halt_progress) == 0)) {
+ erts_smp_port_unlock(prt); /* We will exit and never return */
+ erl_exit_flush_async(erts_halt_code, "");
+ }
if (is_internal_port(send_closed_port_id))
deliver_result(send_closed_port_id, connected_id, am_closed);