BIF_RETTYPE erts_internal_check_process_code_2(BIF_ALIST_2) { int reds = 0; Uint flags; Eterm res; if (is_not_atom(BIF_ARG_1)) goto badarg; if (is_not_small(BIF_ARG_2)) goto badarg; flags = unsigned_val(BIF_ARG_2); if (flags & ~ERTS_CPC_ALL) { goto badarg; } res = erts_check_process_code(BIF_P, BIF_ARG_1, flags, &reds, BIF_P->fcalls); ASSERT(is_value(res)); BIF_RET2(res, reds); badarg: BIF_ERROR(BIF_P, BADARG); }
BIF_RETTYPE erts_internal_check_process_code_2(BIF_ALIST_2) { int reds = 0; Eterm res; Eterm olist = BIF_ARG_2; int allow_gc = 1; if (is_not_atom(BIF_ARG_1)) goto badarg; while (is_list(olist)) { Eterm *lp = list_val(olist); Eterm opt = CAR(lp); if (is_tuple(opt)) { Eterm* tp = tuple_val(opt); switch (arityval(tp[0])) { case 2: switch (tp[1]) { case am_allow_gc: switch (tp[2]) { case am_false: allow_gc = 0; break; case am_true: allow_gc = 1; break; default: goto badarg; } break; default: goto badarg; } break; default: goto badarg; } } else goto badarg; olist = CDR(lp); } if (is_not_nil(olist)) goto badarg; res = erts_check_process_code(BIF_P, BIF_ARG_1, allow_gc, &reds); ASSERT(is_value(res)); BIF_RET2(res, reds); badarg: BIF_ERROR(BIF_P, BADARG); }
BIF_RETTYPE erts_internal_check_process_code_1(BIF_ALIST_1) { int reds = 0; Eterm res; if (is_not_atom(BIF_ARG_1)) goto badarg; res = erts_check_process_code(BIF_P, BIF_ARG_1, &reds, BIF_P->fcalls); ASSERT(is_value(res)); BIF_RET2(res, reds); badarg: BIF_ERROR(BIF_P, BADARG); }
BIF_RETTYPE erts_internal_check_dirty_process_code_2(BIF_ALIST_2) { #if !defined(ERTS_DIRTY_SCHEDULERS) BIF_ERROR(BIF_P, EXC_NOTSUP); #else Process *rp; int reds = 0; Eterm res; if (BIF_P != erts_dirty_process_code_checker) BIF_ERROR(BIF_P, EXC_NOTSUP); if (is_not_internal_pid(BIF_ARG_1)) BIF_ERROR(BIF_P, BADARG); if (is_not_atom(BIF_ARG_2)) BIF_ERROR(BIF_P, BADARG); rp = erts_pid2proc_not_running(BIF_P, ERTS_PROC_LOCK_MAIN, BIF_ARG_1, ERTS_PROC_LOCK_MAIN); if (rp == ERTS_PROC_LOCK_BUSY) ERTS_BIF_YIELD2(bif_export[BIF_erts_internal_check_dirty_process_code_2], BIF_P, BIF_ARG_1, BIF_ARG_2); if (!rp) BIF_RET(am_false); res = erts_check_process_code(rp, BIF_ARG_2, &reds, BIF_P->fcalls); if (BIF_P != rp) erts_smp_proc_unlock(rp, ERTS_PROC_LOCK_MAIN); ASSERT(is_value(res)); BIF_RET2(res, reds); #endif }