OSDN Git Service

shared: Add simple function to remove entry from queue
authorMarcel Holtmann <marcel@holtmann.org>
Sun, 23 Mar 2014 19:09:58 +0000 (12:09 -0700)
committerMarcel Holtmann <marcel@holtmann.org>
Sun, 23 Mar 2014 19:09:58 +0000 (12:09 -0700)
src/shared/queue.c
src/shared/queue.h

index fdf84e8..8a69729 100644 (file)
@@ -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)
 {
index e9ab440..8201ff8 100644 (file)
@@ -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,