int sam_remove_frlock(void *arg) { sam_schedule_entry_t *entry; entry = task_begin(arg); __sam_remove_frlock(entry); return (0); }
/* * task_change(task_t *, proc_t *) * * Overview * task_change() removes the specified process from its current task. The * process is then attached to the specified task. This routine is called * from settaskid() when process is being moved to a new task. * * Return values * None. * * Caller's context * pidlock and p_lock held across task_change() */ void task_change(task_t *newtk, proc_t *p) { task_t *oldtk = p->p_task; ASSERT(MUTEX_HELD(&pidlock)); ASSERT(MUTEX_HELD(&p->p_lock)); ASSERT(oldtk != NULL); ASSERT(oldtk->tk_memb_list != NULL); mutex_enter(&oldtk->tk_zone->zone_nlwps_lock); oldtk->tk_nlwps -= p->p_lwpcnt; oldtk->tk_nprocs--; mutex_exit(&oldtk->tk_zone->zone_nlwps_lock); mutex_enter(&newtk->tk_zone->zone_nlwps_lock); newtk->tk_nlwps += p->p_lwpcnt; newtk->tk_nprocs++; mutex_exit(&newtk->tk_zone->zone_nlwps_lock); task_detach(p); task_begin(newtk, p); exacct_move_mstate(p, oldtk, newtk); }