Linux中通用鍊錶 list 的解析(2)

2021-04-13 01:53:18 字數 2365 閱讀 5095

1. 下面介紹list的插入函式:

#ifndef config_debug_list

static inline void __list_add(struct list_head *new,

struct list_head *prev,

struct list_head *next)

#else

extern void __list_add(struct list_head *new,

struct list_head *prev,

struct list_head *next);

#endif

這個函式的3個引數分別是:

new: 要插入的結點;

prev: 插入之後new的前乙個結點;

next: 插入之後new的後乙個結點.

下面接著的是:

#ifndef config_debug_list

static inline void list_add(struct list_head *new, struct list_head *head)

#else

extern void list_add(struct list_head *new, struct list_head *head);

#endif

這是將上面的3參函式改為2參函式的呼叫, 表示把new插入到head後面.

同理:static inline void list_add_tail(struct list_head *new, struct list_head *head)

這表示把new插入到head前面.

接下來的:

static inline void __list_add_rcu(struct list_head * new,

struct list_head * prev, struct list_head * next)

引領的是幾個rcu protected的插入函式.

2. 下面介紹list的刪除函式:

static inline void __list_del(struct list_head * prev, struct list_head * next)

通過要刪除結點的前後兩結點作為引數,使它們互相指向.

static inline void list_del_init(struct list_head *entry)

刪除entry結點, 並把它的prev和next值指向安全區(即自己).

#ifndef config_debug_list

static inline void list_del(struct list_head *entry)

#else

extern void list_del(struct list_head *entry);

#endif

通過呼叫上面的__list_del函式實現刪除結點, 並且指定entry結點prev,next指標的值.

兩個巨集在linux/poison.h中定義如下:

/********** include/linux/list.h **********/

/** these are non-null pointers that will result in page faults

* under normal circumstances, used to verify that nobody uses

* non-initialized list entries.

*/#define list_poison1  ((void *) 0x00100100)

#define list_poison2  ((void *) 0x00200200)

細心的人可能發現了, 結點在被從list中刪除後並沒有釋放, 這是因為在建立和插入結點的時候也沒有申請資源, 在c/c++中的原則是**申請**釋放.

rcu_del的函式同rcu_add, 不再說明.

3. 下面介紹list的替換函式:

static inline void list_replace(struct list_head *old,

struct list_head *new)

這個函式用new結點替換list中的old結點.

static inline void init_list_head(struct list_head *list)

這個函式把引數中的list結點的prev和next指向自己.

static inline void list_replace_init(struct list_head *old,

struct list_head *new)

這個函式是綜合上面兩個函式, 在用new替換old之後, 使old結點的prev和next指向安全區(即自己).

linux通用鍊錶list例項講解

linux核心中使用的鍊錶 特點是可以復用,無需反覆造輪子.容易想到的一種鍊錶用法是這樣的 struct list 資料被儲存在鍊錶的節點內部 通過next和prev移動來訪問各個節點上的priv data.這樣做的問題在於 幾乎沒有復用性,不同的資料儲存就需要對應的多種list.而linux ke...

通用鍊錶 通用鍊錶的基本使用

1.1雙向鍊錶指標域 從圖中可以看出雙向鍊錶的前向指標指向前乙個結點的首位址,後向指標指向下乙個節點的首位址,並且指標型別相同,且只能指向與自己型別相同的結構體。1.2通用鍊錶指標域 從圖中可以看出通用鍊錶的前向指標指向前乙個結點的指標域的首位址,後向指標指向下乙個節點的指標域的首位址,所以在不同的...

鍊錶 List

stl中,list class list 的乙個例項 使用乙個doubly linked list管理元素。list不支援隨機訪問,但任何位置上執行元素的安插和移動都非常快。雙向鍊錶 doubly linked list 使用list時必須先包含標頭檔案 include其中list型別系定義於nam...