aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/erl_gc.c
diff options
context:
space:
mode:
authorRickard Green <[email protected]>2016-09-14 12:58:27 +0200
committerRickard Green <[email protected]>2016-09-14 13:02:21 +0200
commit57513239dc265373521bc4f04c154f17d5f0bae9 (patch)
tree0efa41c46aa59f90f6111b3a804baab461a7e94a /erts/emulator/beam/erl_gc.c
parent226a754d1f4babb262b2a15569b174921f97ad86 (diff)
downloadotp-57513239dc265373521bc4f04c154f17d5f0bae9.tar.gz
otp-57513239dc265373521bc4f04c154f17d5f0bae9.tar.bz2
otp-57513239dc265373521bc4f04c154f17d5f0bae9.zip
Update vheap size when moving msgq to heap after GC
Diffstat (limited to 'erts/emulator/beam/erl_gc.c')
-rw-r--r--erts/emulator/beam/erl_gc.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/erts/emulator/beam/erl_gc.c b/erts/emulator/beam/erl_gc.c
index 9e0919cc9c..e2875cedb3 100644
--- a/erts/emulator/beam/erl_gc.c
+++ b/erts/emulator/beam/erl_gc.c
@@ -150,6 +150,7 @@ static void move_msgq_to_heap(Process *p);
static int reached_max_heap_size(Process *p, Uint total_heap_size,
Uint extra_heap_size, Uint extra_old_heap_size);
static void init_gc_info(ErtsGCInfo *gcip);
+static Uint64 next_vheap_size(Process* p, Uint64 vheap, Uint64 vheap_sz);
#ifdef HARDDEBUG
static void disallow_heap_frag_ref_in_heap(Process* p);
@@ -748,6 +749,9 @@ do_major_collection:
p->last_old_htop = p->old_htop;
#endif
+ ASSERT(!p->mbuf);
+ ASSERT(!ERTS_IS_GC_DESIRED(p));
+
return reds;
}
@@ -2250,7 +2254,9 @@ copy_one_frag(Eterm** hpp, ErlOffHeap* off_heap,
static void
move_msgq_to_heap(Process *p)
{
+
ErtsMessage **mpp = &p->msg.first;
+ Uint64 pre_oh = MSO(p).overhead;
while (*mpp) {
ErtsMessage *mp = *mpp;
@@ -2293,6 +2299,11 @@ move_msgq_to_heap(Process *p)
mpp = &(*mpp)->next;
}
+
+ if (pre_oh != MSO(p).overhead) {
+ /* Got new binaries; update vheap size... */
+ BIN_VHEAP_SZ(p) = next_vheap_size(p, MSO(p).overhead, BIN_VHEAP_SZ(p));
+ }
}
static Uint