Update list implementation

This commit is contained in:
topjohnwu 2017-07-02 17:47:07 +08:00
parent 7b9be8369e
commit 9d421226a7
3 changed files with 29 additions and 12 deletions

2
jni/su

@ -1 +1 @@
Subproject commit 1bbf96a0a7a942798df58883a376b8024d0fae7f Subproject commit 9dab3bc8ab28792993711f0a2450f9332b172687

View File

@ -24,15 +24,19 @@ void list_insert_end(struct list_head *head, struct list_head *node) {
list_insert(head->prev, node); list_insert(head->prev, node);
} }
void list_pop(struct list_head *pos) { struct list_head *list_pop(struct list_head *pos) {
struct list_head *ret;
ret = pos->prev;
// Maintain the list // Maintain the list
pos->prev->next = pos->next; pos->prev->next = pos->next;
pos->next->prev = pos->prev; pos->next->prev = pos->prev;
// Remove references // Remove references
pos->next = pos; pos->next = pos;
pos->prev = pos; pos->prev = pos;
// Return the previous node in the list
return ret;
} }
void list_pop_end(struct list_head *head) { struct list_head *list_pop_end(struct list_head *head) {
return list_pop(head->prev); return list_pop(head->prev);
} }

View File

@ -14,17 +14,30 @@ struct list_head {
void init_list_head(struct list_head *head); void init_list_head(struct list_head *head);
void list_insert(struct list_head *pos, struct list_head *node); void list_insert(struct list_head *pos, struct list_head *node);
void list_insert_end(struct list_head *head, struct list_head *node); void list_insert_end(struct list_head *head, struct list_head *node);
void list_pop(struct list_head *pos); struct list_head *list_pop(struct list_head *pos);
void list_pop_end(struct list_head *head); struct list_head *list_pop_end(struct list_head *head);
#define list_entry(ptr, type, member) ({ \ #define list_entry(pos, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \ const typeof( ((type *)0)->member ) *__mptr = (pos); \
(type *)( (char *)__mptr - offsetof(type,member) );}) (type *)( (char *)__mptr - offsetof(type,member) );})
#define list_for_each(pos, head) \ #define list_for_each(ptr, head, type, member) \
for (pos = (head)->next; pos != (head); pos = pos->next) ptr = list_entry((head)->next, type, member); \
for (struct list_head *__ = (head)->next; __ != (head); __ = __->next, ptr = list_entry(__, type, member))
#define list_for_each_r(pos, head) \ #define list_for_each_r(ptr, head, type, member) \
for (pos = (head)->prev; pos != (head); pos = pos->prev) ptr = list_entry((head)->prev, type, member); \
for (struct list_head *__ = (head)->prev; __ != (head); __ = __->prev, ptr = list_entry(__, type, member))
#define list_destory(head, type, member, func) ({ \
struct list_head *node = head->next; \
while(node != head) { \
node = node->next; \
if (func) func(list_entry(node->prev, line_list, pos)); \
free(list_entry(node->prev, line_list, pos)); \
} \
head->next = head; \
head->prev = head; \
})
#endif #endif