Linux 内核链表移植(二)

2014-11-24 03:17:16 · 作者: · 浏览: 18
struct list_head *last = list->prev;
struct list_head *at = head->next;


first->prev = head;
head->next = first;


last->next = at;
at->prev = last;
}


/**
* list_splice - join two lists
* @list: the new list to add.
* @head: the place to add it in the first list.
*/
static inline void list_splice(struct list_head *list, struct list_head *head)
{
if (!list_empty(list)) {
__list_splice(list, head);
}
}


/**
* list_splice_init - join two lists and reinitialise the emptied list.
* @list: the new list to add.
* @head: the place to add it in the first list.
*
* The list at @list is reinitialised
*/
static inline void list_splice_init(struct list_head *list, struct list_head *head)
{
if (!list_empty(list)) {
__list_splice(list, head);
INIT_LIST_HEAD(list);
}
}


#define list_entry(ptr, type, member) \
container_of(ptr, type, member)


#define list_for_each(pos, head) \
for (pos = (head)->next; prefetch(pos->next), pos != (head); \
pos = pos->next)


#define __list_for_each(pos, head) \
for (pos = (head)->next; pos != (head); pos = pos->next)


#define list_for_each_prev(pos, head) \
for (pos = (head)->prev; prefetch(pos->prev), pos != (head); \
pos = pos->prev)


#define list_for_each_safe(pos, n, head) \
for (pos = (head)->next, n = pos->next; pos != (head); \
pos = n, n = pos->next)


#ifdef typeof


#define list_for_each_entry(pos, head, member) \
for (pos = list_entry((head)->next, typeof(*pos), member); \
prefetch(pos->member.next), &pos->member != (head); \
pos = list_entry(pos->member.next, typeof(*pos), member))


#define list_for_each_entry_reverse(pos, head, member) \
for (pos = list_entry((head)->prev, typeof(*pos), member); \
prefetch(pos->member.prev), &pos->member != (head); \
pos = list_entry(pos->member.prev, typeof(*pos), member))


#define list_prepare_entry(pos, head, member) \
((pos) : list_entry(head, typeof(*pos), member))


#define list_for_each_entry_continue(pos, head, member) \
for (pos = list_entry(pos->member.next, typeof(*pos), member); \
prefetch(pos->member.next), &pos->member != (head); \
pos = list_entry(pos->member.next, typeof(*pos), member))


#define list_for_each_entry_safe(pos, n, head, member) \
for (pos = list_entry((head)->next, typeof(*pos), member), \
n = list_entry(pos->member.next, typeof(*pos), member); \
&pos->member != (head); \
pos = n, n = list_entry(n->member.next, typeof(*n), member))
#else


#define list_for_each_entry(pos, typeof_pos, head, member) \
for (pos = list_entry((head)->next, typeof_pos, member); \
prefetch(pos->member.next), &pos->member != (head); \
pos = list_entry(pos->member.next, typeof_pos, member))


#define list_for_each_entry_reverse(pos, typeof_pos, head, member) \
for (pos = list_entry((head)->prev, typeof_pos, member); \
prefetch(pos->member.prev), &pos->member != (head); \
pos = list_entry(pos->member.prev, typeof_pos, member))


#define list_prepare_entry(pos, typeof_pos, head, member) \
((pos) : list_entry(head, typeof_pos, member))


#define list_for_each_entry_continue(pos, typeof_pos, head, member) \
for (pos = list_entry(pos->member.next, typeof_pos, member); \
prefetch(pos->member.next), &pos->member != (head); \
pos = list_entry(pos->member.next, typeof_pos, member))


#define list_for_each_entry_safe(pos, typeof_pos, n, typeof_n, head, member) \