Friedrich-Alexander-Universität Erlangen-Nürnberg  /   Technische Fakultät  /   Department Informatik
Kontextwechsel

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 ...
 

Ausführliche Beschreibung

Low-Level Funktionen für den Kontextwechsel.

Dokumentation der Funktionen

◆ context_kickoff()

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.

Parameter
objectThread, der gestartet werden soll.
Noch zu erledigen:
Methode implementieren

◆ context_prepare()

void context_prepare ( struct stack target,
void *  tos,
Thread that 
)

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.

Parameter
targetStack (für Kontext), der auf eine Aktivierung vorbereitet werden soll
tosZeiger auf die oberste Adresse des Stackbereichs.
thatZeiger auf das zu startende Threadobjekt (Parameter für context_kickoff() )
Noch zu erledigen:
Funktion implementieren

◆ context_switch()

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.

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.

Parameter
currentZeiger auf eine Struktur, in den der aktuelle Stackpointer gesichert werden soll.
nextZeiger auf eine Struktur, der den Stackpointer mit dem zu ladenden Kontext enthält.
Noch zu erledigen:
Methode implementieren