diff options
author | Rickard Green <[email protected]> | 2010-06-01 13:52:51 +0000 |
---|---|---|
committer | Erlang/OTP <[email protected]> | 2010-06-01 13:52:51 +0000 |
commit | e9ffa6bab3583a4ddabe4f41218579503c8d4b95 (patch) | |
tree | 290b913bc6960c3aebdb9c2e865ca84ea1ca483c /erts/emulator/beam/erl_port_task.c | |
parent | c68f1802ce375c3425795671c74c6b3fd9c3a8ef (diff) | |
download | otp-e9ffa6bab3583a4ddabe4f41218579503c8d4b95.tar.gz otp-e9ffa6bab3583a4ddabe4f41218579503c8d4b95.tar.bz2 otp-e9ffa6bab3583a4ddabe4f41218579503c8d4b95.zip |
OTP-8612 Fix potential premature destruction of port locks
Port locks could be prematurely destroyed.
Diffstat (limited to 'erts/emulator/beam/erl_port_task.c')
-rw-r--r-- | erts/emulator/beam/erl_port_task.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/erts/emulator/beam/erl_port_task.c b/erts/emulator/beam/erl_port_task.c index 0b6bb0d8e9..967a14f0d1 100644 --- a/erts/emulator/beam/erl_port_task.c +++ b/erts/emulator/beam/erl_port_task.c @@ -969,11 +969,11 @@ erts_port_task_execute(ErtsRunQueue *runq, Port **curr_port_pp) erts_port_release(pp); #else { - long refc = erts_smp_atomic_dectest(&pp->refc); + long refc; + erts_smp_mtx_unlock(pp->lock); + refc = erts_smp_atomic_dectest(&pp->refc); ASSERT(refc >= 0); - if (refc > 0) - erts_smp_mtx_unlock(pp->lock); - else { + if (refc == 0) { erts_smp_runq_unlock(runq); erts_port_cleanup(pp); /* Might aquire runq lock */ erts_smp_runq_lock(runq); |