aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/erl_port_task.c
diff options
context:
space:
mode:
authorRickard Green <[email protected]>2012-09-14 21:42:11 +0200
committerRickard Green <[email protected]>2012-12-03 21:18:09 +0100
commit34fc6f243f8a462f4b2370a9fe5376df1ca08f1d (patch)
tree1a7377203f573c40269f12b59611a68e0859c627 /erts/emulator/beam/erl_port_task.c
parent620c8c5bfe4c2b306a7bc0a7d41749bddea4ee62 (diff)
downloadotp-34fc6f243f8a462f4b2370a9fe5376df1ca08f1d.tar.gz
otp-34fc6f243f8a462f4b2370a9fe5376df1ca08f1d.tar.bz2
otp-34fc6f243f8a462f4b2370a9fe5376df1ca08f1d.zip
Move busy port flag
Diffstat (limited to 'erts/emulator/beam/erl_port_task.c')
-rw-r--r--erts/emulator/beam/erl_port_task.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/erts/emulator/beam/erl_port_task.c b/erts/emulator/beam/erl_port_task.c
index edcd3112da..dceecda973 100644
--- a/erts/emulator/beam/erl_port_task.c
+++ b/erts/emulator/beam/erl_port_task.c
@@ -530,6 +530,7 @@ fail:
void
erts_port_task_free_port(Port *pp)
{
+ ErtsProcList *suspended;
erts_aint32_t flags;
ErtsRunQueue *runq;
@@ -542,6 +543,8 @@ erts_port_task_free_port(Port *pp)
erts_port_task_sched_lock(&pp->sched);
flags = erts_smp_atomic32_read_bor_relb(&pp->sched.flags,
ERTS_PTS_FLG_EXIT);
+ suspended = pp->suspended;
+ pp->suspended = NULL;
erts_port_task_sched_unlock(&pp->sched);
erts_atomic32_read_bset_relb(&pp->state,
(ERTS_PORT_SFLG_CLOSING
@@ -550,6 +553,9 @@ erts_port_task_free_port(Port *pp)
erts_smp_runq_unlock(runq);
+ if (erts_proclist_fetch(&suspended, NULL))
+ erts_resume_processes(suspended);
+
if (!(flags & (ERTS_PTS_FLG_IN_RUNQ|ERTS_PTS_FLG_EXEC)))
begin_port_cleanup(pp, NULL);
}