#include "kernel/system.h" #include /*===========================================================================* * do_schedctl * *===========================================================================*/ int do_schedctl(struct proc * caller, message * m_ptr) { struct proc *p; uint32_t flags; int priority, quantum, cpu; int proc_nr; int r; /* check parameter validity */ flags = m_ptr->m_lsys_krn_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->m_lsys_krn_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 = m_ptr->m_lsys_krn_schedctl.priority; quantum = m_ptr->m_lsys_krn_schedctl.quantum; cpu = m_ptr->m_lsys_krn_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); }