Diff between 76b9efbadcd4ca66c8609ef24265d9c74070c3c4 and bc959924328d26250ef24892c27ffba7583d7d2a

Changed Files

File Additions Deletions Status
src/shared/queue.c +29 -0 modified
src/shared/queue.h +1 -0 modified

Full Patch

diff --git a/src/shared/queue.c b/src/shared/queue.c
index fdf84e8..8a69729 100644
--- a/src/shared/queue.c
+++ b/src/shared/queue.c
@@ -202,6 +202,35 @@ void *queue_find(struct queue *queue, queue_match_func_t function,
 	return NULL;
 }
 
+bool queue_remove(struct queue *queue, void *data)
+{
+	struct queue_entry *entry, *prev;
+
+	if (!queue || !data)
+		return false;
+
+	for (entry = queue->head, prev = NULL; entry;
+					prev = entry, entry = entry->next) {
+		if (entry->data != data)
+			continue;
+
+		if (prev)
+			prev->next = entry->next;
+		else
+			queue->head = entry->next;
+
+		if (!entry->next)
+			queue->tail = prev;
+
+		free(entry);
+		queue->entries--;
+
+		return true;
+	}
+
+	return false;
+}
+
 void *queue_remove_if(struct queue *queue, queue_match_func_t function,
 							void *user_data)
 {
diff --git a/src/shared/queue.h b/src/shared/queue.h
index e9ab440..8201ff8 100644
--- a/src/shared/queue.h
+++ b/src/shared/queue.h
@@ -46,6 +46,7 @@ typedef bool (*queue_match_func_t)(const void *a, const void *b);
 void *queue_find(struct queue *queue, queue_match_func_t function,
 							void *user_data);
 
+bool queue_remove(struct queue *queue, void *data);
 void *queue_remove_if(struct queue *queue, queue_match_func_t function,
 							void *user_data);
 unsigned int queue_remove_all(struct queue *queue, queue_match_func_t function,