6 #include <linux/slab.h>
8 #include "util-queue.h"
10 void init_queue(struct gen_queue * queue, unsigned int max_entries) {
11 queue->num_entries = 0;
12 queue->max_entries = max_entries;
14 INIT_LIST_HEAD(&(queue->entries));
15 spin_lock_init(&(queue->lock));
18 struct gen_queue * create_queue(unsigned int max_entries) {
19 struct gen_queue * tmp_queue = kmalloc(sizeof(struct gen_queue), GFP_KERNEL);
20 init_queue(tmp_queue, max_entries);
24 int enqueue(struct gen_queue * queue, void * entry) {
25 struct queue_entry * q_entry = NULL;
28 if (queue->num_entries >= queue->max_entries) {
32 q_entry = kmalloc(sizeof(struct queue_entry), GFP_KERNEL);
34 spin_lock_irqsave(&(queue->lock), flags);
36 q_entry->entry = entry;
37 list_add_tail(&(q_entry->node), &(queue->entries));
40 spin_unlock_irqrestore(&(queue->lock), flags);
46 void * dequeue(struct gen_queue * queue) {
50 spin_lock_irqsave(&(queue->lock), flags);
52 if (!list_empty(&(queue->entries))) {
53 struct list_head * q_entry = queue->entries.next;
54 struct queue_entry * tmp_entry = list_entry(q_entry, struct queue_entry, node);
56 entry_val = tmp_entry->entry;
64 spin_unlock_irqrestore(&(queue->lock), flags);