]> Zhao Yanbai Git Server - minix.git/commitdiff
Opps, forgot to svn add these files
authorErik van der Kouwe <erik@minix3.org>
Thu, 1 Jul 2010 08:38:15 +0000 (08:38 +0000)
committerErik van der Kouwe <erik@minix3.org>
Thu, 1 Jul 2010 08:38:15 +0000 (08:38 +0000)
include/minix/sched.h [new file with mode: 0644]
lib/libsys/sched_start.c [new file with mode: 0644]
lib/libsys/sched_stop.c [new file with mode: 0644]

diff --git a/include/minix/sched.h b/include/minix/sched.h
new file mode 100644 (file)
index 0000000..6134f8a
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef _MINIX_SCHED_H
+#define _MINIX_SCHED_H
+
+#include <minix/ipc.h>
+
+_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 (file)
index 0000000..a617d35
--- /dev/null
@@ -0,0 +1,81 @@
+#include "syslib.h"
+#include <assert.h>
+#include <machine/archtypes.h>
+#include <timers.h>
+
+#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 (file)
index 0000000..d31b28d
--- /dev/null
@@ -0,0 +1,27 @@
+#include "syslib.h"
+#include <assert.h>
+
+/*===========================================================================*
+ *                             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);
+}