#include <stdlib.h>
#include <string.h>
#include "testeventqueue.h"
struct CallbackDataQueueElement;
typedef struct CallbackDataQueueElement CallbackDataQueueElement;
struct CallbackDataQueueElement
{
CallbackData callbackData;
CallbackDataQueueElement *forward;
CallbackDataQueueElement *back;
};
static CallbackDataQueueElement gCallbackQueue = {{0, 0, NULL, NULL, 0}, &gCallbackQueue, &gCallbackQueue};
static int gNumItemsInQueue = 0;
void TEQ_Enqueue (CallbackData *cd)
{
CallbackDataQueueElement* element = (CallbackDataQueueElement*) malloc (sizeof (CallbackDataQueueElement));
memcpy (&element->callbackData, cd, sizeof (CallbackData));
CallbackDataQueueElement* tail = gCallbackQueue.back;
element->forward = tail->forward;
element->forward->back = element;
element->back = tail;
tail->forward = element;
gNumItemsInQueue += 1;
}
bool TEQ_Dequeue (CallbackData *cd)
{
if (TEQ_ItemsInQueue () == 0)
{
return false;
}
CallbackDataQueueElement* element = gCallbackQueue.forward;
element->forward->back = element->back;
element->back->forward = element->forward;
memcpy (cd, &element->callbackData, sizeof (CallbackData));
free (element);
gNumItemsInQueue -= 1;
return true;
}
int TEQ_ItemsInQueue ()
{
return gNumItemsInQueue;
}
void TEQ_FlushQueue ()
{
CallbackDataQueueElement* element = gCallbackQueue.forward;
while (element != &gCallbackQueue)
{
CallbackDataQueueElement* forward = element->forward;
free (element);
element = forward;
}
gNumItemsInQueue = 0;
}
void TEQ_Release (CallbackData *cd)
{
if (cd->itemRef != NULL)
{
CFRelease (cd->itemRef);
}
if (cd->keychain != NULL)
{
CFRelease (cd->keychain);
}
}