typedef struct list_head
{
struct list_head *prev;
struct list_head *next;
}list_head_t;
#define container_of(ptr, type, member, ret) do { \
ret = (type *)((char *)ptr - (long long)(&((type *)0)->member));}while(0)
static inline void list_init_head(list_head_t *head)
{
head->next = head;
head->prev = head;
}
static inline void __list_add(list_head_t *new_node,
list_head_t *prev_node,
list_head_t *next_node)
{
new_node->prev = prev_node;
new_node->next = next_node;
prev_node->next = new_node;
next_node->prev = new_node;
}
static inline void __list_del(list_head_t *prev,
list_head_t *next)
{
prev->next = next;
next->prev = prev;
}
static inline void list_add_prev(list_head_t *new_node,
list_head_t *head)
{
__list_add(new_node, head->prev, head);
}
static inline void list_add_next(list_head_t *new_node,
list_head_t *head)
{
__list_add(new_node, head, head->next);
}
static inline void list_del_node(list_head_t *node)
{
__list_del(node->prev, node->next);
list_init_head(node);
}
static inline int list_is_empty(list_head_t *head)
{
if ( (head->next == head) && (head->prev == head) )
{
return 1;
}
return 0;
}
static inline list_head_t *list_del_first_node(list_head_t *head)
{
list_head_t *node = NULL;
node = head->next;
if ( node == head )
{
return NULL;
}
list_del_node(node);
return node;
}