队列的操作,相关函数
INIT_LIST_HEAD();
LIST_HEAD_INIT();
list_add_tail();
list_del();
list_entry();
list_empty(); //判断是否是空的
list_for_each_entry();
宏、函数分析
(list.h中)
#define LIST_HEAD_INIT(name) { &(name), &(name) }
#define LIST_HEAD(name) \
struct list_head name = LIST_HEAD_INIT(name)
static inline void INIT_LIST_HEAD(struct list_head *list)
{
list->next = list;
list->prev = list;
}
定义、初始化list_head的方法
法一:
static LIST_HEAD(head);
法二:
struct list_head head = LIST_HEAD_INIT(head);
法三:
struct list_head head;
INIT_LIST_HEAD(&head)
list_entry(ptr, type, member)
返回值:结构体指针
ptr: 要取出的list_head的头部
type: 要取出什么类型的结构体
member: type结构体中链入ptr的list_head成员名字。
例:《第2课第1.1.4节_摄像头驱动_从零写一个虚拟驱动_P》:
struct videobuf_buffer {
...
struct list_head queue;
...
}
static struct list_head myvivi_vb_local_queue;
static void myvivi_timer_function(unsigned long data)
{
struct videobuf_buffer *vb;
vb = list_entry(myvivi_vb_local_queue.next, struct videobuf_buffer, queue);
...
}
list_for_each_entry(pos, head, member)
是一个for(...)
pos: 作为for(...)括号内的指针,从而可以对pos进行操作
head: list_head的头部
member: 链入head的结构体的list_head成员名称。(member一般和*pos在同一个结构体中)
例:
static LIST_HEAD(local_list);
struct videobuf_buffer {
...
enum videobuf_state state;
...
}
struct videobuf_queue {
...
struct videobuf_buffer *bufs[VIDEO_MAX_FRAME];
struct list_head stream;
...
}
int videobuf_streamon(struct videobuf_queue *q)
{
struct videobuf_buffer *buf;
list_for_each_entry(buf, &local_list, stream)
if (buf->state == VIDEOBUF_PREPARED)
...
}