
Low-Level Funktionen für den Kontextwechsel. Mehr ...
Klassen | |
struct | stack |
Struktur zum Speichern des Stapelzeigers (Stackpointers) bei einem Koroutinenwechsel. 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. Mehr ... | |
void | context_kickoff (Thread *object) |
Funktion zum Starten eines Threads. Mehr ... | |
Low-Level Funktionen für den 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 context_kickoff() .
Aktivierung von kickoff Bei der Initialisierung eines Threads mit Hilfe der Funktion context_prepare() wird nicht nur die Struktur stack
für den ersten Threadwechsel vorbereitet, sondern auch die Adresse der Funktion context_kickoff() als Rücksprungadresse auf den Stack gelegt. Beim ersten Threadwechsel mit context_switch() wird daher an den Anfang von zurückgesprungen, 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 auf den Thread als ersten Parameter benötigt
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 context_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 eine Struktur, in den der aktuelle Stackpointer gesichert werden soll. |
next | Zeiger auf eine Struktur, der den Stackpointer mit dem zu ladenden Kontext enthält. |