From 90f483a36603273010d49d799890badd8e2829aa Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Wed, 8 Jan 2014 15:12:04 -0800 Subject: [PATCH] shared: Fix queue function to remove only specific entries --- src/shared/queue.c | 62 ++++++++++++++++++++++++++++++++++------------ src/shared/queue.h | 2 +- 2 files changed, 47 insertions(+), 17 deletions(-) diff --git a/src/shared/queue.c b/src/shared/queue.c index d73a535d6..0019e53d0 100644 --- a/src/shared/queue.c +++ b/src/shared/queue.c @@ -232,35 +232,65 @@ void *queue_remove_if(struct queue *queue, queue_match_func_t function, return NULL; } -bool queue_remove_all(struct queue *queue, queue_match_func_t function, +unsigned int queue_remove_all(struct queue *queue, queue_match_func_t function, void *user_data, queue_destroy_func_t destroy) { struct queue_entry *entry; + unsigned int count = 0; if (!queue) - return false; - - if (function) - return false; + return 0; entry = queue->head; - while (entry) { - struct queue_entry *tmp = entry; + if (function) { + struct queue_entry *prev = NULL; - entry = entry->next; + while (entry) { + if (function(entry->data, user_data)) { + struct queue_entry *tmp = entry; - if (destroy) - destroy(tmp->data); + if (prev) + prev->next = entry->next; + else + queue->head = entry->next; - free(tmp); - } + if (!entry->next) + queue->tail = prev; - queue->head = NULL; - queue->tail = NULL; - queue->entries = 0; + entry = entry->next; - return true; + if (destroy) + destroy(tmp->data); + + free(tmp); + count++; + } else { + prev = entry; + entry = entry->next; + } + } + + queue->entries -= count; + } else { + while (entry) { + struct queue_entry *tmp = entry; + + entry = entry->next; + + if (destroy) + destroy(tmp->data); + + free(tmp); + count++; + } + + queue->head = NULL; + queue->tail = NULL; + queue->entries = 0; + } + + return count; } unsigned int queue_length(struct queue *queue) diff --git a/src/shared/queue.h b/src/shared/queue.h index 201985a86..e85cd05f0 100644 --- a/src/shared/queue.h +++ b/src/shared/queue.h @@ -48,7 +48,7 @@ void *queue_find(struct queue *queue, queue_match_func_t function, void *queue_remove_if(struct queue *queue, queue_match_func_t function, void *user_data); -bool queue_remove_all(struct queue *queue, queue_match_func_t function, +unsigned int queue_remove_all(struct queue *queue, queue_match_func_t function, void *user_data, queue_destroy_func_t destroy); unsigned int queue_length(struct queue *queue); -- 2.47.3