/* Ordonnanceur de processus */
/* Copyright (C) 2008 Emmanuel Varoquaux
This file is part of XOS.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see . */
/* L'algorithme utilise ici est le round-robin de base.
* Tous les appels a sched doivent se faire interruptions desactivees. */
#include "proc_queue.h"
#include "idle.h"
#include "proc_struct.h"
#include
static struct proc_queue_struct proc_queue;
struct proc_struct *current;
static inline void switch_to(unsigned short tss_sel)
{
struct __attribute__ ((packed)) {
unsigned long off;
unsigned short sel;
} addr;
addr.sel = tss_sel;
task_switch(addr);
}
void sched_init()
{
proc_queue_init(&proc_queue);
current = idle;
}
/* Ajoute un processus dans la file des processus en cours d'execution.
* Le processus doit etre dans l'etat PS_RUNNING. */
void sched_add(struct proc_struct *proc)
{
proc_queue_push(&proc_queue, proc);
}
/* Enleve un processus de la file des processus en cours d'execution.
* Le processus doit etre dans l'etat PS_RUNNING. */
void sched_remove(struct proc_struct *proc)
{
proc_queue_remove(&proc_queue, proc);
}
void schedule()
{
struct proc_struct *next;
/* On essaie de ne pas reelire le processus courant. */
if (!(next = proc_queue_rotate(&proc_queue)))
next = idle;
else if (next == current)
next = proc_queue_rotate(&proc_queue);
if (next == current)
/* une commutation de contexte vers la tache courante est interdite */
return;
current = next;
switch_to(next->tss_sel);
}