Dieser Thread guck die ganze Zeit auf eine Liste mit Tasks die beendet werden sollen. Die Elemente der Liste sind die gleichen wie die des Schedulers bzw der Taskliste.
Soll jetzt eine Task beendet werden wird dessen Struktur aus der Tasklist genommen und in die Liste der zu beendenden Tasks gegeben.
Der Thread - ich nenne ihn Terminator
- stellt dann fest das sich ein Element in der Liste befindet. (die idr 0 Elemente groß ist wenn nicht gerade ein großer Prozess mit 1000 Threads beendet wurde)
Jetzt kann der Terminator-Thread den Speicher der Struktur (des listen-elementes) freigegeben.
Die Pages die der Prozess reserviert hat wird vorher von ihm selber frei gegeben.
Das beenden sieht bei mir im ganzen so aus:
task: suizide
task: suizide: pages freigeben
task: suizide->kill(MyPID());
kill: struktur von der taskliste in die kill-liste schieben !! der Kritische punkt
terminator: task aus der kill-liste nehmen
terminator: delete task;
Es ist wichtig zu beachten das die task erst dann aus der taskliste genommen wird, wenn sie in der kill-liste steht.
ABER das Element darf nicht freigegeben werden solange es noch in der tasklist steht.
Das kann man z.B. in dem man guckt ob die task aus der kill-list zusätzlich noch in der tasklist steht. falls ja, einfach abwarten und später noch mal prüfen.
Ich hoffe es ist verständlich
Ich werde diesen post jedenfalls in meine doku kopieren - so gut hab ich da nämlich nicht beschrieben