Eterm erts_gc_after_bif_call(Process* p, Eterm result, Eterm* regs, Uint arity) { int cost; if (is_non_value(result)) { if (p->freason == TRAP) { #if HIPE if (regs == NULL) { regs = ERTS_PROC_GET_SCHDATA(p)->x_reg_array; } #endif cost = erts_garbage_collect(p, 0, regs, p->arity); } else { cost = erts_garbage_collect(p, 0, regs, arity); } } else { Eterm val[1]; val[0] = result; cost = erts_garbage_collect(p, 0, val, 1); result = val[0]; } BUMP_REDS(p, cost); return result; }
void erts_debug_unuse_tmp_heap(int size, Process *p) { ErtsSchedulerData *sd = ((p == NULL) ? erts_get_scheduler_data() : ERTS_PROC_GET_SCHDATA(p)); sd->num_tmp_heap_used -= size; ASSERT(sd->num_tmp_heap_used >= 0); }
Eterm *erts_debug_allocate_tmp_heap(int size, Process *p) { ErtsSchedulerData *sd = ((p == NULL) ? erts_get_scheduler_data() : ERTS_PROC_GET_SCHDATA(p)); int offset = sd->num_tmp_heap_used; ASSERT(offset+size <= TMP_HEAP_SIZE); return (sd->tmp_heap)+offset; }
BIF_RETTYPE make_ref_0(BIF_ALIST_0) { BIF_RETTYPE res; Eterm* hp; ERTS_SMP_LC_ASSERT(ERTS_PROC_LOCK_MAIN & erts_proc_lc_my_proc_locks(BIF_P)); hp = HAlloc(BIF_P, REF_THING_SIZE); res = erts_sched_make_ref_in_buffer(ERTS_PROC_GET_SCHDATA(BIF_P), hp); BIF_RET(res); }
static ERTS_INLINE Eterm unique_integer_bif(Process *c_p, int positive) { ErtsSchedulerData *esdp; Uint64 thr_id, unique; Uint hsz; Eterm *hp; esdp = ERTS_PROC_GET_SCHDATA(c_p); thr_id = (Uint64) esdp->thr_id; unique = esdp->unique++; bld_unique_integer_term(NULL, &hsz, thr_id, unique, positive); hp = hsz ? HAlloc(c_p, hsz) : NULL; return bld_unique_integer_term(&hp, NULL, thr_id, unique, positive); }