6 #include <linux/slab.h>
9 #include "util-queue.h"
11 void init_queue(struct gen_queue * queue, unsigned int max_entries) {
12 queue->num_entries = 0;
13 queue->max_entries = max_entries;
15 INIT_LIST_HEAD(&(queue->entries));
16 palacios_spinlock_init(&(queue->lock));
19 void deinit_queue(struct gen_queue * queue) {
20 while (dequeue(queue)) {
21 ERROR("Freeing non-empty queue. PROBABLE MEMORY LEAK DETECTED\n");
23 palacios_spinlock_deinit(&(queue->lock));
26 struct gen_queue * create_queue(unsigned int max_entries) {
27 struct gen_queue * tmp_queue = palacios_alloc(sizeof(struct gen_queue));
29 ERROR("Unable to allocate a queue\n");
32 init_queue(tmp_queue, max_entries);
36 int enqueue(struct gen_queue * queue, void * entry) {
37 struct queue_entry * q_entry = NULL;
40 if (queue->num_entries >= queue->max_entries) {
44 q_entry = palacios_alloc(sizeof(struct queue_entry));
47 ERROR("Unable to allocate a queue entry on enqueue\n");
51 palacios_spinlock_lock_irqsave(&(queue->lock), flags);
53 q_entry->entry = entry;
54 list_add_tail(&(q_entry->node), &(queue->entries));
57 palacios_spinlock_unlock_irqrestore(&(queue->lock), flags);
63 void * dequeue(struct gen_queue * queue) {
67 palacios_spinlock_lock_irqsave(&(queue->lock), flags);
69 if (!list_empty(&(queue->entries))) {
70 struct list_head * q_entry = queue->entries.next;
71 struct queue_entry * tmp_entry = list_entry(q_entry, struct queue_entry, node);
73 entry_val = tmp_entry->entry;
75 palacios_free(tmp_entry);
81 palacios_spinlock_unlock_irqrestore(&(queue->lock), flags);