diff options
author | Raimo Niskanen <[email protected]> | 2012-03-22 14:29:55 +0100 |
---|---|---|
committer | Raimo Niskanen <[email protected]> | 2012-03-22 15:41:18 +0100 |
commit | f67487b67bfb9ab04b01ef87bbfc39a24f604f11 (patch) | |
tree | 3029c7a42a621670cdf4834a3712bca2f9376b9d /erts/emulator/beam/io.c | |
parent | 5d7ed57d07118f95cf970ee655ea8eea76cbe6fd (diff) | |
parent | 1e13b92d5c6543c82219610aa1336dbdf1f4dc2d (diff) | |
download | otp-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.c | 7 |
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); |