queue.h中是qemu使用到的一些基礎的資料結構,比如QLIST,QSLIST,QSIMPLEQ,QTAILQ。
本文主要介紹QLIST的資料結構,其它幾種資料結構與之類似。
需要注意entry是嵌入在其他結構體(elm)中使用,QLIST是elm的連結清單,不是entry的連結清單。
lh_first表示list head first
head的靜态初始化:
head的動态初始化:
le_next表示list entry next,le_prev表示list entry prev
注意le_prev,是兩個星号,是為了删除elm時的*(elm)->field.le_prev /*等效于之前一個elm的le_next*/ = (elm)->field.le_next;,可以在之後的示意圖中詳細看看。
elm是包含entry的結構體,比如:
在head後面插入一個elm:
在某個listelm前面或者後面插入elm:
删除elm:
周遊,safe模式的可以對本elm進行寫操作,注意((next_var) = ((var)->field.le_next), 1),讓&&後面的條件始終未1,防止next_var為NULL時,少循環一次:
其他操作:
示意圖:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiIXZ05WZD9CX5RXa2Fmcn9CXwczLcVmds92czlGZvwVP9EUTDZ0aRJkSwk0LcxGbpZ2LcBDM08CXlpXazRnbvZ2LcRlMMVDT2EWNvwFdu9mZvwldRhlW1VTaitmTzkVdjJjYzpkMMZ3bENGMShUYvwFd4VGdvwlMvw1ayFWbyVGdhd3PygDN4ADO1ATMwIDMxYTMwIzLcRXZu5ibkN3Yuc2bsJmLn1Wavw1LcpDc0RHaiojIsJye.jpg)
QSLIST是單向連結清單,QTAILQ的頭多了一個指向末尾的指針,不再贅述。