diff options
author | Rickard Green <[email protected]> | 2016-09-14 12:58:27 +0200 |
---|---|---|
committer | Rickard Green <[email protected]> | 2016-09-14 13:02:21 +0200 |
commit | 57513239dc265373521bc4f04c154f17d5f0bae9 (patch) | |
tree | 0efa41c46aa59f90f6111b3a804baab461a7e94a /erts/emulator/beam | |
parent | 226a754d1f4babb262b2a15569b174921f97ad86 (diff) | |
download | otp-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')
-rw-r--r-- | erts/emulator/beam/erl_gc.c | 11 |
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 |