Use a bit in the head of a ptrlist and set it when DELETE_PTR() is called. Check the bit when repacking a list and do nothing if the bit is not set. Note: delete_ptr_list_entry() & delete_ptr_list_last() don't need any handling because they either always call pack_ptr_list() or remove the last block when it becomes empty. Suggested-by: Christopher Li <sparse@xxxxxxxxxxx> Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx> --- ptrlist.c | 7 +++++++ ptrlist.h | 4 +++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/ptrlist.c b/ptrlist.c index 5dc1117c..e817bad1 100644 --- a/ptrlist.c +++ b/ptrlist.c @@ -70,6 +70,11 @@ void pack_ptr_list(struct ptr_list **listp) if (head) { struct ptr_list *entry = head; + + if (!head->dirty) + return; + head->dirty = 0; + do { struct ptr_list *next; restart: @@ -138,6 +143,7 @@ void **__add_ptr_list(struct ptr_list **listp, void *ptr, unsigned long tag) list->prev = newlist; last->next = newlist; } + newlist->dirty = 0; last = newlist; nr = 0; } @@ -188,6 +194,7 @@ void * undo_ptr_list_last(struct ptr_list **head) if (!first) return NULL; + first->dirty = 1; last = first; do { last = last->prev; diff --git a/ptrlist.h b/ptrlist.h index 61e159fd..c24bfb82 100644 --- a/ptrlist.h +++ b/ptrlist.h @@ -25,7 +25,8 @@ #define LIST_NODE_NR (29) struct ptr_list { - int nr; + int nr:31; + unsigned int dirty:1; // will need to be repacked struct ptr_list *prev; struct ptr_list *next; void *list[LIST_NODE_NR]; @@ -254,6 +255,7 @@ extern void split_ptr_list_head(struct ptr_list *); __this++; \ } \ *__this = (void *)0xf0f0f0f0; \ + __head->dirty = 1; \ __list->nr--; __nr--; \ } while (0) -- 2.10.2 -- To unsubscribe from this list: send the line "unsubscribe linux-sparse" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html