Diff between eb4d95c5609931733273dd4cb1d51a9961f0491f and 90f483a36603273010d49d799890badd8e2829aa

Changed Files

File Additions Deletions Status
src/shared/queue.c +46 -16 modified
src/shared/queue.h +1 -1 modified

Full Patch

diff --git a/src/shared/queue.c b/src/shared/queue.c
index d73a535..0019e53 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 201985a..e85cd05 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);