aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/erl_process.c
diff options
context:
space:
mode:
authorRickard Green <[email protected]>2016-03-31 16:06:10 +0200
committerRickard Green <[email protected]>2016-03-31 16:06:10 +0200
commitd97dc2c64be5530b22c8e4f9e11d246285ea8a17 (patch)
tree356bc457b4c9bae21db8f209eeff5cbb1e3daa0c /erts/emulator/beam/erl_process.c
parent07b8f441ca711f9812fad9e9115bab3c3aa92f79 (diff)
downloadotp-d97dc2c64be5530b22c8e4f9e11d246285ea8a17.tar.gz
otp-d97dc2c64be5530b22c8e4f9e11d246285ea8a17.tar.bz2
otp-d97dc2c64be5530b22c8e4f9e11d246285ea8a17.zip
Fix bad refc management of process struct
Diffstat (limited to 'erts/emulator/beam/erl_process.c')
-rw-r--r--erts/emulator/beam/erl_process.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c
index b4b97d7df1..2b468a9ad9 100644
--- a/erts/emulator/beam/erl_process.c
+++ b/erts/emulator/beam/erl_process.c
@@ -9293,17 +9293,18 @@ Process *schedule(Process *p, int calls)
| ERTS_PSFLG_PENDING_EXIT
| ERTS_PSFLG_ACTIVE_SYS))
== ERTS_PSFLG_SUSPENDED)) {
- if (state & ERTS_PSFLG_FREE) {
+ if (proxy_p) {
+ free_proxy_proc(proxy_p);
+ proxy_p = NULL;
+ }
+ else if (state & ERTS_PSFLG_FREE) {
+ /* free and not queued by proxy */
#ifdef ERTS_SMP
erts_smp_proc_dec_refc(p);
#else
erts_free_proc(p);
#endif
}
- if (proxy_p) {
- free_proxy_proc(proxy_p);
- proxy_p = NULL;
- }
goto pick_next_process;
}
state = new;