diff options
author | Rickard Green <rickard@erlang.org> | 2022-03-21 11:29:16 +0100 |
---|---|---|
committer | Rickard Green <rickard@erlang.org> | 2022-03-21 11:29:16 +0100 |
commit | da9825efe480fbf1181bc2fc874accf414b43cf6 (patch) | |
tree | ff6aeea3aea7900a79dbf18763237b4ba2077c8f /erts/emulator/beam/erl_node_tables.c | |
parent | 9157d92bcb3f1045814a79beec9fc278910f79d4 (diff) | |
parent | 5539a2d4ff73dffbdc0937141646cd2a9990487b (diff) | |
download | erlang-da9825efe480fbf1181bc2fc874accf414b43cf6.tar.gz |
Merge branch 'rickard/node_dist_refc_check_fix'
* rickard/node_dist_refc_check_fix:
Fix node and dist entry refc tests
Diffstat (limited to 'erts/emulator/beam/erl_node_tables.c')
-rw-r--r-- | erts/emulator/beam/erl_node_tables.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/erts/emulator/beam/erl_node_tables.c b/erts/emulator/beam/erl_node_tables.c index 912caf5ace..60f9567431 100644 --- a/erts/emulator/beam/erl_node_tables.c +++ b/erts/emulator/beam/erl_node_tables.c @@ -1567,6 +1567,20 @@ insert_offheap(ErlOffHeap *oh, int type, Eterm id) } } +static ERTS_INLINE ErlHeapFragment * +get_hidden_heap_frag(Eterm val) +{ + ErlHeapFragment *hfp; + if (is_immed(val)) + hfp = NULL; + else { + ASSERT(is_CP(val)); + hfp = (ErlHeapFragment *) cp_val(val); + ASSERT(hfp->alloc_size == hfp->used_size + 1); + } + return hfp; +} + static void insert_monitor_data(ErtsMonitor *mon, int type, Eterm id) { ErtsMonitorData *mdp = erts_monitor_to_data(mon); @@ -1581,6 +1595,23 @@ static void insert_monitor_data(ErtsMonitor *mon, int type, Eterm id) oh.first = mdep->uptr.ohhp; insert_offheap(&oh, type, id); } + if (mdp->origin.flags & ERTS_ML_FLG_TAG) { + ErlHeapFragment *hfp; + Eterm tag_storage; + if (mdp->origin.flags & ERTS_ML_FLG_EXTENDED) + tag_storage = ((ErtsMonitorDataExtended *) mdp)->heap[0]; + else + tag_storage = ((ErtsMonitorDataTagHeap *) mdp)->heap[0]; + hfp = get_hidden_heap_frag(tag_storage); + if (hfp) + insert_offheap(&hfp->off_heap, type, id); + } + if (mdp->origin.flags & ERTS_ML_FLG_SPAWN_PENDING) { + ErtsMonitorDataExtended *mdep = (ErtsMonitorDataExtended *) mdp; + ErlHeapFragment *hfp = get_hidden_heap_frag(mdep->u.name); + if (hfp) + insert_offheap(&hfp->off_heap, type, id); + } } } mdp->origin.flags |= ERTS_ML_FLG_DBG_VISITED; |