diff options
Diffstat (limited to 'erts/emulator/beam/erl_gc.c')
-rw-r--r-- | erts/emulator/beam/erl_gc.c | 51 |
1 files changed, 30 insertions, 21 deletions
diff --git a/erts/emulator/beam/erl_gc.c b/erts/emulator/beam/erl_gc.c index 61b4b81668..b74eaccea8 100644 --- a/erts/emulator/beam/erl_gc.c +++ b/erts/emulator/beam/erl_gc.c @@ -697,10 +697,10 @@ garbage_collect(Process* p, ErlHeapFragment *live_hf_end, ErtsMonotonicTime start_time; ErtsSchedulerData *esdp = erts_proc_sched_data(p); erts_aint32_t state; - ERTS_MSACC_PUSH_STATE(); #ifdef USE_VM_PROBES DTRACE_CHARBUF(pidbuf, DTRACE_TERM_BUF_SIZE); #endif + ERTS_MSACC_PUSH_STATE(); ERTS_UNDEF(start_time, 0); ERTS_CHK_MBUF_SZ(p); @@ -1772,15 +1772,6 @@ do_minor(Process *p, ErlHeapFragment *live_hf_end, sys_memcpy(n_heap + new_sz - n, p->stop, n * sizeof(Eterm)); p->stop = n_heap + new_sz - n; -#ifdef USE_VM_PROBES - if (HEAP_SIZE(p) != new_sz && DTRACE_ENABLED(process_heap_grow)) { - DTRACE_CHARBUF(pidbuf, DTRACE_TERM_BUF_SIZE); - - dtrace_proc_str(p, pidbuf); - DTRACE3(process_heap_grow, pidbuf, HEAP_SIZE(p), new_sz); - } -#endif - #ifdef HARDDEBUG disallow_heap_frag_ref_in_heap(p, n_heap, n_htop); #endif @@ -1789,8 +1780,19 @@ do_minor(Process *p, ErlHeapFragment *live_hf_end, HEAP_START(p) = n_heap; HEAP_TOP(p) = n_htop; - HEAP_SIZE(p) = new_sz; HEAP_END(p) = n_heap + new_sz; + +#ifdef USE_VM_PROBES + if (HEAP_SIZE(p) != new_sz && DTRACE_ENABLED(process_heap_grow)) { + DTRACE_CHARBUF(pidbuf, DTRACE_TERM_BUF_SIZE); + Uint old_sz = HEAP_SIZE(p); + + HEAP_SIZE(p) = new_sz; + dtrace_proc_str(p, pidbuf); + DTRACE3(process_heap_grow, pidbuf, old_sz, new_sz); + } +#endif + HEAP_SIZE(p) = new_sz; } /* @@ -1863,15 +1865,6 @@ major_collection(Process* p, ErlHeapFragment *live_hf_end, sys_memcpy(n_heap + new_sz - stk_sz, p->stop, stk_sz * sizeof(Eterm)); p->stop = n_heap + new_sz - stk_sz; -#ifdef USE_VM_PROBES - if (HEAP_SIZE(p) != new_sz && DTRACE_ENABLED(process_heap_grow)) { - DTRACE_CHARBUF(pidbuf, DTRACE_TERM_BUF_SIZE); - - dtrace_proc_str(p, pidbuf); - DTRACE3(process_heap_grow, pidbuf, HEAP_SIZE(p), new_sz); - } -#endif - #ifdef HARDDEBUG disallow_heap_frag_ref_in_heap(p, n_heap, n_htop); #endif @@ -1880,8 +1873,24 @@ major_collection(Process* p, ErlHeapFragment *live_hf_end, HEAP_START(p) = n_heap; HEAP_TOP(p) = n_htop; - HEAP_SIZE(p) = new_sz; HEAP_END(p) = n_heap + new_sz; + +#ifdef USE_VM_PROBES + /* Fire process_heap_grow tracepoint after all heap references have + * been updated. This allows to walk the stack. */ + if (HEAP_SIZE(p) != new_sz && DTRACE_ENABLED(process_heap_grow)) { + DTRACE_CHARBUF(pidbuf, DTRACE_TERM_BUF_SIZE); + Uint old_sz = HEAP_SIZE(p); + + /* Update the heap size before firing tracepoint */ + HEAP_SIZE(p) = new_sz; + + dtrace_proc_str(p, pidbuf); + DTRACE3(process_heap_grow, pidbuf, old_sz, new_sz); + } +#endif + HEAP_SIZE(p) = new_sz; + GEN_GCS(p) = 0; HIGH_WATER(p) = HEAP_TOP(p); |