Die Klasse Guard dient der Synchronisation zwischen "normalen"
Kernaktivitäten (zur Zeit Ausgaben, später Systemaufrufe) und
Unterbrechungsbehandlungsroutinen. Dazu besitzt Guard eine
Warteschlange (ein Queue
Objekt), in die Gate Objekte eingereiht
werden können.
Das ist immer dann erforderlich, wenn zum Zeitpunkt des Auftretens
einer Unterbrechung der kritische Abschnitt gerade besetzt ist, die
epilogue() Methode also nicht sofort bearbeitet werden
darf. Die angesammelten Epiloge werden behandelt, sobald der kritische
Abschnitt wieder freigegeben wird.
öffentliche Methoden
void leave ()
Mit dieser Methode wird der kritische Abschnitt verlassen und
die angestauten Epiloge werden abgearbeitet.
void relay (Gate* item)
Diese Methode wird von guardian () aufgerufen, falls der zuvor ausgeführte Prolog durch einen Rückgabewert true angezeigt hat, dass sein Epilog ausgeführt werden soll. Ob der Epilog sofort behandelt oder zunächst nur in die Epilogliste eingehängt wird, hängt davon ab, ob der kritische Abschnitt frei oder besetzt ist.
Hinweise
Die Epilogqueue stellt eine zentrale Datenstruktur dar, deren
Konsistenz geeignet gesichert werden muß.
Die von uns durch die Klasse Queue bereitgestellte Implementierung ist nicht unterbrechungstransparent! Entweder ihr implementiert also selbst eine unterbrechungstransparente Queue, oder ihr synchronisiert die bereitgestellte Queue entsprechend hart.
Da Gate Objekte nur einen einzigen Verkettungszeiger besitzen,
dürfen sie zu einem Zeitpunkt nur ein einziges Mal in der
Epilogliste aufgeführt sein. Wenn also zwei gleichartige
Interrupts so schnell aufeinanderfolgen, dass der
zugehörige Epilog noch gar nicht behandelt wurde, darf nicht
versucht werden, dasselbe Gate Objekt zweimal in die Epilogliste
einzutragen. Die Klasse Gate
bietet Methoden, dies zu vermerken bzw. zu prüfen.
Ein Betriebssystem sollte Unterbrechungen immer nur so kurz wie
möglich sperren. Daher sieht das Pro-/Epilog-Modell vor,
dass Epiloge durch Prologe unterbrochen werden können.
Für OOStuBS bedeutet das, dass bereits vor der
Ausführung des Epilogs einer Unterbrechungsbehandlung
Interrupts wieder zugelassen werden sollten.