1#include <stdlib.h>
2#include <string.h>
3
4#include "testeventqueue.h"
5
6
7
8struct CallbackDataQueueElement;
9typedef struct CallbackDataQueueElement CallbackDataQueueElement;
10
11struct CallbackDataQueueElement
12{
13	CallbackData callbackData;
14	CallbackDataQueueElement *forward;
15	CallbackDataQueueElement *back;
16};
17
18// allocate static storage for the queue header, which is a circularly linked list
19static CallbackDataQueueElement gCallbackQueue = {{0, 0, NULL, NULL, 0}, &gCallbackQueue, &gCallbackQueue};
20static int gNumItemsInQueue = 0;
21
22
23void TEQ_Enqueue (CallbackData *cd)
24{
25	// allocate storage for the queue element and copy it.
26	CallbackDataQueueElement* element = (CallbackDataQueueElement*) malloc (sizeof (CallbackDataQueueElement));
27	memcpy (&element->callbackData, cd, sizeof (CallbackData));
28
29	// enqueue the new element -- always at the end
30	CallbackDataQueueElement* tail = gCallbackQueue.back;
31	element->forward = tail->forward;
32	element->forward->back = element;
33	element->back = tail;
34	tail->forward = element;
35
36	gNumItemsInQueue += 1;
37}
38
39
40
41bool TEQ_Dequeue (CallbackData *cd)
42{
43	if (TEQ_ItemsInQueue () == 0)
44	{
45		return false;
46	}
47
48	// pull the element out of the queue and copy the data
49	CallbackDataQueueElement* element = gCallbackQueue.forward;
50	element->forward->back = element->back;
51	element->back->forward = element->forward;
52	memcpy (cd, &element->callbackData, sizeof (CallbackData));
53
54	free (element);
55
56	gNumItemsInQueue -= 1;
57	return true;
58}
59
60
61
62int TEQ_ItemsInQueue ()
63{
64	return gNumItemsInQueue;
65}
66
67
68
69void TEQ_FlushQueue ()
70{
71	CallbackDataQueueElement* element = gCallbackQueue.forward;
72	while (element != &gCallbackQueue)
73	{
74		CallbackDataQueueElement* forward = element->forward;
75		free (element);
76		element = forward;
77	}
78
79	gNumItemsInQueue = 0;
80}
81
82
83
84void TEQ_Release (CallbackData *cd)
85{
86	if (cd->itemRef != NULL)
87	{
88		CFRelease (cd->itemRef);
89	}
90
91	if (cd->keychain != NULL)
92	{
93		CFRelease (cd->keychain);
94	}
95}
96