minix/servers/sched/utility.c
2010-06-24 07:37:26 +00:00

84 lines
2.7 KiB
C

/* This file contains some utility routines for SCHED.
*
* The entry points are:
* no_sys: called for invalid system call numbers
* sched_isokendpt: check the validity of an endpoint
* sched_isemtyendpt check for validity and availability of endpoint slot
* is_from_pm check whether message is originated from PM
* nice_to_priority convert nice level to priority queue
*/
#include "sched.h"
#include <machine/archtypes.h>
#include <sys/resource.h> /* for PRIO_MAX & PRIO_MIN */
#include "kernel/proc.h" /* for queue constants */
#include "schedproc.h"
/*===========================================================================*
* no_sys *
*===========================================================================*/
PUBLIC int no_sys(int who_e, int call_nr)
{
/* A system call number not implemented by PM has been requested. */
printf("SCHED: in no_sys, call nr %d from %d\n", call_nr, who_e);
return(ENOSYS);
}
/*===========================================================================*
* sched_isokendpt *
*===========================================================================*/
PUBLIC int sched_isokendpt(int endpoint, int *proc)
{
*proc = _ENDPOINT_P(endpoint);
if (*proc < 0)
return (EBADEPT); /* Don't schedule tasks */
if(*proc >= NR_PROCS)
return (EINVAL);
if(endpoint != schedproc[*proc].endpoint)
return (EDEADEPT);
if(!(schedproc[*proc].flags & IN_USE))
return (EDEADEPT);
return (OK);
}
/*===========================================================================*
* sched_isemtyendpt *
*===========================================================================*/
PUBLIC int sched_isemtyendpt(int endpoint, int *proc)
{
*proc = _ENDPOINT_P(endpoint);
if (*proc < 0)
return (EBADEPT); /* Don't schedule tasks */
if(*proc >= NR_PROCS)
return (EINVAL);
if(schedproc[*proc].flags & IN_USE)
return (EDEADEPT);
return (OK);
}
/*===========================================================================*
* is_from_pm *
*===========================================================================*/
PUBLIC int is_from_pm(message *m_ptr)
{
if (m_ptr->m_source == PM_PROC_NR) {
return 1;
}
return 0;
}
/*===========================================================================*
* nice_to_priority *
*===========================================================================*/
PUBLIC int nice_to_priority(int nice, unsigned* new_q)
{
if (nice < PRIO_MIN || nice > PRIO_MAX) return(EINVAL);
*new_q = MAX_USER_Q + (nice-PRIO_MIN) * (MIN_USER_Q-MAX_USER_Q+1) /
(PRIO_MAX-PRIO_MIN+1);
if (*new_q < MAX_USER_Q) *new_q = MAX_USER_Q; /* shouldn't happen */
if (*new_q > MIN_USER_Q) *new_q = MIN_USER_Q; /* shouldn't happen */
return (OK);
}