summaryrefslogtreecommitdiff
path: root/erts/emulator/beam/erl_node_tables.c
diff options
context:
space:
mode:
authorRickard Green <rickard@erlang.org>2022-03-21 11:29:16 +0100
committerRickard Green <rickard@erlang.org>2022-03-21 11:29:16 +0100
commitda9825efe480fbf1181bc2fc874accf414b43cf6 (patch)
treeff6aeea3aea7900a79dbf18763237b4ba2077c8f /erts/emulator/beam/erl_node_tables.c
parent9157d92bcb3f1045814a79beec9fc278910f79d4 (diff)
parent5539a2d4ff73dffbdc0937141646cd2a9990487b (diff)
downloaderlang-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.c31
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;