
Enthält die Funktionen zum Kontextwechsel. Mehr ...
Klassen | |
struct | stack |
Die Struktur toc dient dazu, bei einem Koroutinenwechsel die Werte der nicht-flüchtigen Register zu sichern. Mehr ... | |
Funktionen | |
void | context_prepare (struct stack *target, void *tos, Thread *that) |
Diese Funktion bereitet einen Kontext für die erste Aktivierung vor. Mehr ... | |
void | context_switch (struct stack *current, struct stack *next) |
Diese Funktion führt einen Kontextwechsel durch. Dazu müssen die aktuellen Registerwerte auf dem Stack und der Stackpointer selbst in current gesichert werden und durch die Werte von next ersetzt werden. Mehr ... | |
void | context_kickoff (Thread *object) |
Funktion zum Starten eines Threads. Mehr ... | |
Enthält die Funktionen zum Kontextwechsel.
void context_kickoff | ( | Thread * | object | ) |
Funktion zum Starten eines Threads.
Für die allererste Aktivierung eines Threads muss eine "Rücksprungadresse" zu einer Funktion bekannt sein, von der aus dann der Übergang von der C- zur C++-Ebene erfolgen kann. Hierfür dient die Funktion kickoff.
Aktivierung von kickoff Bei der Initialisierung eines Threads mit Hilfe der Funktion toc_settle() wird nicht nur die Struktur toc für den ersten Threadwechsel vorbereitet, sondern auch die Adresse der Funktion kickoff als Rücksprungadresse auf den Stack gelegt. Beim ersten Threadwechsel mit toc_switch wird daher an den Anfang von kickoff "zurück"gesprungen, womit die Ausführung beginnt.
Diese Methode realisiert den Sprung von der C-Ebene zur C++-Ebene, indem sie ganz einfach die Methode action() des als Parameter vorgefundenen Threadobjektes aufruft.
Hinweis Da diese Funktion nicht wirklich aufgerufen, sondern nur durch eine geschickte Initialisierung des Stacks der Koroutine angesprungen wird, darf sie nie terminieren. Anderenfalls würde ein sinnloser Wert als Rücksprungadresse interpretiert werden und der Rechner abstürzen.
object | Thread, der gestartet werden soll. |
Diese Funktion bereitet einen Kontext für die erste Aktivierung vor.
Dazu muss der Stack so initialisiert werden, dass bei der ersten Aktivierung die Ausführung mit der Funktion context_kickoff beginnt, die wiederum den Zeiger object als ersten Parameter auf dem Stack vorfinden muss.
context_prepare kann in C++ in der Datei context.cc implementiert werden und deshalb muss sie nicht als extern "C" deklariert werden.
target | Stack (für Kontext), der auf eine Aktivierung vorbereitet werden soll |
tos | Zeiger auf die oberste Adresse des Stackbereichs. |
that | Zeiger auf das zu startende Threadobjekt (Parameter für kickoff) |
Diese Funktion führt einen Kontextwechsel durch. Dazu müssen die aktuellen Registerwerte auf dem Stack und der Stackpointer selbst in current
gesichert werden und durch die Werte von next
ersetzt werden.
Die Funktion wird in Assembler in der Datei context.asm implementiert. Sie muss als extern "C" deklariert werden, da sie als Assemblerfunktion nicht dem C++ Namemangeling unterliegt.
current | Zeiger auf ein struct stack, in den der aktuelle Stackpointer gesichert werden soll. |
next | Zeiger auf ein struct struct, der den Stackpointer mit dem zu ladenden Kontext enthält. |