La doppia API dell'elenco collegato nel kernel Linux viene implementata come un'astrazione dell'elenco circolare . In tale schema semplice il nodo HEAD non contiene contiene alcun payload (dati) e viene utilizzato esplicitamente per mantenere il punto di partenza dell'elenco. A causa di tale progettazione è davvero semplice a) controllare se la lista è vuota, e b) lista di debug perché i nodi inutilizzati sono stati assegnati al cosiddetto POISON - numero magico specifico solo per i puntatori delle liste nell'intero kernel.
1) elenco non inizializzato
+-------------+
| HEAD |
| prev | next |
|POISON POISON|
+-------------+
2) elenco vuoto
+----------+-----------+
| | |
| | |
| +------v------+ |
| | HEAD | |
+---+ prev | next +----+
| HEAD HEAD |
+-------------+
3) elenco con un elemento
+--------------+--------------+
| | |
| | |
| +------v------+ |
| | HEAD | |
| +---+ prev | next +--+ |
| | |ITEM1 ITEM1| | |
| | +-------------+ | |
| +--------------------+ |
| | |
| +------v------+ |
| | ITEM1 | |
+-------+ prev | next +-------+
| DATA1 |
+-------------+
4) due elementi nell'elenco
+----------+
| |
| |
| +------v------+
| | HEAD |
+------+ prev | next +----+
| | |ITEM2 ITEM1| |
| | +-------------+ |
+----------------------------+
| | | |
| | | +------v------+
| | | | ITEM1 |
| | +---+ prev | next +----+
| | | | DATA1 | |
| | | +-------------+ |
| +-------------------------+
| | |
| | +------v------+
| | | ITEM2 |
+---------+ prev | next +----+
| | DATA2 | |
| +-------------+ |
| |
+----------------------+
Nell'algoritmo di blocco inferiore esiste una garanzia solo per accanto al puntatore per essere coerenti. La garanzia non è sempre stata così. Lo introduce commit 41071d65e11b
.
Se viene utilizzato in questo modo, la testata dell'elenco probabilmente non è un vero nodo di elenco. –