From 4690e8b0159c8972521618c7f2f0f56fb9aa3725 Mon Sep 17 00:00:00 2001 From: Erik van der Kouwe Date: Thu, 1 Jul 2010 08:38:15 +0000 Subject: [PATCH] Opps, forgot to svn add these files --- include/minix/sched.h | 14 +++++++ lib/libsys/sched_start.c | 81 ++++++++++++++++++++++++++++++++++++++++ lib/libsys/sched_stop.c | 27 ++++++++++++++ 3 files changed, 122 insertions(+) create mode 100644 include/minix/sched.h create mode 100644 lib/libsys/sched_start.c create mode 100644 lib/libsys/sched_stop.c diff --git a/include/minix/sched.h b/include/minix/sched.h new file mode 100644 index 000000000..6134f8a0c --- /dev/null +++ b/include/minix/sched.h @@ -0,0 +1,14 @@ +#ifndef _MINIX_SCHED_H +#define _MINIX_SCHED_H + +#include + +_PROTOTYPE(int sched_stop, (endpoint_t scheduler_e, endpoint_t schedulee_e)); +_PROTOTYPE(int sched_start, (endpoint_t scheduler_e, endpoint_t schedulee_e, + endpoint_t parent_e, unsigned maxprio, unsigned quantum, + endpoint_t *newscheduler_e)); +_PROTOTYPE(int sched_inherit, (endpoint_t scheduler_e, + endpoint_t schedulee_e, endpoint_t parent_e, unsigned maxprio, + endpoint_t *newscheduler_e)); + +#endif /* _MINIX_SCHED_H */ diff --git a/lib/libsys/sched_start.c b/lib/libsys/sched_start.c new file mode 100644 index 000000000..a617d350a --- /dev/null +++ b/lib/libsys/sched_start.c @@ -0,0 +1,81 @@ +#include "syslib.h" +#include +#include +#include + +#include "kernel/config.h" +#include "kernel/const.h" +#include "kernel/type.h" +#include "kernel/proc.h" + +/*===========================================================================* + * sched_inherit * + *===========================================================================*/ +PUBLIC int sched_inherit(endpoint_t scheduler_e, + endpoint_t schedulee_e, endpoint_t parent_e, unsigned maxprio, + endpoint_t *newscheduler_e) +{ + int rv; + message m; + + assert(_ENDPOINT_P(scheduler_e) >= 0); + assert(_ENDPOINT_P(schedulee_e) >= 0); + assert(_ENDPOINT_P(parent_e) >= 0); + assert(maxprio >= 0); + assert(maxprio < NR_SCHED_QUEUES); + assert(newscheduler_e); + + m.SCHEDULING_ENDPOINT = schedulee_e; + m.SCHEDULING_PARENT = parent_e; + m.SCHEDULING_MAXPRIO = (int) maxprio; + + /* Send the request to the scheduler */ + if ((rv = _taskcall(scheduler_e, SCHEDULING_INHERIT, &m))) { + return rv; + } + + /* Store the process' scheduler. Note that this might not be the + * scheduler we sent the SCHEDULING_INHERIT message to. That scheduler + * might have forwarded the scheduling message on to another scheduler + * before returning the message. + */ + *newscheduler_e = m.SCHEDULING_SCHEDULER; + return (OK); +} + +/*===========================================================================* + * sched_start * + *===========================================================================*/ +PUBLIC int sched_start(endpoint_t scheduler_e, endpoint_t schedulee_e, + endpoint_t parent_e, unsigned maxprio, unsigned quantum, + endpoint_t *newscheduler_e) +{ + int rv; + message m; + + assert(_ENDPOINT_P(scheduler_e) >= 0); + assert(_ENDPOINT_P(schedulee_e) >= 0); + assert(_ENDPOINT_P(parent_e) >= 0); + assert(maxprio >= 0); + assert(maxprio < NR_SCHED_QUEUES); + assert(quantum > 0); + assert(newscheduler_e); + + m.SCHEDULING_ENDPOINT = schedulee_e; + m.SCHEDULING_PARENT = parent_e; + m.SCHEDULING_MAXPRIO = (int) maxprio; + m.SCHEDULING_QUANTUM = (int) quantum; + + /* Send the request to the scheduler */ + if ((rv = _taskcall(scheduler_e, SCHEDULING_START, &m))) { + return rv; + } + + /* Store the process' scheduler. Note that this might not be the + * scheduler we sent the SCHEDULING_START message to. That scheduler + * might have forwarded the scheduling message on to another scheduler + * before returning the message. + */ + *newscheduler_e = m.SCHEDULING_SCHEDULER; + return (OK); +} diff --git a/lib/libsys/sched_stop.c b/lib/libsys/sched_stop.c new file mode 100644 index 000000000..d31b28dff --- /dev/null +++ b/lib/libsys/sched_stop.c @@ -0,0 +1,27 @@ +#include "syslib.h" +#include + +/*===========================================================================* + * sched_stop * + *===========================================================================*/ +PUBLIC int sched_stop(endpoint_t scheduler_e, endpoint_t schedulee_e) +{ + int rv; + message m; + + /* If the kernel is the scheduler, it will implicitly stop scheduling + * once another process takes over or the process terminates */ + if (scheduler_e == KERNEL || scheduler_e == NONE) + return(OK); + + /* User-scheduled, perform the call */ + assert(_ENDPOINT_P(scheduler_e) >= 0); + assert(_ENDPOINT_P(schedulee_e) >= 0); + + m.SCHEDULING_ENDPOINT = schedulee_e; + if ((rv = _taskcall(scheduler_e, SCHEDULING_STOP, &m))) { + return rv; + } + + return (OK); +} -- 2.44.0