diff options
author | Sverker Eriksson <sverker@erlang.org> | 2019-03-28 19:32:52 +0100 |
---|---|---|
committer | Sverker Eriksson <sverker@erlang.org> | 2019-03-28 22:17:42 +0100 |
commit | 2c8e6848d3b1d13529e83d8cf76e0a2a458fea52 (patch) | |
tree | 62ff19f3d7b6203d5e03d3844b51448930cc4249 /erts/emulator/beam/beam_emu.c | |
parent | bff3ef4e41c7637b0a9c1ca5a42a1c28efe242f5 (diff) | |
download | erlang-2c8e6848d3b1d13529e83d8cf76e0a2a458fea52.tar.gz |
erts: Fix bug in process_info(reductions)
returning incorrect result as
* current process might not be RUNNING in which case REDS_IN
is actually used as def_arg_reg[5]
* FCALLS might not have been swapped out
* the SAVED_CALLS case was wrong and returned number of reds left
Diffstat (limited to 'erts/emulator/beam/beam_emu.c')
-rw-r--r-- | erts/emulator/beam/beam_emu.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/erts/emulator/beam/beam_emu.c b/erts/emulator/beam/beam_emu.c index e909a0b4da..ce986fdd7a 100644 --- a/erts/emulator/beam/beam_emu.c +++ b/erts/emulator/beam/beam_emu.c @@ -3231,20 +3231,23 @@ erts_is_builtin(Eterm Mod, Eterm Name, int arity) /* - * Return the current number of reductions for the given process. + * Return the current number of reductions consumed by the given process. * To get the total number of reductions, p->reds must be added. */ Uint -erts_current_reductions(Process *current, Process *p) +erts_current_reductions(Process *c_p, Process *p) { - if (current != p) { + Sint reds_left; + if (c_p != p || !(erts_atomic32_read_nob(&c_p->state) + & ERTS_PSFLG_RUNNING)) { return 0; - } else if (current->fcalls < 0 && ERTS_PROC_GET_SAVED_CALLS_BUF(current)) { - return current->fcalls + CONTEXT_REDS; + } else if (c_p->fcalls < 0 && ERTS_PROC_GET_SAVED_CALLS_BUF(c_p)) { + reds_left = c_p->fcalls + CONTEXT_REDS; } else { - return REDS_IN(current) - current->fcalls; + reds_left = c_p->fcalls; } + return REDS_IN(c_p) - reds_left; } int |