/*===========================================================================* * do_schedctl * *===========================================================================*/ PUBLIC int do_schedctl(struct proc * caller, message * m_ptr) { struct proc *p; unsigned flags; int priority, quantum, cpu; int proc_nr; int r; /* check parameter validity */ flags = (unsigned) m_ptr->SCHEDCTL_FLAGS; if (flags & ~SCHEDCTL_FLAG_KERNEL) { printf("do_schedctl: flags 0x%x invalid, caller=%d\n", flags, caller - proc); return EINVAL; } if (!isokendpt(m_ptr->SCHEDCTL_ENDPOINT, &proc_nr)) return EINVAL; p = proc_addr(proc_nr); if ((flags & SCHEDCTL_FLAG_KERNEL) == SCHEDCTL_FLAG_KERNEL) { /* the kernel becomes the scheduler and starts * scheduling the process. */ priority = (int) m_ptr->SCHEDCTL_PRIORITY; quantum = (int) m_ptr->SCHEDCTL_QUANTUM; cpu = (int) m_ptr->SCHEDCTL_CPU; /* Try to schedule the process. */ if((r = sched_proc(p, priority, quantum, cpu) != OK)) return r; p->p_scheduler = NULL; } else { /* the caller becomes the scheduler */ p->p_scheduler = caller; } return(OK); }
/*===========================================================================* * do_schedule * *===========================================================================*/ int do_schedule(struct proc * caller, message * m_ptr) { struct proc *p; int proc_nr; int priority, quantum, cpu; if (!isokendpt(m_ptr->SCHEDULING_ENDPOINT, &proc_nr)) return EINVAL; p = proc_addr(proc_nr); /* Only this process' scheduler can schedule it */ if (caller != p->p_scheduler) return(EPERM); /* Try to schedule the process. */ priority = (int) m_ptr->SCHEDULING_PRIORITY; quantum = (int) m_ptr->SCHEDULING_QUANTUM; cpu = (int) m_ptr->SCHEDULING_CPU; return sched_proc(p, priority, quantum, cpu); }
/*===========================================================================* * do_schedule * *===========================================================================*/ int do_schedule(struct proc * caller, message * m_ptr) { struct proc *p; int proc_nr; int priority, quantum, cpu, niced; if (!isokendpt(m_ptr->m_lsys_krn_schedule.endpoint, &proc_nr)) return EINVAL; p = proc_addr(proc_nr); /* Only this process' scheduler can schedule it */ if (caller != p->p_scheduler) return(EPERM); /* Try to schedule the process. */ priority = m_ptr->m_lsys_krn_schedule.priority; quantum = m_ptr->m_lsys_krn_schedule.quantum; cpu = m_ptr->m_lsys_krn_schedule.cpu; niced = !!(m_ptr->m_lsys_krn_schedule.niced); return sched_proc(p, priority, quantum, cpu, niced); }