diff options
author | Henrik Nord <[email protected]> | 2016-09-14 15:23:23 +0200 |
---|---|---|
committer | Henrik Nord <[email protected]> | 2016-09-14 15:23:23 +0200 |
commit | 7cd91bbe819ff25308a7887474451f0db381db5e (patch) | |
tree | 98a826ef6eebd87763a1a477b9f478f9a18c6c94 /erts/emulator/beam | |
parent | 563b09d75ea218c7e731dadccf34098915010408 (diff) | |
parent | 98b870f624753427b606f911fff255ff8864aa2e (diff) | |
download | otp-7cd91bbe819ff25308a7887474451f0db381db5e.tar.gz otp-7cd91bbe819ff25308a7887474451f0db381db5e.tar.bz2 otp-7cd91bbe819ff25308a7887474451f0db381db5e.zip |
Merge branch 'maint'
Conflicts:
OTP_VERSION
Diffstat (limited to 'erts/emulator/beam')
-rw-r--r-- | erts/emulator/beam/erl_gc.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/erts/emulator/beam/erl_gc.c b/erts/emulator/beam/erl_gc.c index 904bbda759..db262d35c5 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); @@ -387,6 +388,11 @@ erts_gc_after_bif_call_lhf(Process* p, ErlHeapFragment *live_hf_end, return result; } + if (!p->mbuf) { + /* Must have GC:d in BIF call... invalidate live_hf_end */ + live_hf_end = ERTS_INVALID_HFRAG_PTR; + } + if (is_non_value(result)) { if (p->freason == TRAP) { #if HIPE @@ -757,6 +763,9 @@ do_major_collection: p->last_old_htop = p->old_htop; #endif + ASSERT(!p->mbuf); + ASSERT(!ERTS_IS_GC_DESIRED(p)); + return reds; } @@ -2253,7 +2262,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; @@ -2296,6 +2307,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 |