Friedrich-Alexander-Universität Erlangen-Nürnberg  /   Technische Fakultät  /   Department Informatik
context.h-Dateireferenz

Enthält die Funktionen zum Kontextwechsel. Mehr ...

Dieser Graph zeigt, welche Datei direkt oder indirekt diese Datei enthält:

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

Ausführliche Beschreibung

Enthält die Funktionen zum 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 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.

Parameter
objectThread, der gestartet werden soll.

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

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 kickoff)

◆ 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 ein struct stack, in den der aktuelle Stackpointer gesichert werden soll.
nextZeiger auf ein struct struct, der den Stackpointer mit dem zu ladenden Kontext enthält.