first scheduler implementation
This commit is contained in:
@ -12,22 +12,25 @@
|
|||||||
#include "kernel/threads/Scheduler.h"
|
#include "kernel/threads/Scheduler.h"
|
||||||
#include "kernel/threads/IdleThread.h"
|
#include "kernel/threads/IdleThread.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Methode: Scheduler::schedule *
|
* Methode: Scheduler::schedule *
|
||||||
*---------------------------------------------------------------------------*
|
*---------------------------------------------------------------------------*
|
||||||
* Beschreibung: Scheduler starten. Wird nur einmalig aus main.cc gerufen.*
|
* Beschreibung: Scheduler starten. Wird nur einmalig aus main.cc gerufen.*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
void Scheduler::schedule () {
|
void Scheduler::schedule() {
|
||||||
|
|
||||||
/* hier muss Code eingefuegt werden */
|
/* hier muss Code eingefuegt werden */
|
||||||
|
|
||||||
/* Bevor diese Methode anufgerufen wird, muss zumindest der Idle-Thread
|
Thread* idle = new IdleThread();
|
||||||
|
this->readyQueue.enqueue(idle);
|
||||||
|
|
||||||
|
/* Bevor diese Methode anufgerufen wird, muss zumindest der Idle-Thread
|
||||||
* in der Queue eingefuegt worden sein.
|
* in der Queue eingefuegt worden sein.
|
||||||
*/
|
*/
|
||||||
}
|
|
||||||
|
|
||||||
|
Thread& first = *(Thread*)this->readyQueue.dequeue();
|
||||||
|
this->start(first);
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Methode: Scheduler::ready *
|
* Methode: Scheduler::ready *
|
||||||
@ -37,13 +40,13 @@ void Scheduler::schedule () {
|
|||||||
* Parameter: *
|
* Parameter: *
|
||||||
* that Einzutragender Thread *
|
* that Einzutragender Thread *
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
void Scheduler::ready (Thread * that) {
|
void Scheduler::ready(Thread* that) {
|
||||||
|
|
||||||
/* hier muss Code eingefuegt werden */
|
/* hier muss Code eingefuegt werden */
|
||||||
|
|
||||||
|
this->readyQueue.enqueue(that);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Methode: Scheduler::exit *
|
* Methode: Scheduler::exit *
|
||||||
*---------------------------------------------------------------------------*
|
*---------------------------------------------------------------------------*
|
||||||
@ -52,13 +55,14 @@ void Scheduler::ready (Thread * that) {
|
|||||||
* umgeschaltet werden. Der aktuell laufende Thread ist *
|
* umgeschaltet werden. Der aktuell laufende Thread ist *
|
||||||
* nicht in der readyQueue. *
|
* nicht in der readyQueue. *
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
void Scheduler::exit () {
|
void Scheduler::exit() {
|
||||||
|
|
||||||
/* hier muss Code eingefuegt werden */
|
/* hier muss Code eingefuegt werden */
|
||||||
|
|
||||||
|
Thread& next = *(Thread*)this->readyQueue.dequeue();
|
||||||
|
this->dispatch(next);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Methode: Scheduler::kill *
|
* Methode: Scheduler::kill *
|
||||||
*---------------------------------------------------------------------------*
|
*---------------------------------------------------------------------------*
|
||||||
@ -70,13 +74,11 @@ void Scheduler::exit () {
|
|||||||
* Parameter: *
|
* Parameter: *
|
||||||
* that Zu terminierender Thread *
|
* that Zu terminierender Thread *
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
void Scheduler::kill (Thread * that) {
|
void Scheduler::kill(Thread* that) {
|
||||||
|
|
||||||
/* hier muss Code eingefuegt werden */
|
/* hier muss Code eingefuegt werden */
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Methode: Scheduler::yield *
|
* Methode: Scheduler::yield *
|
||||||
*---------------------------------------------------------------------------*
|
*---------------------------------------------------------------------------*
|
||||||
@ -88,8 +90,17 @@ void Scheduler::kill (Thread * that) {
|
|||||||
* Achtung: Falls nur der Idle-Thread läuft, so ist die *
|
* Achtung: Falls nur der Idle-Thread läuft, so ist die *
|
||||||
* readyQueue leer. *
|
* readyQueue leer. *
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
void Scheduler::yield () {
|
void Scheduler::yield() {
|
||||||
|
|
||||||
/* hier muss Code eingefuegt werden */
|
/* hier muss Code eingefuegt werden */
|
||||||
|
|
||||||
|
if (this->readyQueue.isEmpty()) {
|
||||||
|
// Idle thread running
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->readyQueue.enqueue(this->get_active());
|
||||||
|
|
||||||
|
Thread& next = *(Thread*)this->readyQueue.dequeue();
|
||||||
|
this->dispatch(next);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user