diff options
Diffstat (limited to 'erts/emulator/beam/erl_process.c')
-rw-r--r-- | erts/emulator/beam/erl_process.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c index a247258eff..479a4c6f9a 100644 --- a/erts/emulator/beam/erl_process.c +++ b/erts/emulator/beam/erl_process.c @@ -708,10 +708,10 @@ erts_pre_init_process(void) erts_psd_required_locks[ERTS_PSD_DELAYED_GC_TASK_QS].set_locks = ERTS_PSD_DELAYED_GC_TASK_QS_SET_LOCKS; - erts_psd_required_locks[ERTS_PSD_NIF_TRAP_EXPORT].get_locks - = ERTS_PSD_NIF_TRAP_EXPORT_GET_LOCKS; - erts_psd_required_locks[ERTS_PSD_NIF_TRAP_EXPORT].set_locks - = ERTS_PSD_NIF_TRAP_EXPORT_SET_LOCKS; + erts_psd_required_locks[ERTS_PSD_NFUNC_TRAP_WRAPPER].get_locks + = ERTS_PSD_NFUNC_TRAP_WRAPPER_GET_LOCKS; + erts_psd_required_locks[ERTS_PSD_NFUNC_TRAP_WRAPPER].set_locks + = ERTS_PSD_NFUNC_TRAP_WRAPPER_SET_LOCKS; erts_psd_required_locks[ERTS_PSD_ETS_OWNED_TABLES].get_locks = ERTS_PSD_ETS_OWNED_TABLES_GET_LOCKS; @@ -6478,8 +6478,8 @@ schedule_out_process(ErtsRunQueue *c_rq, erts_aint32_t state, Process *p, ASSERT(!(state & (ERTS_PSFLG_DIRTY_IO_PROC |ERTS_PSFLG_DIRTY_CPU_PROC)) - || (BeamIsOpCode(*p->i, op_call_nif) - || BeamIsOpCode(*p->i, op_apply_bif))); + || (BeamIsOpCode(*p->i, op_call_nif_WWW) + || BeamIsOpCode(*p->i, op_call_bif_W))); a = state; @@ -11976,7 +11976,7 @@ delete_process(Process* p) if (pbt) erts_free(ERTS_ALC_T_BPD, (void *) pbt); - erts_destroy_nif_export(p); + erts_destroy_nfunc(p); /* Cleanup psd */ @@ -12118,6 +12118,7 @@ erts_proc_exit_handle_dist_monitor(ErtsMonitor *mon, void *vctxt, Sint reds) ASSERT(c_p->flags & F_DISABLE_GC); ASSERT(erts_monitor_is_target(mon) && mon->type == ERTS_MON_TYPE_DIST_PROC); ASSERT(ctxt->dist_state == NIL); + ASSERT(!ctxt->yield); mdp = erts_monitor_to_data(mon); @@ -12164,10 +12165,12 @@ erts_proc_exit_handle_dist_monitor(ErtsMonitor *mon, void *vctxt, Sint reds) switch (code) { case ERTS_DSIG_SEND_YIELD: reds_consumed = reds; /* force yield */ + ctxt->yield = 1; break; case ERTS_DSIG_SEND_CONTINUE: ctxt->dist_state = erts_dsend_export_trap_context(c_p, &ctx); reds_consumed = reds; /* force yield */ + ctxt->yield = 1; break; case ERTS_DSIG_SEND_OK: break; @@ -12379,6 +12382,7 @@ erts_proc_exit_handle_dist_link(ErtsLink *lnk, void *vctxt, Sint reds) ASSERT(c_p->flags & F_DISABLE_GC); ASSERT(lnk->type == ERTS_LNK_TYPE_DIST_PROC); ASSERT(ctxt->dist_state == NIL); + ASSERT(!ctxt->yield); dlnk = erts_link_to_other(lnk, &ldp); dist = ((ErtsLinkDataExtended *) ldp)->dist; @@ -12418,10 +12422,12 @@ erts_proc_exit_handle_dist_link(ErtsLink *lnk, void *vctxt, Sint reds) switch (code) { case ERTS_DSIG_SEND_YIELD: reds_consumed = reds; /* force yield */ + ctxt->yield = 1; break; case ERTS_DSIG_SEND_CONTINUE: ctxt->dist_state = erts_dsend_export_trap_context(c_p, &ctx); reds_consumed = reds; /* force yield */ + ctxt->yield = 1; break; case ERTS_DSIG_SEND_OK: break; @@ -12844,6 +12850,7 @@ restart: trap_state->pectxt.dist_links = NULL; trap_state->pectxt.dist_monitors = NULL; trap_state->pectxt.dist_state = NIL; + trap_state->pectxt.yield = 0; erts_proc_lock(p, ERTS_PROC_LOCK_MSGQ); @@ -12946,7 +12953,7 @@ restart: (void *) &trap_state->pectxt, &trap_state->yield_state, reds); - if (reds <= 0 || is_not_nil(trap_state->pectxt.dist_state)) + if (reds <= 0 || trap_state->pectxt.yield) goto yield; trap_state->phase = ERTS_CONTINUE_EXIT_DIST_MONITORS; } @@ -12961,7 +12968,7 @@ restart: (void *) &trap_state->pectxt, &trap_state->yield_state, reds); - if (reds <= 0 || is_not_nil(trap_state->pectxt.dist_state)) + if (reds <= 0 || trap_state->pectxt.yield) goto yield; trap_state->phase = ERTS_CONTINUE_EXIT_DONE; @@ -13046,6 +13053,7 @@ restart: sys_memcpy(trap_state, &static_state, sizeof(*trap_state)); p->u.terminate = trap_state; } + trap_state->pectxt.yield = 0; ASSERT(p->scheduler_data); ASSERT(p->scheduler_data->current_process == p); @@ -13461,7 +13469,7 @@ static void print_current_process_info(fmtfn_t to, void *to_arg, * * A BIF that calls this should make sure to schedule out to never come back: * erts_halt(code); - * ERTS_BIF_YIELD1(bif_export[BIF_erlang_halt_1], BIF_P, NIL); + * ERTS_BIF_YIELD1(&bif_trap_export[BIF_erlang_halt_1], BIF_P, NIL); */ void erts_halt(int code) { |