diff options
Diffstat (limited to 'erts/emulator/beam/bif.c')
| -rw-r--r-- | erts/emulator/beam/bif.c | 564 | 
1 files changed, 240 insertions, 324 deletions
| diff --git a/erts/emulator/beam/bif.c b/erts/emulator/beam/bif.c index b6595d2a5d..0e5f7bb22b 100644 --- a/erts/emulator/beam/bif.c +++ b/erts/emulator/beam/bif.c @@ -57,10 +57,11 @@ static Export dsend_continue_trap_export;  Export *erts_convert_time_unit_trap = NULL;  static Export *await_msacc_mod_trap = NULL; -static erts_smp_atomic32_t msacc; +static erts_atomic32_t msacc; +static Export *system_flag_scheduler_wall_time_trap;  static Export *await_sched_wall_time_mod_trap; -static erts_smp_atomic32_t sched_wall_time; +static erts_atomic32_t sched_wall_time;  #define DECL_AM(S) Eterm AM_ ## S = am_atom_put(#S, sizeof(#S) - 1) @@ -98,14 +99,12 @@ static int insert_internal_link(Process* p, Eterm rpid)      ASSERT(is_internal_pid(rpid)); -#ifdef ERTS_SMP      if (IS_TRACED(p)  	&& (ERTS_TRACE_FLAGS(p) & (F_TRACE_SOL|F_TRACE_SOL1))) {  	rp_locks = ERTS_PROC_LOCKS_ALL;      } -    erts_smp_proc_lock(p, ERTS_PROC_LOCK_LINK); -#endif +    erts_proc_lock(p, ERTS_PROC_LOCK_LINK);      /* get a pointer to the process struct of the linked process */      rp = erts_pid2proc_opt(p, ERTS_PROC_LOCK_MAIN|ERTS_PROC_LOCK_LINK, @@ -113,7 +112,7 @@ static int insert_internal_link(Process* p, Eterm rpid)  			   ERTS_P2P_FLG_ALLOW_OTHER_X);      if (!rp) { -	erts_smp_proc_unlock(p, ERTS_PROC_LOCK_LINK); +	erts_proc_unlock(p, ERTS_PROC_LOCK_LINK);  	return 0;      } @@ -139,10 +138,10 @@ static int insert_internal_link(Process* p, Eterm rpid)                     rp, am_getting_linked, p->common.id);      if (p == rp) -	erts_smp_proc_unlock(p, rp_locks & ~ERTS_PROC_LOCK_MAIN); +	erts_proc_unlock(p, rp_locks & ~ERTS_PROC_LOCK_MAIN);      else { -	erts_smp_proc_unlock(p, ERTS_PROC_LOCK_LINK); -	erts_smp_proc_unlock(rp, rp_locks); +	erts_proc_unlock(p, ERTS_PROC_LOCK_LINK); +	erts_proc_unlock(rp, rp_locks);      }      return 1; @@ -178,13 +177,13 @@ BIF_RETTYPE link_1(BIF_ALIST_1)  	    goto res_no_proc;  	} -	erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCK_LINK); +	erts_proc_lock(BIF_P, ERTS_PROC_LOCK_LINK);  	if (erts_add_link(&ERTS_P_LINKS(BIF_P), LINK_PID, BIF_ARG_1) >= 0)  	    send_link_signal = 1;  	/* else: already linked */ -	erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_LINK); +	erts_proc_unlock(BIF_P, ERTS_PROC_LOCK_LINK);  	if (send_link_signal) {  	    Eterm ref; @@ -212,11 +211,11 @@ BIF_RETTYPE link_1(BIF_ALIST_1)      if (is_external_pid(BIF_ARG_1)) { -	erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCK_LINK); +	erts_proc_lock(BIF_P, ERTS_PROC_LOCK_LINK);  	/* We may earn time by checking first that we're not linked already */  	if (erts_lookup_link(ERTS_P_LINKS(BIF_P), BIF_ARG_1) != NULL) { -	    erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_LINK); +	    erts_proc_unlock(BIF_P, ERTS_PROC_LOCK_LINK);  	    BIF_RET(am_true);  	}  	else { @@ -225,22 +224,43 @@ BIF_RETTYPE link_1(BIF_ALIST_1)  	    ErtsDSigData dsd;  	    dep = external_pid_dist_entry(BIF_ARG_1);  	    if (dep == erts_this_dist_entry) { -		erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_LINK); +		erts_proc_unlock(BIF_P, ERTS_PROC_LOCK_LINK);  		goto res_no_proc;  	    } -	    code = erts_dsig_prepare(&dsd, dep, BIF_P, ERTS_DSP_RLOCK, 0); +	    code = erts_dsig_prepare(&dsd, dep, BIF_P, +				     (ERTS_PROC_LOCK_MAIN | ERTS_PROC_LOCK_LINK), +				     ERTS_DSP_RLOCK, 0, 1);  	    switch (code) {  	    case ERTS_DSIG_PREP_NOT_ALIVE: -		/* Let the dlink trap handle it */ -	    case ERTS_DSIG_PREP_NOT_CONNECTED: -		erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_LINK); -		BIF_TRAP1(dlink_trap, BIF_P, BIF_ARG_1); - +	    case ERTS_DSIG_PREP_NOT_CONNECTED: { +		ErtsProcLocks locks = ERTS_PROC_LOCK_MAIN | ERTS_PROC_LOCK_LINK; +		erts_aint32_t state; +		erts_proc_lock(BIF_P, (ERTS_PROC_LOCKS_ALL & ~locks)); +		locks = ERTS_PROC_LOCKS_ALL; +		erts_send_exit_signal(BIF_P, BIF_ARG_1, BIF_P, &locks, +				      am_noconnection, NIL, NULL, 0); +		erts_proc_unlock(BIF_P, locks & ERTS_PROC_LOCKS_ALL_MINOR); + +		/* +		 * Copy-paste from old dist_exit_3, not sure if we really +		 * need erts_handle_pending_exit when exit_2 does not. +		 */ +		state = erts_atomic32_read_acqb(&BIF_P->state); +		if (state & (ERTS_PSFLG_EXITING|ERTS_PSFLG_PENDING_EXIT)) { +		    if (state & ERTS_PSFLG_PENDING_EXIT) +			erts_handle_pending_exit(BIF_P, ERTS_PROC_LOCK_MAIN); +		    ERTS_BIF_EXITED(BIF_P); +		} +		BIF_RET(am_true); +	    } +            case ERTS_DSIG_PREP_PENDING:  	    case ERTS_DSIG_PREP_CONNECTED: -		/* We are connected. Setup link and send link signal */ - -		erts_smp_de_links_lock(dep); +                /* +                 * We have (pending) connection. +                 * Setup link and enqueue link signal. +                 */ +		erts_de_links_lock(dep);  		erts_add_link(&ERTS_P_LINKS(BIF_P), LINK_PID, BIF_ARG_1);  		lnk = erts_add_or_lookup_link(&(dep->nlinks), @@ -249,17 +269,16 @@ BIF_RETTYPE link_1(BIF_ALIST_1)  		ASSERT(lnk != NULL);  		erts_add_link(&ERTS_LINK_ROOT(lnk), LINK_PID, BIF_ARG_1); -		erts_smp_de_links_unlock(dep); -		erts_smp_de_runlock(dep); -		erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_LINK); +		erts_de_links_unlock(dep); +		erts_de_runlock(dep); +		erts_proc_unlock(BIF_P, ERTS_PROC_LOCK_LINK);  		code = erts_dsig_send_link(&dsd, BIF_P->common.id, BIF_ARG_1);  		if (code == ERTS_DSIG_SEND_YIELD)  		    ERTS_BIF_YIELD_RETURN(BIF_P, am_true);  		BIF_RET(am_true);  	    default: -		ASSERT(! "Invalid dsig prepare result"); -		BIF_ERROR(BIF_P, EXC_INTERNAL_ERROR); +		ERTS_ASSERT(! "Invalid dsig prepare result");  	    }  	}      } @@ -267,11 +286,11 @@ BIF_RETTYPE link_1(BIF_ALIST_1)      BIF_ERROR(BIF_P, BADARG);  res_no_proc: { -	erts_aint32_t state = erts_smp_atomic32_read_nob(&BIF_P->state); +	erts_aint32_t state = erts_atomic32_read_nob(&BIF_P->state);  	if (state & ERTS_PSFLG_TRAP_EXIT) {  	    ErtsProcLocks locks = ERTS_PROC_LOCK_MAIN;  	    erts_deliver_exit_message(BIF_ARG_1, BIF_P, &locks, am_noproc, NIL); -	    erts_smp_proc_unlock(BIF_P, ~ERTS_PROC_LOCK_MAIN & locks); +	    erts_proc_unlock(BIF_P, ~ERTS_PROC_LOCK_MAIN & locks);  	    BIF_RET(am_true);  	}  	else @@ -290,58 +309,43 @@ remote_demonitor(Process *c_p, DistEntry *dep, Eterm ref, Eterm to)      ErtsMonitor *mon;      int code;      Eterm res = am_false; -#ifndef ERTS_SMP -    int stale_mon = 0; -#endif -    ERTS_SMP_LC_ASSERT((ERTS_PROC_LOCK_MAIN|ERTS_PROC_LOCK_LINK) +    ERTS_LC_ASSERT((ERTS_PROC_LOCK_MAIN|ERTS_PROC_LOCK_LINK)  		       == erts_proc_lc_my_proc_locks(c_p)); -    code = erts_dsig_prepare(&dsd, dep, c_p, ERTS_DSP_RLOCK, 0); +    code = erts_dsig_prepare(&dsd, dep, c_p, ERTS_PROC_LOCK_MAIN, +			     ERTS_DSP_RLOCK, 0, 0);      switch (code) {      case ERTS_DSIG_PREP_NOT_ALIVE:      case ERTS_DSIG_PREP_NOT_CONNECTED: -#ifndef ERTS_SMP -	/* XXX Is this possible? Shouldn't this link -	   previously have been removed if the node -	   had previously been disconnected. */ -	ASSERT(0); -	stale_mon = 1; -#endif  	/*  	 * In the smp case this is possible if the node goes  	 * down just before the call to demonitor.  	 */  	if (dep) { -	    erts_smp_de_links_lock(dep); +	    erts_de_links_lock(dep);  	    dmon = erts_remove_monitor(&dep->monitors, ref); -	    erts_smp_de_links_unlock(dep); +	    erts_de_links_unlock(dep);  	    if (dmon)  		erts_destroy_monitor(dmon);  	}  	mon = erts_remove_monitor(&ERTS_P_MONITORS(c_p), ref); -	erts_smp_proc_unlock(c_p, ERTS_PROC_LOCK_LINK); +	erts_proc_unlock(c_p, ERTS_PROC_LOCK_LINK);          res = am_true;  	break; +    case ERTS_DSIG_PREP_PENDING:      case ERTS_DSIG_PREP_CONNECTED: -	erts_smp_de_links_lock(dep); +	erts_de_links_lock(dep);  	mon = erts_remove_monitor(&ERTS_P_MONITORS(c_p), ref);  	dmon = erts_remove_monitor(&dep->monitors, ref); -	erts_smp_de_links_unlock(dep); -	erts_smp_de_runlock(dep); -	erts_smp_proc_unlock(c_p, ERTS_PROC_LOCK_LINK); +	erts_de_links_unlock(dep); +	erts_de_runlock(dep); +	erts_proc_unlock(c_p, ERTS_PROC_LOCK_LINK);  	if (!dmon) { -#ifndef ERTS_SMP -	    /* XXX How is this possible? Shouldn't this link -	       previously have been removed when the distributed -	       end was removed. */ -	    ASSERT(0); -	    stale_mon = 1; -#endif  	    /*  	     * This is possible when smp support is enabled.  	     * 'DOWN' message just arrived. @@ -366,22 +370,9 @@ remote_demonitor(Process *c_p, DistEntry *dep, Eterm ref, Eterm to)  	}  	break;      default: -	ASSERT(! "Invalid dsig prepare result"); -        return am_internal_error; +	ERTS_ASSERT(! "Invalid dsig prepare result");      } -#ifndef ERTS_SMP -    if (stale_mon) { -	erts_dsprintf_buf_t *dsbufp = erts_create_logger_dsbuf(); -	erts_dsprintf(dsbufp, "Stale process monitor %T to ", ref); -	if (is_atom(to)) -	    erts_dsprintf(dsbufp, "{%T, %T}", to, dep->sysname); -	else -	    erts_dsprintf(dsbufp, "%T", to); -	erts_dsprintf(dsbufp, " found\n"); -	erts_send_error_to_logger(c_p->group_leader, dsbufp); -    } -#endif      /*       * We aren't allowed to destroy 'mon' until now, since 'to' @@ -391,7 +382,7 @@ remote_demonitor(Process *c_p, DistEntry *dep, Eterm ref, Eterm to)  		    lookup and remove */      erts_destroy_monitor(mon); -    ERTS_SMP_LC_ASSERT(ERTS_PROC_LOCK_MAIN == erts_proc_lc_my_proc_locks(c_p)); +    ERTS_LC_ASSERT(ERTS_PROC_LOCK_MAIN == erts_proc_lc_my_proc_locks(c_p));      return res;  } @@ -405,13 +396,9 @@ demonitor_local_process(Process *c_p, Eterm ref, Eterm to, Eterm *res)                             ERTS_P2P_FLG_ALLOW_OTHER_X);      ErtsMonitor *mon = erts_remove_monitor(&ERTS_P_MONITORS(c_p), ref); -#ifndef ERTS_SMP -    ASSERT(mon); -#else      if (!mon)          *res = am_false;      else -#endif      {          *res = am_true;          erts_destroy_monitor(mon); @@ -420,12 +407,12 @@ demonitor_local_process(Process *c_p, Eterm ref, Eterm to, Eterm *res)          ErtsMonitor *rmon;          rmon = erts_remove_monitor(&ERTS_P_MONITORS(rp), ref);          if (rp != c_p) -            erts_smp_proc_unlock(rp, ERTS_PROC_LOCK_LINK); +            erts_proc_unlock(rp, ERTS_PROC_LOCK_LINK);          if (rmon != NULL)              erts_destroy_monitor(rmon);      }      else { -        ERTS_SMP_ASSERT_IS_NOT_EXITING(c_p); +        ERTS_ASSERT_IS_NOT_EXITING(c_p);      }  } @@ -438,7 +425,7 @@ demonitor_local_port(Process *origin, Eterm ref, Eterm target)      if (!port) {          BIF_ERROR(origin, BADARG);      } -    erts_smp_proc_unlock(origin, ERTS_PROC_LOCK_LINK); +    erts_proc_unlock(origin, ERTS_PROC_LOCK_LINK);      if (port) {          Eterm trap_ref; @@ -458,7 +445,7 @@ demonitor_local_port(Process *origin, Eterm ref, Eterm target)          }      }      else { -        ERTS_SMP_ASSERT_IS_NOT_EXITING(origin); +        ERTS_ASSERT_IS_NOT_EXITING(origin);      }      BIF_RET(res);  } @@ -472,11 +459,10 @@ BIF_RETTYPE demonitor(Process *c_p, Eterm ref, Eterm *multip)     ErtsMonitor  *mon = NULL;  /* The monitor entry to delete */     Eterm        to = NIL;     /* Monitor link traget */     DistEntry    *dep = NULL;  /* Target's distribution entry */ -   int          deref_de = 0;     BIF_RETTYPE  res = am_false;     int          unlock_link = 1; -   erts_smp_proc_lock(c_p, ERTS_PROC_LOCK_LINK); +   erts_proc_lock(c_p, ERTS_PROC_LOCK_LINK);     if (is_not_internal_ref(ref)) {         res = am_badarg; @@ -502,8 +488,6 @@ BIF_RETTYPE demonitor(Process *c_p, Eterm ref, Eterm *multip)             ASSERT(is_node_name_atom(to));             dep = erts_sysname_to_connected_dist_entry(to);             ASSERT(dep != erts_this_dist_entry); -           if (dep) -               deref_de = 1;         } else if (is_port(to)) {             if (port_dist_entry(to) != erts_this_dist_entry) {                 goto badarg; @@ -521,11 +505,6 @@ BIF_RETTYPE demonitor(Process *c_p, Eterm ref, Eterm *multip)             unlock_link = 0;         }         else { /* Local monitor */ -           if (deref_de) { -               deref_de = 0; -               erts_deref_dist_entry(dep); -           } -           dep = NULL;             demonitor_local_process(c_p, ref, to, &res);         }         break; @@ -538,14 +517,9 @@ badarg:  done:     if (unlock_link) -       erts_smp_proc_unlock(c_p, ERTS_PROC_LOCK_LINK); +       erts_proc_unlock(c_p, ERTS_PROC_LOCK_LINK); -   if (deref_de) { -       ASSERT(dep); -       erts_deref_dist_entry(dep); -   } - -   ERTS_SMP_LC_ASSERT(ERTS_PROC_LOCK_MAIN == erts_proc_lc_my_proc_locks(c_p)); +   ERTS_LC_ASSERT(ERTS_PROC_LOCK_MAIN == erts_proc_lc_my_proc_locks(c_p));     BIF_RET(res);  } @@ -668,12 +642,12 @@ local_pid_monitor(Process *p, Eterm target, Eterm mon_ref, int boolean)  	return ret;      } -    erts_smp_proc_lock(p, ERTS_PROC_LOCK_LINK); +    erts_proc_lock(p, ERTS_PROC_LOCK_LINK);      rp = erts_pid2proc_opt(p, p_locks,  			   target, ERTS_PROC_LOCK_LINK,  			   ERTS_P2P_FLG_ALLOW_OTHER_X);      if (!rp) { -	erts_smp_proc_unlock(p, ERTS_PROC_LOCK_LINK); +	erts_proc_unlock(p, ERTS_PROC_LOCK_LINK);  	p_locks &= ~ERTS_PROC_LOCK_LINK;  	if (boolean)  	    ret = am_false; @@ -690,10 +664,10 @@ local_pid_monitor(Process *p, Eterm target, Eterm mon_ref, int boolean)  	erts_add_monitor(&ERTS_P_MONITORS(p), MON_ORIGIN, mon_ref, target, NIL);  	erts_add_monitor(&ERTS_P_MONITORS(rp), MON_TARGET, mon_ref, p->common.id, NIL); -	erts_smp_proc_unlock(rp, ERTS_PROC_LOCK_LINK); +	erts_proc_unlock(rp, ERTS_PROC_LOCK_LINK);      } -    erts_smp_proc_unlock(p, p_locks & ~ERTS_PROC_LOCK_MAIN); +    erts_proc_unlock(p, p_locks & ~ERTS_PROC_LOCK_MAIN);      return ret;  } @@ -727,7 +701,7 @@ res_no_proc:              break;          }      } -    erts_smp_proc_unlock(origin, p_locks & ~ERTS_PROC_LOCK_MAIN); +    erts_proc_unlock(origin, p_locks & ~ERTS_PROC_LOCK_MAIN);      BIF_RET(ref);  } @@ -742,7 +716,7 @@ local_name_monitor(Process *self, Eterm type, Eterm target_name)      Process     *proc = NULL;      Port        *port = NULL; -    erts_smp_proc_lock(self, ERTS_PROC_LOCK_LINK); +    erts_proc_lock(self, ERTS_PROC_LOCK_LINK);      erts_whereis_name(self, p_locks, target_name,                        &proc, ERTS_PROC_LOCK_LINK, @@ -761,7 +735,7 @@ local_name_monitor(Process *self, Eterm type, Eterm target_name)  	Eterm item;          UseTmpHeap(3,self); -        erts_smp_proc_unlock(self, ERTS_PROC_LOCK_LINK); +        erts_proc_unlock(self, ERTS_PROC_LOCK_LINK);  	p_locks &= ~ERTS_PROC_LOCK_LINK;  	item = TUPLE2(lhp, target_name, erts_this_dist_entry->sysname); @@ -772,7 +746,7 @@ local_name_monitor(Process *self, Eterm type, Eterm target_name)          UnUseTmpHeap(3,self);      }      else if (port) { -        erts_smp_proc_unlock(self, p_locks & ~ERTS_PROC_LOCK_MAIN); +        erts_proc_unlock(self, p_locks & ~ERTS_PROC_LOCK_MAIN);          p_locks &= ~ERTS_PROC_LOCK_MAIN;          switch (erts_port_monitor(self, port, target_name, &ret)) { @@ -793,16 +767,16 @@ local_name_monitor(Process *self, Eterm type, Eterm target_name)                           proc->common.id, target_name);          erts_add_monitor(&ERTS_P_MONITORS(proc), MON_TARGET, ret,                           self->common.id, target_name); -        erts_smp_proc_unlock(proc, ERTS_PROC_LOCK_LINK); +        erts_proc_unlock(proc, ERTS_PROC_LOCK_LINK);      }      if (p_locks) { -        erts_smp_proc_unlock(self, p_locks & ~ERTS_PROC_LOCK_MAIN); +        erts_proc_unlock(self, p_locks & ~ERTS_PROC_LOCK_MAIN);      }      BIF_RET(ret);  badarg:      if (p_locks) { -        erts_smp_proc_unlock(self, p_locks & ~ERTS_PROC_LOCK_MAIN); +        erts_proc_unlock(self, p_locks & ~ERTS_PROC_LOCK_MAIN);      }      BIF_ERROR(self, BADARG);  } @@ -815,23 +789,20 @@ remote_monitor(Process *p, Eterm bifarg1, Eterm bifarg2,      BIF_RETTYPE ret;      int code; -    erts_smp_proc_lock(p, ERTS_PROC_LOCK_LINK); -    code = erts_dsig_prepare(&dsd, dep, p, ERTS_DSP_RLOCK, 0); +    ASSERT(dep); +    erts_proc_lock(p, ERTS_PROC_LOCK_LINK); +    code = erts_dsig_prepare(&dsd, dep, +			     p, (ERTS_PROC_LOCK_MAIN | ERTS_PROC_LOCK_LINK), +			     ERTS_DSP_RLOCK, 0, 1);      switch (code) {      case ERTS_DSIG_PREP_NOT_ALIVE: -	/* Let the dmonitor_p trap handle it */      case ERTS_DSIG_PREP_NOT_CONNECTED: -	erts_smp_proc_unlock(p, ERTS_PROC_LOCK_LINK); +	erts_proc_unlock(p, ERTS_PROC_LOCK_LINK);  	ERTS_BIF_PREP_TRAP2(ret, dmonitor_p_trap, p, bifarg1, bifarg2);  	break; +    case ERTS_DSIG_PREP_PENDING:      case ERTS_DSIG_PREP_CONNECTED: -	if (!(dep->flags & DFLAG_DIST_MONITOR) -	    || (byname && !(dep->flags & DFLAG_DIST_MONITOR_NAME))) { -	    erts_smp_de_runlock(dep); -	    erts_smp_proc_unlock(p, ERTS_PROC_LOCK_LINK); -	    ERTS_BIF_PREP_ERROR(ret, p, BADARG); -	} -	else { +	{  	    Eterm p_trgt, p_name, d_name, mon_ref;  	    mon_ref = erts_make_ref(p); @@ -847,16 +818,16 @@ remote_monitor(Process *p, Eterm bifarg1, Eterm bifarg2,  		d_name = NIL;  	    } -	    erts_smp_de_links_lock(dep); +	    erts_de_links_lock(dep);  	    erts_add_monitor(&ERTS_P_MONITORS(p), MON_ORIGIN, mon_ref, p_trgt,  			     p_name);  	    erts_add_monitor(&(dep->monitors), MON_TARGET, mon_ref, p->common.id,  			     d_name); -	    erts_smp_de_links_unlock(dep); -	    erts_smp_de_runlock(dep); -	    erts_smp_proc_unlock(p, ERTS_PROC_LOCK_LINK); +	    erts_de_links_unlock(dep); +	    erts_de_runlock(dep); +	    erts_proc_unlock(p, ERTS_PROC_LOCK_LINK);  	    code = erts_dsig_send_monitor(&dsd, p->common.id, target, mon_ref);  	    if (code == ERTS_DSIG_SEND_YIELD) @@ -866,9 +837,7 @@ remote_monitor(Process *p, Eterm bifarg1, Eterm bifarg2,  	}  	break;      default: -	ASSERT(! "Invalid dsig prepare result"); -	ERTS_BIF_PREP_ERROR(ret, p, EXC_INTERNAL_ERROR); -	break; +	ERTS_ASSERT(! "Invalid dsig prepare result");      }      BIF_RET(ret); @@ -879,7 +848,6 @@ BIF_RETTYPE monitor_2(BIF_ALIST_2)      Eterm target = BIF_ARG_2;      BIF_RETTYPE ret;      DistEntry  *dep = NULL;  -    int deref_de = 0;      /* Only process monitors are implemented */      switch (BIF_ARG_1) { @@ -889,10 +857,10 @@ BIF_RETTYPE monitor_2(BIF_ALIST_2)              goto badarg;          }  	ref = erts_make_ref(BIF_P); -	erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCK_LINK); +	erts_proc_lock(BIF_P, ERTS_PROC_LOCK_LINK);  	erts_add_monitor(&ERTS_P_MONITORS(BIF_P), MON_TIME_OFFSET,  			 ref, am_clock_service, NIL); -	erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_LINK); +	erts_proc_unlock(BIF_P, ERTS_PROC_LOCK_LINK);  	erts_monitor_time_offset(BIF_P->common.id, ref);  	BIF_RET(ref);      } @@ -937,24 +905,17 @@ local_port:  	if (!erts_is_alive && remote_node != am_Noname) {              goto badarg; /* Remote monitor from (this) undistributed node */  	} -	dep = erts_sysname_to_connected_dist_entry(remote_node); +	dep = erts_find_or_insert_dist_entry(remote_node);  	if (dep == erts_this_dist_entry) { -	    deref_de = 1;              ret = local_name_monitor(BIF_P, BIF_ARG_1, name);  	} else { -	    if (dep) -		deref_de = 1;  	    ret = remote_monitor(BIF_P, BIF_ARG_1, BIF_ARG_2, dep, name, 1);  	} +	erts_deref_dist_entry(dep);      } else {  badarg:  	ERTS_BIF_PREP_ERROR(ret, BIF_P, BADARG);      } -    if (deref_de) { -	deref_de = 0; -	erts_deref_dist_entry(dep); -    } -      return ret;  } @@ -1009,7 +970,7 @@ BIF_RETTYPE spawn_opt_1(BIF_ALIST_1)      so.max_heap_size  = H_MAX_SIZE;      so.max_heap_flags = H_MAX_FLAGS;      so.priority       = PRIORITY_NORMAL; -    so.max_gen_gcs    = (Uint16) erts_smp_atomic32_read_nob(&erts_max_gen_gcs); +    so.max_gen_gcs    = (Uint16) erts_atomic32_read_nob(&erts_max_gen_gcs);      so.scheduler      = 0;      /* @@ -1150,15 +1111,13 @@ BIF_RETTYPE unlink_1(BIF_ALIST_1)      }      if (is_internal_port(BIF_ARG_1)) { -	erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCK_LINK|ERTS_PROC_LOCK_STATUS); -#ifdef ERTS_SMP +	erts_proc_lock(BIF_P, ERTS_PROC_LOCK_LINK|ERTS_PROC_LOCK_STATUS);  	if (ERTS_PROC_PENDING_EXIT(BIF_P))  	    goto handle_pending_exit; -#endif  	l = erts_remove_link(&ERTS_P_LINKS(BIF_P), BIF_ARG_1); -	erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_LINK|ERTS_PROC_LOCK_STATUS); +	erts_proc_unlock(BIF_P, ERTS_PROC_LOCK_LINK|ERTS_PROC_LOCK_STATUS);  	if (l) {  	    Port *prt; @@ -1200,14 +1159,12 @@ BIF_RETTYPE unlink_1(BIF_ALIST_1)  	/* Blind removal, we might have trapped or anything, this leaves  	   us in a state where monitors might be inconsistent, but the dist  	   code should take care of it. */ -	erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCK_LINK|ERTS_PROC_LOCK_STATUS); -#ifdef ERTS_SMP +	erts_proc_lock(BIF_P, ERTS_PROC_LOCK_LINK|ERTS_PROC_LOCK_STATUS);  	if (ERTS_PROC_PENDING_EXIT(BIF_P))  	    goto handle_pending_exit; -#endif  	l = erts_remove_link(&ERTS_P_LINKS(BIF_P), BIF_ARG_1); -	erts_smp_proc_unlock(BIF_P, +	erts_proc_unlock(BIF_P,  			     ERTS_PROC_LOCK_LINK|ERTS_PROC_LOCK_STATUS);  	if (l) @@ -1218,21 +1175,14 @@ BIF_RETTYPE unlink_1(BIF_ALIST_1)  	    BIF_RET(am_true);  	} -	code = erts_dsig_prepare(&dsd, dep, BIF_P, ERTS_DSP_NO_LOCK, 0); +	code = erts_dsig_prepare(&dsd, dep, BIF_P, ERTS_PROC_LOCK_MAIN, +				 ERTS_DSP_NO_LOCK, 0, 0);  	switch (code) {  	case ERTS_DSIG_PREP_NOT_ALIVE:  	case ERTS_DSIG_PREP_NOT_CONNECTED: -#if 1  	    BIF_RET(am_true); -#else -	    /* -	     * This is how we used to do it, but the link is obviously not -	     * active, so I see no point in setting up a connection. -	     * /Rickard -	     */ -	    BIF_TRAP1(dunlink_trap, BIF_P, BIF_ARG_1); -#endif +	case ERTS_DSIG_PREP_PENDING:  	case ERTS_DSIG_PREP_CONNECTED:  	    erts_remove_dist_link(&dld, BIF_P->common.id, BIF_ARG_1, dep);  	    code = erts_dsig_send_unlink(&dsd, BIF_P->common.id, BIF_ARG_1); @@ -1249,7 +1199,7 @@ BIF_RETTYPE unlink_1(BIF_ALIST_1)      /* Internal pid... */ -    erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCK_LINK|ERTS_PROC_LOCK_STATUS); +    erts_proc_lock(BIF_P, ERTS_PROC_LOCK_LINK|ERTS_PROC_LOCK_STATUS);      cp_locks |= ERTS_PROC_LOCK_LINK|ERTS_PROC_LOCK_STATUS; @@ -1258,13 +1208,11 @@ BIF_RETTYPE unlink_1(BIF_ALIST_1)  			   BIF_ARG_1, ERTS_PROC_LOCK_LINK,  			   ERTS_P2P_FLG_ALLOW_OTHER_X); -#ifdef ERTS_SMP      if (ERTS_PROC_PENDING_EXIT(BIF_P)) {  	if (rp && rp != BIF_P) -	    erts_smp_proc_unlock(rp, ERTS_PROC_LOCK_LINK); +	    erts_proc_unlock(rp, ERTS_PROC_LOCK_LINK);  	goto handle_pending_exit;      } -#endif      /* unlink and ignore errors */      l = erts_remove_link(&ERTS_P_LINKS(BIF_P), BIF_ARG_1); @@ -1272,7 +1220,7 @@ BIF_RETTYPE unlink_1(BIF_ALIST_1)  	erts_destroy_link(l);      if (!rp) { -	ERTS_SMP_ASSERT_IS_NOT_EXITING(BIF_P); +	ERTS_ASSERT_IS_NOT_EXITING(BIF_P);      }      else {  	rl = erts_remove_link(&ERTS_P_LINKS(rp), BIF_P->common.id); @@ -1280,29 +1228,27 @@ BIF_RETTYPE unlink_1(BIF_ALIST_1)  	    erts_destroy_link(rl);  	if (IS_TRACED_FL(rp, F_TRACE_PROCS) && rl != NULL) { -            erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_STATUS); +            erts_proc_unlock(BIF_P, ERTS_PROC_LOCK_STATUS);              cp_locks &= ~ERTS_PROC_LOCK_STATUS;  	    trace_proc(BIF_P, (ERTS_PROC_LOCK_MAIN | ERTS_PROC_LOCK_LINK),                         rp, am_getting_unlinked, BIF_P->common.id);  	}  	if (rp != BIF_P) -	    erts_smp_proc_unlock(rp, ERTS_PROC_LOCK_LINK); +	    erts_proc_unlock(rp, ERTS_PROC_LOCK_LINK);      } -    erts_smp_proc_unlock(BIF_P, cp_locks & ~ERTS_PROC_LOCK_MAIN); +    erts_proc_unlock(BIF_P, cp_locks & ~ERTS_PROC_LOCK_MAIN);      BIF_RET(am_true); -#ifdef ERTS_SMP   handle_pending_exit:      erts_handle_pending_exit(BIF_P, (ERTS_PROC_LOCK_MAIN  				     | ERTS_PROC_LOCK_LINK  				     | ERTS_PROC_LOCK_STATUS));      ASSERT(ERTS_PROC_IS_EXITING(BIF_P));  -    erts_smp_proc_unlock(BIF_P,	ERTS_PROC_LOCK_LINK|ERTS_PROC_LOCK_STATUS); +    erts_proc_unlock(BIF_P,	ERTS_PROC_LOCK_LINK|ERTS_PROC_LOCK_STATUS);      ERTS_BIF_EXITED(BIF_P); -#endif  }  BIF_RETTYPE hibernate_3(BIF_ALIST_3) @@ -1314,7 +1260,11 @@ BIF_RETTYPE hibernate_3(BIF_ALIST_3)       */      Eterm reg[3]; -    if (erts_hibernate(BIF_P, BIF_ARG_1, BIF_ARG_2, BIF_ARG_3, reg)) { +    reg[0] = BIF_ARG_1; +    reg[1] = BIF_ARG_2; +    reg[2] = BIF_ARG_3; + +    if (erts_hibernate(BIF_P, reg)) {          /*           * If hibernate succeeded, TRAP. The process will be wait in a           * hibernated state if its state is inactive (!ERTS_PSFLG_ACTIVE); @@ -1605,22 +1555,24 @@ BIF_RETTYPE exit_2(BIF_ALIST_2)  	 DistEntry *dep;  	 dep = external_pid_dist_entry(BIF_ARG_1); +	 ERTS_ASSERT(dep);  	 if(dep == erts_this_dist_entry)  	     BIF_RET(am_true); -	 code = erts_dsig_prepare(&dsd, dep, BIF_P, ERTS_DSP_NO_LOCK, 0); +	 code = erts_dsig_prepare(&dsd, dep, BIF_P, ERTS_PROC_LOCK_MAIN, +				  ERTS_DSP_NO_LOCK, 0, 1);  	 switch (code) {  	 case ERTS_DSIG_PREP_NOT_ALIVE:  	 case ERTS_DSIG_PREP_NOT_CONNECTED: -	     BIF_TRAP2(dexit_trap, BIF_P, BIF_ARG_1, BIF_ARG_2); +	     BIF_RET(am_true); +	 case ERTS_DSIG_PREP_PENDING:  	 case ERTS_DSIG_PREP_CONNECTED:  	     code = erts_dsig_send_exit2(&dsd, BIF_P->common.id, BIF_ARG_1, BIF_ARG_2);  	     if (code == ERTS_DSIG_SEND_YIELD)  		 ERTS_BIF_YIELD_RETURN(BIF_P, am_true);  	     BIF_RET(am_true);  	 default: -	     ASSERT(! "Invalid dsig prepare result"); -	     BIF_ERROR(BIF_P, EXC_INTERNAL_ERROR); +	     ERTS_ASSERT(! "Invalid dsig prepare result");  	 }       }       else if (is_not_internal_pid(BIF_ARG_1)) { @@ -1635,7 +1587,7 @@ BIF_RETTYPE exit_2(BIF_ALIST_2)  	 if (BIF_ARG_1 == BIF_P->common.id) {  	     rp_locks = ERTS_PROC_LOCKS_ALL;  	     rp = BIF_P; -	     erts_smp_proc_lock(rp, ERTS_PROC_LOCKS_ALL_MINOR); +	     erts_proc_lock(rp, ERTS_PROC_LOCKS_ALL_MINOR);  	 }  	 else {  	     rp_locks = ERTS_PROC_LOCKS_XSIG_SEND; @@ -1657,12 +1609,10 @@ BIF_RETTYPE exit_2(BIF_ALIST_2)  			       NIL,  			       NULL,  			       BIF_P == rp ? ERTS_XSIG_FLG_NO_IGN_NORMAL : 0); -#ifdef ERTS_SMP  	 if (rp == BIF_P)  	     rp_locks &= ~ERTS_PROC_LOCK_MAIN;  	 if (rp_locks) -	     erts_smp_proc_unlock(rp, rp_locks); -#endif +	     erts_proc_unlock(rp, rp_locks);  	 /*  	  * We may have exited ourselves and may have to take action.  	  */ @@ -1774,21 +1724,19 @@ BIF_RETTYPE process_flag_2(BIF_ALIST_2)  	*       true. For more info, see implementation of  	*       erts_send_exit_signal().  	*/ -       erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCKS_XSIG_SEND); +       erts_proc_lock(BIF_P, ERTS_PROC_LOCKS_XSIG_SEND);         if (trap_exit) -	   state = erts_smp_atomic32_read_bor_mb(&BIF_P->state, +	   state = erts_atomic32_read_bor_mb(&BIF_P->state,  						 ERTS_PSFLG_TRAP_EXIT);         else -	   state = erts_smp_atomic32_read_band_mb(&BIF_P->state, +	   state = erts_atomic32_read_band_mb(&BIF_P->state,  						  ~ERTS_PSFLG_TRAP_EXIT); -       erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCKS_XSIG_SEND); +       erts_proc_unlock(BIF_P, ERTS_PROC_LOCKS_XSIG_SEND); -#ifdef ERTS_SMP         if (state & ERTS_PSFLG_PENDING_EXIT) {  	   erts_handle_pending_exit(BIF_P, ERTS_PROC_LOCK_MAIN);  	   ERTS_BIF_EXITED(BIF_P);         } -#endif         old_value = (state & ERTS_PSFLG_TRAP_EXIT) ? am_true : am_false;         BIF_RET(old_value); @@ -1806,15 +1754,13 @@ BIF_RETTYPE process_flag_2(BIF_ALIST_2)         if (sched == 0) {  	   new = NULL; -	   state = erts_smp_atomic32_read_band_mb(&BIF_P->state, +	   state = erts_atomic32_read_band_mb(&BIF_P->state,  						  ~ERTS_PSFLG_BOUND);         }         else {  	   new = erts_schedid2runq(sched); -#ifdef ERTS_SMP  	   erts_atomic_set_nob(&BIF_P->run_queue, (erts_aint_t) new); -#endif -	   state = erts_smp_atomic32_read_bor_mb(&BIF_P->state, +	   state = erts_atomic32_read_bor_mb(&BIF_P->state,  						 ERTS_PSFLG_BOUND);         } @@ -1895,7 +1841,7 @@ BIF_RETTYPE process_flag_2(BIF_ALIST_2)         } else {  	   goto error;         } -       erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCKS_ALL_MINOR); +       erts_proc_lock(BIF_P, ERTS_PROC_LOCKS_ALL_MINOR);         old_value = (ERTS_TRACE_FLAGS(BIF_P) & F_SENSITIVE  		    ? am_true  		    : am_false); @@ -1904,7 +1850,7 @@ BIF_RETTYPE process_flag_2(BIF_ALIST_2)         } else {  	   ERTS_TRACE_FLAGS(BIF_P) &= ~F_SENSITIVE;         } -       erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCKS_ALL_MINOR); +       erts_proc_unlock(BIF_P, ERTS_PROC_LOCKS_ALL_MINOR);         /* make sure to bump all reds so that we get            rescheduled immediately so setting takes effect */         BIF_RET2(old_value, CONTEXT_REDS); @@ -1946,15 +1892,11 @@ BIF_RETTYPE process_flag_3(BIF_ALIST_3)     Process *rp;     Eterm res; -#ifdef ERTS_SMP     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_YIELD3(bif_export[BIF_process_flag_3], BIF_P,  		       BIF_ARG_1, BIF_ARG_2, BIF_ARG_3); -#else -   rp = erts_proc_lookup(BIF_ARG_1); -#endif     if (!rp)         BIF_ERROR(BIF_P, BADARG); @@ -1962,7 +1904,7 @@ BIF_RETTYPE process_flag_3(BIF_ALIST_3)     res = process_flag_aux(BIF_P, rp, BIF_ARG_2, BIF_ARG_3);     if (rp != BIF_P) -       erts_smp_proc_unlock(rp, ERTS_PROC_LOCK_MAIN); +       erts_proc_unlock(rp, ERTS_PROC_LOCK_MAIN);     return res;  } @@ -2034,7 +1976,7 @@ ebif_bang_2(BIF_ALIST_2)   * Send a message to Process, Port or Registered Process.   * Returns non-negative reduction bump or negative result code.   */ -#define SEND_TRAP		(-1) +#define SEND_NOCONNECT		(-1)  #define SEND_YIELD		(-2)  #define SEND_YIELD_RETURN	(-3)  #define SEND_BADARG		(-4) @@ -2050,19 +1992,22 @@ static Sint remote_send(Process *p, DistEntry *dep,  {      Sint res;      int code; -      ASSERT(is_atom(to) || is_external_pid(to)); -    code = erts_dsig_prepare(&ctx->dsd, dep, p, ERTS_DSP_NO_LOCK, !ctx->suspend); +    ctx->dep = dep; +    code = erts_dsig_prepare(&ctx->dsd, dep, p, ERTS_PROC_LOCK_MAIN, +			     ERTS_DSP_NO_LOCK, +			     !ctx->suspend, ctx->connect);      switch (code) {      case ERTS_DSIG_PREP_NOT_ALIVE:      case ERTS_DSIG_PREP_NOT_CONNECTED: -	res = SEND_TRAP; +	res = SEND_NOCONNECT;  	break;      case ERTS_DSIG_PREP_WOULD_SUSPEND:  	ASSERT(!ctx->suspend);  	res = SEND_YIELD;  	break; +    case ERTS_DSIG_PREP_PENDING:      case ERTS_DSIG_PREP_CONNECTED: {  	if (is_atom(to)) @@ -2239,6 +2184,7 @@ do_send(Process *p, Eterm to, Eterm msg, Eterm *refp, ErtsSendContext *ctx)  	}  	return ret_val;      } else if (is_tuple(to)) { /* Remote send */ +        int deref_dep = 0;  	int ret;  	tp = tuple_val(to);  	if (*tp != make_arityval(2)) @@ -2246,15 +2192,13 @@ do_send(Process *p, Eterm to, Eterm msg, Eterm *refp, ErtsSendContext *ctx)  	if (is_not_atom(tp[1]) || is_not_atom(tp[2]))  	    return SEND_BADARG; -	/* sysname_to_connected_dist_entry will return NULL if there -	   is no dist_entry or the dist_entry has no port, +	/* erts_find_dist_entry will return NULL if there is no dist_entry  	   but remote_send() will handle that. */ -	dep = erts_sysname_to_connected_dist_entry(tp[2]); +	dep = erts_find_dist_entry(tp[2]);  	if (dep == erts_this_dist_entry) {  	    Eterm id; -	    erts_deref_dist_entry(dep);  	    if (IS_TRACED_FL(p, F_TRACE_SEND))  		trace_send(p, to, msg);  	    if (ERTS_PROC_GET_SAVED_CALLS_BUF(p)) @@ -2275,15 +2219,20 @@ do_send(Process *p, Eterm to, Eterm msg, Eterm *refp, ErtsSendContext *ctx)  	    }  	    return 0;  	} +        if (dep == NULL) { +            dep = erts_find_or_insert_dist_entry(tp[2]); +            ASSERT(dep != erts_this_dist_entry); +            deref_dep = 1; +        } +	ctx->dsd.node = tp[2];  	ret = remote_send(p, dep, tp[1], to, msg, ctx); -	if (ret != SEND_YIELD_CONTINUE) { -	    if (dep) { -		erts_deref_dist_entry(dep); -	    } -	} else { -	    ctx->dep_to_deref = dep; +	if (ret == SEND_YIELD_CONTINUE) { +            erts_ref_dist_entry(ctx->dep); +            ctx->deref_dep = 1;  	} +        if (deref_dep) +            erts_deref_dist_entry(dep);  	return ret;      } else {  	if (IS_TRACED_FL(p, F_TRACE_SEND)) @@ -2296,17 +2245,15 @@ do_send(Process *p, Eterm to, Eterm msg, Eterm *refp, ErtsSendContext *ctx)   send_message: {  	ErtsProcLocks rp_locks = 0;  	Sint res; -#ifdef ERTS_SMP  	if (p == rp)  	    rp_locks |= ERTS_PROC_LOCK_MAIN; -#endif  	/* send to local process */  	res = erts_send_message(p, rp, &rp_locks, msg, 0);  	if (erts_use_sender_punish)  	    res *= 4;  	else  	    res = 0; -	erts_smp_proc_unlock(rp, +	erts_proc_unlock(rp,  			     p == rp  			     ? (rp_locks & ~ERTS_PROC_LOCK_MAIN)  			     : rp_locks); @@ -2325,7 +2272,6 @@ BIF_RETTYPE send_3(BIF_ALIST_3)      Eterm msg = BIF_ARG_2;      Eterm opts = BIF_ARG_3; -    int connect = !0;      Eterm l = opts;      Sint result; @@ -2336,14 +2282,15 @@ BIF_RETTYPE send_3(BIF_ALIST_3)      UseTmpHeap(sizeof(ErtsSendContext)/sizeof(Eterm), BIF_P);      ctx->suspend = !0; -    ctx->dep_to_deref = NULL; +    ctx->connect = !0; +    ctx->deref_dep = 0;      ctx->return_term = am_ok;      ctx->dss.reds = (Sint) (ERTS_BIF_REDS_LEFT(p) * TERM_TO_BINARY_LOOP_FACTOR);      ctx->dss.phase = ERTS_DSIG_SEND_PHASE_INIT;      while (is_list(l)) {  	if (CAR(list_val(l)) == am_noconnect) { -	    connect = 0; +	    ctx->connect = 0;  	} else if (CAR(list_val(l)) == am_nosuspend) {  	    ctx->suspend = 0;  	} else { @@ -2380,9 +2327,9 @@ BIF_RETTYPE send_3(BIF_ALIST_3)  	    goto yield_return;  	ERTS_BIF_PREP_RET(retval, am_ok);  	break; -    case SEND_TRAP: -	if (connect) { -	    ERTS_BIF_PREP_TRAP3(retval, dsend3_trap, p, to, msg, opts); +    case SEND_NOCONNECT: +	if (ctx->connect) { +	    ERTS_BIF_PREP_RET(retval, am_ok);  	} else {  	    ERTS_BIF_PREP_RET(retval, am_noconnect);  	} @@ -2486,7 +2433,8 @@ Eterm erl_send(Process *p, Eterm to, Eterm msg)      ref = NIL;  #endif      ctx->suspend = !0; -    ctx->dep_to_deref = NULL; +    ctx->connect = !0; +    ctx->deref_dep = 0;      ctx->return_term = msg;      ctx->dss.reds = (Sint) (ERTS_BIF_REDS_LEFT(p) * TERM_TO_BINARY_LOOP_FACTOR);      ctx->dss.phase = ERTS_DSIG_SEND_PHASE_INIT; @@ -2510,8 +2458,8 @@ Eterm erl_send(Process *p, Eterm to, Eterm msg)  	    goto yield_return;  	ERTS_BIF_PREP_RET(retval, msg);  	break; -    case SEND_TRAP: -	ERTS_BIF_PREP_TRAP2(retval, dsend2_trap, p, to, msg); +    case SEND_NOCONNECT: +	ERTS_BIF_PREP_RET(retval, msg);  	break;      case SEND_YIELD:  	ERTS_BIF_PREP_YIELD2(retval, bif_export[BIF_send_2], p, to, msg); @@ -4010,14 +3958,14 @@ BIF_RETTYPE halt_2(BIF_ALIST_2)  	    ERTS_BIF_YIELD2(bif_export[BIF_halt_2], BIF_P, am_undefined, am_undefined);  	}  	else { -	    erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN); +	    erts_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN);              erts_exit(pos_int_code, "");  	}      }      else if (ERTS_IS_ATOM_STR("abort", BIF_ARG_1)) {  	VERBOSE(DEBUG_SYSTEM,  		("System halted by BIF halt(%T, %T)\n", BIF_ARG_1, BIF_ARG_2)); -	erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN); +	erts_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN);  	erts_exit(ERTS_ABORT_EXIT, "");      }      else if (is_list(BIF_ARG_1) || BIF_ARG_1 == NIL) { @@ -4033,7 +3981,7 @@ BIF_RETTYPE halt_2(BIF_ALIST_2)  	halt_msg[written] = '\0';  	VERBOSE(DEBUG_SYSTEM,  		("System halted by BIF halt(%T, %T)\n", BIF_ARG_1, BIF_ARG_2)); -	erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN); +	erts_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN);  	erts_exit(ERTS_DUMP_EXIT, "%s\n", halt_msg);      }      else @@ -4219,7 +4167,6 @@ BIF_RETTYPE list_to_pid_1(BIF_ALIST_1)  	goto bad;      if(dep == erts_this_dist_entry) { -	erts_deref_dist_entry(dep);  	BIF_RET(make_internal_pid(make_pid_data(c, b)));      }      else { @@ -4239,13 +4186,10 @@ BIF_RETTYPE list_to_pid_1(BIF_ALIST_1)        etp->data.ui[0] = make_pid_data(c, b);        MSO(BIF_P).first = (struct erl_off_heap_header*) etp; -      erts_deref_dist_entry(dep);        BIF_RET(make_external_pid(etp));      }   bad: -    if (dep) -	erts_deref_dist_entry(dep);      if (buf)  	erts_free(ERTS_ALC_T_TMP, (void *) buf);      BIF_ERROR(BIF_P, BADARG); @@ -4278,7 +4222,7 @@ BIF_RETTYPE list_to_port_1(BIF_ALIST_1)      cp += 6; /* strlen("#Port<") */ -    if (sscanf(cp, "%u.%u>", &n, &p) < 2) +    if (sscanf(cp, "%u.%u>", (unsigned int*)&n, (unsigned int*)&p) < 2)          goto bad;      if (p > ERTS_MAX_PORT_NUMBER) @@ -4290,7 +4234,6 @@ BIF_RETTYPE list_to_port_1(BIF_ALIST_1)  	goto bad;      if(dep == erts_this_dist_entry) { -	erts_deref_dist_entry(dep);  	BIF_RET(make_internal_port(p));      }      else { @@ -4310,13 +4253,10 @@ BIF_RETTYPE list_to_port_1(BIF_ALIST_1)        etp->data.ui[0] = p;        MSO(BIF_P).first = (struct erl_off_heap_header*) etp; -      erts_deref_dist_entry(dep);        BIF_RET(make_external_port(etp));      }   bad: -    if (dep) -	erts_deref_dist_entry(dep);      BIF_ERROR(BIF_P, BADARG);  } @@ -4436,12 +4376,9 @@ BIF_RETTYPE list_to_ref_1(BIF_ALIST_1)        res = make_external_ref(etp);      } -    erts_deref_dist_entry(dep);      BIF_RET(res);   bad: -    if (dep) -	erts_deref_dist_entry(dep);      BIF_ERROR(BIF_P, BADARG);  } @@ -4469,23 +4406,24 @@ BIF_RETTYPE group_leader_2(BIF_ALIST_2)  	int code;  	ErtsDSigData dsd;  	dep = external_pid_dist_entry(BIF_ARG_2); +	ERTS_ASSERT(dep);  	if(dep == erts_this_dist_entry)  	    BIF_ERROR(BIF_P, BADARG); -	code = erts_dsig_prepare(&dsd, dep, BIF_P, ERTS_DSP_NO_LOCK, 0); +	code = erts_dsig_prepare(&dsd, dep, BIF_P, ERTS_PROC_LOCK_MAIN, +				 ERTS_DSP_NO_LOCK, 0, 1);  	switch (code) {  	case ERTS_DSIG_PREP_NOT_ALIVE: -	    BIF_RET(am_true);  	case ERTS_DSIG_PREP_NOT_CONNECTED: -	    BIF_TRAP2(dgroup_leader_trap, BIF_P, BIF_ARG_1, BIF_ARG_2); +	    BIF_RET(am_true); +	case ERTS_DSIG_PREP_PENDING:  	case ERTS_DSIG_PREP_CONNECTED:  	    code = erts_dsig_send_group_leader(&dsd, BIF_ARG_1, BIF_ARG_2);  	    if (code == ERTS_DSIG_SEND_YIELD)  		ERTS_BIF_YIELD_RETURN(BIF_P, am_true);  	    BIF_RET(am_true);  	default: -	    ASSERT(! "Invalid dsig prepare result"); -	    BIF_ERROR(BIF_P, EXC_INTERNAL_ERROR); +	    ERTS_ASSERT(! "Invalid dsig prepare result");  	}      }      else if (is_internal_pid(BIF_ARG_2)) { @@ -4507,9 +4445,9 @@ BIF_RETTYPE group_leader_2(BIF_ALIST_2)  		new_member->group_leader = BIF_ARG_1;  	    else {  		locks &= ~ERTS_PROC_LOCK_STATUS; -		erts_smp_proc_unlock(new_member, ERTS_PROC_LOCK_STATUS); +		erts_proc_unlock(new_member, ERTS_PROC_LOCK_STATUS);  		if (new_member == BIF_P -		    || !(erts_smp_atomic32_read_nob(&new_member->state) +		    || !(erts_atomic32_read_nob(&new_member->state)  			 & ERTS_PSFLG_DIRTY_RUNNING)) {  		    new_member->group_leader = STORE_NC_IN_PROC(new_member,  								BIF_ARG_1); @@ -4538,7 +4476,7 @@ BIF_RETTYPE group_leader_2(BIF_ALIST_2)  	if (new_member == BIF_P)  	    locks &= ~ERTS_PROC_LOCK_MAIN;  	if (locks) -	    erts_smp_proc_unlock(new_member, locks); +	    erts_proc_unlock(new_member, locks);  	if (await_x) {  	    /* Wait for new_member to terminate; then badarg */ @@ -4557,7 +4495,7 @@ BIF_RETTYPE group_leader_2(BIF_ALIST_2)  	BIF_ERROR(BIF_P, BADARG);      }  } -     +  BIF_RETTYPE system_flag_2(BIF_ALIST_2)      {      Sint n; @@ -4565,9 +4503,6 @@ BIF_RETTYPE system_flag_2(BIF_ALIST_2)      if (BIF_ARG_1 == am_multi_scheduling) {  	if (BIF_ARG_2 == am_block || BIF_ARG_2 == am_unblock  	    || BIF_ARG_2 == am_block_normal || BIF_ARG_2 == am_unblock_normal) { -#ifndef ERTS_SMP -	    BIF_RET(am_disabled); -#else  	    int block = (BIF_ARG_2 == am_block  			 || BIF_ARG_2 == am_block_normal);  	    int normal = (BIF_ARG_2 == am_block_normal @@ -4603,15 +4538,8 @@ BIF_RETTYPE system_flag_2(BIF_ALIST_2)                  BIF_ERROR(BIF_P, EXC_INTERNAL_ERROR);                  break;              } -#endif  	}      } else if (BIF_ARG_1 == am_schedulers_online) { -#ifndef ERTS_SMP -	if (BIF_ARG_2 != make_small(1)) -	    goto error; -	else -	    BIF_RET(make_small(1)); -#else  	Sint old_no;  	if (!is_small(BIF_ARG_2))  	    goto error; @@ -4635,7 +4563,6 @@ BIF_RETTYPE system_flag_2(BIF_ALIST_2)  	    BIF_ERROR(BIF_P, EXC_INTERNAL_ERROR);  	    break;  	} -#endif      } else if (BIF_ARG_1 == am_fullsweep_after) {  	Uint16 nval;  	Uint oval; @@ -4643,7 +4570,7 @@ BIF_RETTYPE system_flag_2(BIF_ALIST_2)  	    goto error;  	}  	nval = (n > (Sint) ((Uint16) -1)) ? ((Uint16) -1) : ((Uint16) n); -	oval = (Uint) erts_smp_atomic32_xchg_nob(&erts_max_gen_gcs, +	oval = (Uint) erts_atomic32_xchg_nob(&erts_max_gen_gcs,  						 (erts_aint32_t) nval);  	BIF_RET(make_small(oval));      } else if (BIF_ARG_1 == am_min_heap_size) { @@ -4653,13 +4580,13 @@ BIF_RETTYPE system_flag_2(BIF_ALIST_2)  	    goto error;  	} -	erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN); -	erts_smp_thr_progress_block(); +	erts_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN); +	erts_thr_progress_block();  	H_MIN_SIZE = erts_next_heap_size(n, 0); -	erts_smp_thr_progress_unblock(); -	erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCK_MAIN); +	erts_thr_progress_unblock(); +	erts_proc_lock(BIF_P, ERTS_PROC_LOCK_MAIN);  	BIF_RET(make_small(oval));      } else if (BIF_ARG_1 == am_min_bin_vheap_size) { @@ -4669,13 +4596,13 @@ BIF_RETTYPE system_flag_2(BIF_ALIST_2)  	    goto error;  	} -	erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN); -	erts_smp_thr_progress_block(); +	erts_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN); +	erts_thr_progress_block();  	BIN_VH_MIN_SIZE = erts_next_heap_size(n, 0); -	erts_smp_thr_progress_unblock(); -	erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCK_MAIN); +	erts_thr_progress_unblock(); +	erts_proc_lock(BIF_P, ERTS_PROC_LOCK_MAIN);  	BIF_RET(make_small(oval));      } else if (BIF_ARG_1 == am_max_heap_size) { @@ -4693,14 +4620,14 @@ BIF_RETTYPE system_flag_2(BIF_ALIST_2)          hp = HAlloc(BIF_P, sz);          old_value = erts_max_heap_size_map(H_MAX_SIZE, H_MAX_FLAGS, &hp, NULL); -        erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN); -        erts_smp_thr_progress_block(); +        erts_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN); +        erts_thr_progress_block();          H_MAX_SIZE = max_heap_size;          H_MAX_FLAGS = max_heap_flags; -        erts_smp_thr_progress_unblock(); -        erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCK_MAIN); +        erts_thr_progress_unblock(); +        erts_proc_lock(BIF_P, ERTS_PROC_LOCK_MAIN);          BIF_RET(old_value);      } else if (BIF_ARG_1 == am_display_items) { @@ -4754,8 +4681,8 @@ BIF_RETTYPE system_flag_2(BIF_ALIST_2)      } else if (BIF_ARG_1 == make_small(1)) {  	int i, max;  	ErtsMessage* mp; -	erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN); -	erts_smp_thr_progress_block(); +	erts_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN); +	erts_thr_progress_block();  	max = erts_ptab_max(&erts_proc);  	for (i = 0; i < max; i++) { @@ -4768,7 +4695,7 @@ BIF_RETTYPE system_flag_2(BIF_ALIST_2)  #endif  		p->seq_trace_clock = 0;  		p->seq_trace_lastcnt = 0; -		ERTS_SMP_MSGQ_MV_INQ2PRIVQ(p); +		ERTS_MSGQ_MV_INQ2PRIVQ(p);  		mp = p->msg.first;  		while(mp != NULL) {  #ifdef USE_VM_PROBES @@ -4781,23 +4708,14 @@ BIF_RETTYPE system_flag_2(BIF_ALIST_2)  	    }  	} -	erts_smp_thr_progress_unblock(); -	erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCK_MAIN); +	erts_thr_progress_unblock(); +	erts_proc_lock(BIF_P, ERTS_PROC_LOCK_MAIN);  	BIF_RET(am_true);      } else if (BIF_ARG_1 == am_scheduler_wall_time) { -	if (BIF_ARG_2 == am_true || BIF_ARG_2 == am_false) { -	    erts_aint32_t new = BIF_ARG_2 == am_true ? 1 : 0; -	    erts_aint32_t old = erts_smp_atomic32_xchg_nob(&sched_wall_time, -							   new); -	    Eterm ref = erts_sched_wall_time_request(BIF_P, 1, new, 0, 0); -	    ASSERT(is_value(ref)); -	    BIF_TRAP2(await_sched_wall_time_mod_trap, -		      BIF_P, -		      ref, -		      old ? am_true : am_false); -	} -#if defined(ERTS_SMP) && defined(ERTS_DIRTY_SCHEDULERS) +	if (BIF_ARG_2 == am_true || BIF_ARG_2 == am_false) +            BIF_TRAP1(system_flag_scheduler_wall_time_trap, +                      BIF_P, BIF_ARG_2);      } else if (BIF_ARG_1 == am_dirty_cpu_schedulers_online) {  	Sint old_no;  	if (!is_small(BIF_ARG_2)) @@ -4823,13 +4741,12 @@ BIF_RETTYPE system_flag_2(BIF_ALIST_2)  	    BIF_ERROR(BIF_P, EXC_INTERNAL_ERROR);  	    break;  	} -#endif      } else if (BIF_ARG_1 == am_time_offset  	       && ERTS_IS_ATOM_STR("finalize", BIF_ARG_2)) {  	ErtsTimeOffsetState res; -	erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN); +	erts_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN);  	res = erts_finalize_time_offset(); -        erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCK_MAIN); +        erts_proc_lock(BIF_P, ERTS_PROC_LOCK_MAIN);  	switch (res) {  	case ERTS_TIME_OFFSET_PRELIMINARY: {  	    DECL_AM(preliminary); @@ -4851,7 +4768,7 @@ BIF_RETTYPE system_flag_2(BIF_ALIST_2)        Eterm threads;        if (BIF_ARG_2 == am_true || BIF_ARG_2 == am_false) {          erts_aint32_t new = BIF_ARG_2 == am_true ? ERTS_MSACC_ENABLE : ERTS_MSACC_DISABLE; -	erts_aint32_t old = erts_smp_atomic32_xchg_nob(&msacc, new); +	erts_aint32_t old = erts_atomic32_xchg_nob(&msacc, new);  	Eterm ref = erts_msacc_request(BIF_P, new, &threads);          if (is_non_value(ref))              BIF_RET(old ? am_true : am_false); @@ -4862,7 +4779,7 @@ BIF_RETTYPE system_flag_2(BIF_ALIST_2)  		  threads);        } else if (BIF_ARG_2 == am_reset) {  	Eterm ref = erts_msacc_request(BIF_P, ERTS_MSACC_RESET, &threads); -	erts_aint32_t old = erts_smp_atomic32_read_nob(&msacc); +	erts_aint32_t old = erts_atomic32_read_nob(&msacc);  	ASSERT(is_value(ref));  	BIF_TRAP3(await_msacc_mod_trap,  		  BIF_P, @@ -4881,9 +4798,9 @@ BIF_RETTYPE system_flag_2(BIF_ALIST_2)  	    what = ERTS_SCHED_STAT_MODIFY_CLEAR;  	else  	    goto error; -	erts_smp_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN); +	erts_proc_unlock(BIF_P, ERTS_PROC_LOCK_MAIN);  	erts_sched_stat_modify(what); -	erts_smp_proc_lock(BIF_P, ERTS_PROC_LOCK_MAIN); +	erts_proc_lock(BIF_P, ERTS_PROC_LOCK_MAIN);  	BIF_RET(am_true);      } else if (ERTS_IS_ATOM_STR("internal_cpu_topology", BIF_ARG_1)) {  	Eterm res = erts_set_cpu_topology(BIF_P, BIF_ARG_2); @@ -4910,6 +4827,17 @@ BIF_RETTYPE system_flag_2(BIF_ALIST_2)      BIF_ERROR(BIF_P, BADARG);  } +BIF_RETTYPE erts_internal_scheduler_wall_time_1(BIF_ALIST_1) +{ +    erts_aint32_t new = BIF_ARG_1 == am_true ? 1 : 0; +    erts_aint32_t old = erts_atomic32_xchg_nob(&sched_wall_time, +                                               new); +    Eterm ref = erts_sched_wall_time_request(BIF_P, 1, new, 0, 0); +    ASSERT(is_value(ref)); +    BIF_TRAP2(await_sched_wall_time_mod_trap, +              BIF_P, ref, old ? am_true : am_false); +} +  /**********************************************************************/  BIF_RETTYPE phash_2(BIF_ALIST_2) @@ -5021,7 +4949,6 @@ static BIF_RETTYPE bif_return_trap(BIF_ALIST_2)      Eterm res = BIF_ARG_1;      switch (BIF_ARG_2) { -#ifdef ERTS_SMP      case am_multi_scheduling: {  	int msb = erts_is_multi_scheduling_blocked();  	if (msb > 0) @@ -5032,7 +4959,6 @@ static BIF_RETTYPE bif_return_trap(BIF_ALIST_2)  	    ERTS_INTERNAL_ERROR("Unexpected multi scheduling block state");  	break;      } -#endif      default:  	break;      } @@ -5057,22 +4983,22 @@ static ERTS_INLINE int  skip_current_msgq(Process *c_p)  {      int res; -#if defined(ERTS_ENABLE_LOCK_CHECK) && defined(ERTS_SMP) +#if defined(ERTS_ENABLE_LOCK_CHECK)      erts_proc_lc_chk_only_proc_main(c_p);  #endif -    erts_smp_proc_lock(c_p, ERTS_PROC_LOCKS_MSG_RECEIVE); +    erts_proc_lock(c_p, ERTS_PROC_LOCKS_MSG_RECEIVE);      if (ERTS_PROC_PENDING_EXIT(c_p)) {  	KILL_CATCHES(c_p);  	c_p->freason = EXC_EXIT;  	res = 0;      }      else { -        ERTS_SMP_MSGQ_MV_INQ2PRIVQ(c_p); +        ERTS_MSGQ_MV_INQ2PRIVQ(c_p);  	c_p->msg.save = c_p->msg.last;  	res = 1;      } -    erts_smp_proc_unlock(c_p, ERTS_PROC_LOCKS_MSG_RECEIVE); +    erts_proc_unlock(c_p, ERTS_PROC_LOCKS_MSG_RECEIVE);      return res;  } @@ -5131,7 +5057,7 @@ void erts_init_trap_export(Export* ep, Eterm m, Eterm f, Uint a,      ep->info.mfa.module = m;      ep->info.mfa.function = f;      ep->info.mfa.arity = a; -    ep->beam[0] = (BeamInstr) em_apply_bif; +    ep->beam[0] = BeamOpCodeAddr(op_apply_bif);      ep->beam[1] = (BeamInstr) bif;  } @@ -5170,13 +5096,15 @@ void erts_init_bif(void)      await_proc_exit_trap = erts_export_put(am_erlang,am_await_proc_exit,3);      await_port_send_result_trap  	= erts_export_put(am_erts_internal, am_await_port_send_result, 3); +    system_flag_scheduler_wall_time_trap +        = erts_export_put(am_erts_internal, am_system_flag_scheduler_wall_time, 1);      await_sched_wall_time_mod_trap -        = erts_export_put(am_erlang, am_await_sched_wall_time_modifications, 2); +        = erts_export_put(am_erts_internal, am_await_sched_wall_time_modifications, 2);      await_msacc_mod_trap  	= erts_export_put(am_erts_internal, am_await_microstate_accounting_modifications, 3); -    erts_smp_atomic32_init_nob(&sched_wall_time, 0); -    erts_smp_atomic32_init_nob(&msacc, ERTS_MSACC_IS_ENABLED()); +    erts_atomic32_init_nob(&sched_wall_time, 0); +    erts_atomic32_init_nob(&msacc, ERTS_MSACC_IS_ENABLED());  }  /* @@ -5194,15 +5122,14 @@ schedule(Process *c_p, Process *dirty_shadow_proc,  	 Eterm module, Eterm function,  	 int argc, Eterm *argv)  { -    ERTS_SMP_LC_ASSERT(ERTS_PROC_LOCK_MAIN & erts_proc_lc_my_proc_locks(c_p)); +    ERTS_LC_ASSERT(ERTS_PROC_LOCK_MAIN & erts_proc_lc_my_proc_locks(c_p));      (void) erts_nif_export_schedule(c_p, dirty_shadow_proc, -				    mfa, pc, (BeamInstr) em_apply_bif, +				    mfa, pc, BeamOpCodeAddr(op_apply_bif),  				    dfunc, ifunc,  				    module, function,  				    argc, argv);  } -#ifdef ERTS_DIRTY_SCHEDULERS  static BIF_RETTYPE dirty_bif_result(BIF_ALIST_1)  { @@ -5245,9 +5172,7 @@ static BIF_RETTYPE dirty_bif_exception(BIF_ALIST_2)      BIF_ERROR(BIF_P, freason);  } -#endif /* ERTS_DIRTY_SCHEDULERS */ -extern BeamInstr* em_call_bif_e;  static BIF_RETTYPE call_bif(Process *c_p, Eterm *reg, BeamInstr *I);  BIF_RETTYPE @@ -5263,15 +5188,13 @@ erts_schedule_bif(Process *proc,      Process *c_p, *dirty_shadow_proc;      ErtsCodeMFA *mfa; -#ifdef ERTS_DIRTY_SCHEDULERS      if (proc->static_flags & ERTS_STC_FLG_SHADOW_PROC) {  	dirty_shadow_proc = proc;  	c_p = proc->next;  	ASSERT(c_p->common.id == dirty_shadow_proc->common.id); -	erts_smp_proc_lock(c_p, ERTS_PROC_LOCK_MAIN); +	erts_proc_lock(c_p, ERTS_PROC_LOCK_MAIN);      }      else -#endif      {  	dirty_shadow_proc = NULL;  	c_p = proc; @@ -5287,7 +5210,6 @@ erts_schedule_bif(Process *proc,  	 * ibif - indirect bif  	 */ -#ifdef ERTS_DIRTY_SCHEDULERS  	erts_aint32_t set, mask;  	mask = (ERTS_PSFLG_DIRTY_CPU_PROC  		| ERTS_PSFLG_DIRTY_IO_PROC); @@ -5310,11 +5232,7 @@ erts_schedule_bif(Process *proc,  	    break;  	} -	(void) erts_smp_atomic32_read_bset_nob(&c_p->state, mask, set); -#else -	dbif = call_bif; -	ibif = bif; -#endif +	(void) erts_atomic32_read_bset_nob(&c_p->state, mask, set);  	if (i == NULL) {  	    ERTS_INTERNAL_ERROR("Missing instruction pointer"); @@ -5327,13 +5245,13 @@ erts_schedule_bif(Process *proc,  	    mfa = &exp->info.mfa;  	}  #endif -	else if (em_call_bif_e == (BeamInstr *) *i) { +	else if (BeamIsOpCode(*i, op_call_bif_e)) {  	    /* Pointer to bif export in i+1 */  	    exp = (Export *) i[1];  	    pc = i;  	    mfa = &exp->info.mfa;  	} -	else if (em_apply_bif == (BeamInstr *) *i) { +	else if (BeamIsOpCode(*i, op_apply_bif)) {  	    /* Pointer to bif in i+1, and mfa in i-3 */	      	    pc = c_p->cp;  	    mfa = erts_code_to_codemfa(i); @@ -5355,7 +5273,7 @@ erts_schedule_bif(Process *proc,      }      if (dirty_shadow_proc) -	erts_smp_proc_unlock(c_p, ERTS_PROC_LOCK_MAIN); +	erts_proc_unlock(c_p, ERTS_PROC_LOCK_MAIN);      return THE_NON_VALUE;  } @@ -5390,7 +5308,6 @@ call_bif(Process *c_p, Eterm *reg, BeamInstr *I)      return ret;  } -#ifdef ERTS_DIRTY_SCHEDULERS  int  erts_call_dirty_bif(ErtsSchedulerData *esdp, Process *c_p, BeamInstr *I, Eterm *reg) @@ -5405,7 +5322,7 @@ erts_call_dirty_bif(ErtsSchedulerData *esdp, Process *c_p, BeamInstr *I, Eterm *      erts_aint32_t state;      ASSERT(!c_p->scheduler_data); -    state = erts_smp_atomic32_read_nob(&c_p->state); +    state = erts_atomic32_read_nob(&c_p->state);      ASSERT((state & ERTS_PSFLG_DIRTY_RUNNING)  	   && !(state & (ERTS_PSFLG_RUNNING|ERTS_PSFLG_RUNNING_SYS)));      ASSERT(esdp); @@ -5419,7 +5336,7 @@ erts_call_dirty_bif(ErtsSchedulerData *esdp, Process *c_p, BeamInstr *I, Eterm *      bf = (ErtsBifFunc) I[1]; -    erts_smp_atomic32_read_band_mb(&c_p->state, ~(ERTS_PSFLG_DIRTY_CPU_PROC +    erts_atomic32_read_band_mb(&c_p->state, ~(ERTS_PSFLG_DIRTY_CPU_PROC  						  | ERTS_PSFLG_DIRTY_IO_PROC));      dirty_shadow_proc = erts_make_dirty_shadow_proc(esdp, c_p); @@ -5434,11 +5351,11 @@ erts_call_dirty_bif(ErtsSchedulerData *esdp, Process *c_p, BeamInstr *I, Eterm *      c_p_htop = c_p->htop;  #endif -    erts_smp_proc_unlock(c_p, ERTS_PROC_LOCK_MAIN); +    erts_proc_unlock(c_p, ERTS_PROC_LOCK_MAIN);      result = (*bf)(dirty_shadow_proc, reg, I); -    erts_smp_proc_lock(c_p, ERTS_PROC_LOCK_MAIN); +    erts_proc_lock(c_p, ERTS_PROC_LOCK_MAIN);      ASSERT(c_p_htop == c_p->htop);      ASSERT(dirty_shadow_proc->static_flags & ERTS_STC_FLG_SHADOW_PROC); @@ -5461,7 +5378,7 @@ erts_call_dirty_bif(ErtsSchedulerData *esdp, Process *c_p, BeamInstr *I, Eterm *  	}  	else if (nep->func == ERTS_SCHED_BIF_TRAP_MARKER) {  	    /* Dirty BIF did an ordinary trap... */ -	    ASSERT(!(erts_smp_atomic32_read_nob(&c_p->state) +	    ASSERT(!(erts_atomic32_read_nob(&c_p->state)  		     & (ERTS_PSFLG_DIRTY_CPU_PROC|ERTS_PSFLG_DIRTY_IO_PROC)));  	    schedule(c_p, dirty_shadow_proc, NULL, NULL,  		     dirty_bif_trap, (void *) dirty_shadow_proc->i, @@ -5484,7 +5401,6 @@ erts_call_dirty_bif(ErtsSchedulerData *esdp, Process *c_p, BeamInstr *I, Eterm *      return exiting;  } -#endif /* ERTS_DIRTY_SCHEDULERS */  #ifdef HARDDEBUG | 
