Fifo Template Klassen
Die Header Datei Fifo.h stellt unterschiedliche Fifo Template Klassen bereit. Alle Klassen erkennen, wenn ihr Speicher gefüllt ist und werden dann keine neuen Elemente aufnehmen, bis ein Element entfernt wurde. Die Element-Typen können primitive Datentypen („Plain Old Datatypes“, PODs) sein. Es ist nicht möglich Element Typen mit virtuellen Tabellen in einem Fifo abzulegen. Pointer sind (unabhängig vom Typ) erlaubt.
CFiFoListBase
Die Klasse CFifoListBase ist die Basisimplementierung eines Fifos. Diese Template-Klasse hat eine StorageType-Instanz, die dafür zuständig ist Elemente von einem Typen zu speichern. Sie nutzt eine SyncType-Instanz um synchronisierten Zugriff auf den Speicher und enthaltenen Daten zu erhalten.
Es gibt dabei unterschiedliche Möglichkeiten des Schutzes:
- CNoSync / SyncObects.h: Kein Schutz des Zugriffs innerhalb der Fifo. Es kann eine außenliegende CriticalSection genutzt werden.
- CSpinLock / TcSpinlock.h: Schutz durch einen Spinlock, wie oben beschrieben.
Die Methoden Add(), Remove() und Clear() haben auch entsprechende _Unprotected Variationen, welche mit den Methoden Lock() und Unlock() genutzt werden können um eine synchronisierte Abfolge von Add() und Delete() Operationen zu implementieren.
Methoden:
- CFiFoListBase(); Der Konstruktor.
- Lock() und Unlock(); Werden an den die Synchronisierungs-Instanz SyncType weitergereiht.
- Clear(), Clear_Unprotected(); Werden and die Speicher-Instanz StorageType weitergereicht.
- Add(), Add_Unprotected(); Ein Element hinzufügen.
- AddBlock(); Mehrere Elemente hinzufügen. Wen nein Block großer ist als der freie Speicher, werden nur die Elemente hinzugefügt, welche zu dem freien Speicher passen. The Anzahl der hinzugefügten Elemente wird zurückgegeben.
- Remove(), Remove_Unprotected(); Entfernt ein Element aus dem Fifo. Liefert FALSE, wenn kein Element vorhanden war, sonst TRUE.
- RemoveBlock(); Entfernt mehrere Elemente aus dem Fifo. Wenn dort weniger Elemente abgelegt sind, werden nur diese entfernt. Die Anzahl der entfernten Elemente wird zurückgegeben.
- GetEntryXBeforeHead(); Holt das Element vor dem x-ten Element vom Kopf, ohne das Element zu entfernen. Wenn also 0 als Parameter genutzt wird, wird das erste Element abgeholt. Sonst muss der Parameter grösser als 0 sein. Liefert FALSE, wenn das Element nicht existiert, sonst TRUE.
- Count(); Liefert die Anzahl der abgelegten Elemente.
- Size(); Liefert die Größe des Speichers, also die maximale Anzahl von Elementen, die in den Speicher passen.
- FreeCount(); Liefert die Anzahl der Elemente, die zum Speicher hinzugefügt werden.
- GetNextEntry(); Iteriert über die Elemente und startet dabei am Kopf.
CFiFoList
Die Klasse CFiFoList basiert auf CFiFoListBase und nutzt als Storage-Type CFiFoListStorageStatic zusammen mit der Synchronisierung-Type CSyncDefault.
Diese Implementierung fügt keine Methoden hinzu und benötigt Element-Typen sowie Größe des Speichers als Template Parameter.
CFiFoListDyn
Die Klasse CFiFoListDyn nutzt den dynamischen StorageType CFifoListStorageDynamic zusammen mit der Synchronisierung-Type CSyncDefault.
Diese Implementierung fügt keine Methoden hinzu und benötigt Element-Typen sowie Größe des Speichers als Template Parameter.
Handover3Buffer
Die Klasse CHandover3Buffer wird genutzt um Elemente von einem Task zu einem anderen weiterzureichen. Der Speicher umfasst 3 Elemente von einem gegebenen Typen. Der schreibende Task kann das Element immer schreiben. Der lesende Task kann das Element immer lesen, wenn ein Element geschrieben wurde. Es liest das Element, welches komplett geschrieben wurde. Elemente werden nicht entfernt nachdem sie gelesen werden. Zugriff via Indices für Lesen und Schreiben auf dem Speicher werden über die Funktion InterlockedExchangeR0 synchronisiert, sodass dieses vom Windows- und RT-Kontext zugreifbar sind.
Methoden:
- CHandover3Buffer(); Der Konstruktor.
- Write(); Schreibt ein Element in den Speicher. Liefert FALSE, wenn der Speicher einen ungültigen Zustand hat. Sonst TRUE.
- Read(); Liest ein Element aus dem Speicher. Liefert FALSE, wenn der Speicher leer ist oder Speicher in einem ungültigen Zustand ist. Sonst TRUE.
CHandoverFifo
Die Klasse CHandoverFifo wird ebenso genutzt um Elemente zwischen Tasks auszutauschen. Die Größe des Speichers ist immer eine zweier Potenz und kann durch den Template Parameter DEPTH_EXP gesetzt werden. Dieser ist per Default 3, sodass sich eine Größe von 8 Elementen ergibt.
Methoden:
- Insert()/Add(); Schreibt ein Element über einen Pointer oder eine Reference in den Speicher. Liefert FALSE, wenn kein Speicher verfügbar ist, sonst TRUE.
- Remove(); Entfernt und liefert ein Element über einen Pointer oder eine Referenz aus dem Speicher. Liefert FALSE, wenn kein Element verfügbar ist, sonst TRUE.
Beispiel:
TcHandoverSample.tszip