Für die allererste Aktivierung einer
Coroutine muss eine "Rücksprungadresse"
zu einer Funktion bekannt sein, von der aus dann der Übergang von der
C zur C++ Ebene erfolgen kann. Diese Funktion soll kickoff
sein.
Aktivierung von kickoff
Bei der Initialisierung einer Coroutine mit Hilfe der Funktion
toc_settle() wird nicht nur die Struktur toc für den ersten Koroutinenwechsel
vorbereitet, sondern auch die Adresse der Funktion kickoff als
Rücksprungadresse auf den Stack gelegt. Bei dem ersten
Koroutinenwechsel mit toc_switch wird daher an den Anfang
von kickoff "zurück"gesprungen, womit die Ausführung beginnt.
Aufgabenbeschreibung
void kickoff (Coroutine* object)
Die wesentlichste Funktion von kickoff besteht natürlich weiterhin darin,
den Sprung von der C Ebene zur C++ Ebene zu vollführen, indem sie die
action() Methode des als Parameter vorgefundenen
Koroutinen Objekts aufzuruft.
Darüberhinaus ermöglicht es kickoff, für alle
Koroutinenobjekte die gleiche Initialisierung vorzunehmen. Zum
Beispiel werden Kontextwechsel stets aus einem kritischen Abschnitt
heraus ausgelöst. Daher muss die erste Aktion der neuen
Koroutine darin bestehen, den kritischen Abschnitt wieder freizugeben.
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.