diff options
author | John Högberg <[email protected]> | 2019-08-12 09:59:01 +0200 |
---|---|---|
committer | John Högberg <[email protected]> | 2019-08-12 10:04:27 +0200 |
commit | f93b97cc5c6bee800f4b671cc4bb7ee6250c9c94 (patch) | |
tree | c3ac0b44b08972f2bba8c50342a1ceae8b566703 | |
parent | 3825199794da28d79b21052a2e69e2335921d55e (diff) | |
download | otp-f93b97cc5c6bee800f4b671cc4bb7ee6250c9c94.tar.gz otp-f93b97cc5c6bee800f4b671cc4bb7ee6250c9c94.tar.bz2 otp-f93b97cc5c6bee800f4b671cc4bb7ee6250c9c94.zip |
erts: Scan heap fragments for off-heap binaries
-rw-r--r-- | erts/emulator/beam/erl_bif_info.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/erts/emulator/beam/erl_bif_info.c b/erts/emulator/beam/erl_bif_info.c index 7fada0d548..e9f170870c 100644 --- a/erts/emulator/beam/erl_bif_info.c +++ b/erts/emulator/beam/erl_bif_info.c @@ -162,10 +162,10 @@ static Eterm current_stacktrace(ErtsHeapFactory *hfact, Process* rp, Uint reserve_size); static Eterm -bld_bin_list(Uint **hpp, Uint *szp, ErlOffHeap* oh) +bld_bin_list(Uint **hpp, Uint *szp, ErlOffHeap* oh, Eterm tail) { struct erl_off_heap_header* ohh; - Eterm res = NIL; + Eterm res = tail; Eterm tuple; for (ohh = oh->first; ohh; ohh = ohh->next) { @@ -1857,11 +1857,25 @@ process_info_aux(Process *c_p, break; case ERTS_PI_IX_BINARY: { - Uint sz = 0; - (void) bld_bin_list(NULL, &sz, &MSO(rp)); + ErlHeapFragment *hfrag; + Uint sz; + + res = NIL; + sz = 0; + + (void)bld_bin_list(NULL, &sz, &MSO(rp), NIL); + for (hfrag = rp->mbuf; hfrag != NULL; hfrag = hfrag->next) { + (void)bld_bin_list(NULL, &sz, &hfrag->off_heap, NIL); + } + hp = erts_produce_heap(hfact, sz, reserve_size); - res = bld_bin_list(&hp, NULL, &MSO(rp)); - break; + + res = bld_bin_list(&hp, NULL, &MSO(rp), NIL); + for (hfrag = rp->mbuf; hfrag != NULL; hfrag = hfrag->next) { + res = bld_bin_list(&hp, NULL, &hfrag->off_heap, res); + } + + break; } case ERTS_PI_IX_SEQUENTIAL_TRACE_TOKEN: { |