#include "queue.h"

/*
Author: Justin Kenny

Creates a queue to hold packets for shared memory based on a linked list
*/

//Initializes the queue.s
void queue_init(queue_t *queue)
{
    queue->head = NULL;
    queue->tail = NULL;
    queue->size = 0;
}

//Returns a pointer to the new queue node. If it return null, then malloc failed.
queue_node_t* enqueue(queue_t *queue, packet_t* packet)
{
    queue_node_t *n;
    n = malloc(sizeof(*n));
    if(n)
    {
        n->data = packet;
        if(queue->head)
        {
            queue->tail->next = n;
            n->prev = queue->tail;
            queue->tail = n;
        }
        else
        {
            //the queue is empty
            queue->head = queue->tail = n;
        }
        queue->size++;
    }
    return n;
}

packet_t* dequeue(queue_t *queue)
{
    queue_node_t *n;
    if(!queue->head)
    {
        return NULL;
    }
    if(queue->head == queue->tail)
    {
        n = queue->head;
        queue->head = queue->tail = NULL;
    }
    else
    {
        queue_node_t *next;
        next = queue->head->next;
        n = queue->head;
        next->prev = NULL;
        queue->head = next;
    }
    packet_t *packet = n->data;
    free(n);
    return packet;
}