Korrekter Weg, um zwei doppelt verkettete Listen zu verbinden

8

In der Linux-Kernelquelle ist list_splice mit __list_splice :

implementiert %Vor%

Zeigt% list nicht bereits auf den Kopf einer verknüpften Liste? Warum müssen wir stattdessen list->next holen?

    
satoru 22.11.2015, 02:16
quelle

1 Antwort

7

Die Double-Linked-List-API im Linux-Kernel ist als Abstraktion der Ringliste implementiert. In diesem einfachen Schema enthält der HEAD-Knoten nicht irgendwelche Nutzdaten (Daten) und wird explizit verwendet, um den Startpunkt der Liste beizubehalten. Aufgrund eines solchen Designs ist es sehr einfach a) zu überprüfen, ob die Liste leer ist, und b) zu debuggen, da unbenutzte Knoten der so genannten POISON - magischen Zahl zugewiesen wurden, die nur für die Listenzeiger in der gesamte Kernel.

1) nicht initialisierte Liste

%Vor%

2) leere Liste

%Vor%

3) Liste mit einem Element

%Vor%

4) zwei Elemente in der Liste

%Vor%

Im Lockless-Algorithmus gibt es nur eine Garantie für next -Zeiger, um konsistent zu sein. Die Garantie war nicht immer gegeben. Das commit 41071d65e11b führt es ein.

    
0andriy 22.11.2015, 09:43
quelle

Tags und Links