373de7492dfb8730f682987ffc5eb3793e96e076
[IRC.git] / Robust / src / Runtime / DSTM / interface / queue.c
1 #include "queue.h"
2
3 primarypfq_t pqueue; //Global queue
4
5 void queueInit(void) {
6         /* Intitialize primary queue */
7         pqueue.front = pqueue.rear = NULL;
8         pthread_mutex_init(&pqueue.qlock, NULL);
9         pthread_cond_init(&pqueue.qcond, NULL);
10 }
11
12 /* Delete the node pointed to by the front ptr of the queue */
13 void delqnode() {
14         prefetchqelem_t *delnode;
15         if((pqueue.front == NULL) && (pqueue.rear == NULL)) {
16                 printf("The queue is empty: UNDERFLOW %s, %d\n", __FILE__, __LINE__);
17                 return;
18         } else if ((pqueue.front == pqueue.rear) && pqueue.front != NULL && pqueue.rear != NULL) {
19                 free(pqueue.front);
20                 pqueue.front = pqueue.rear = NULL;
21         } else {
22                 delnode = pqueue.front;
23                 pqueue.front = pqueue.front->next;
24                 free(delnode);
25         }
26 }
27
28 void queueDelete(void) {
29         /* Remove each element */
30         while(pqueue.front != NULL)
31                 delqnode();
32         pqueue.front = pqueue.rear = NULL;
33 }
34
35 /* Inserts to the rear of primary prefetch queue */
36 void pre_enqueue(prefetchqelem_t *qnode) {
37         if(pqueue.front == NULL && pqueue.rear == NULL) {
38                 pqueue.front = pqueue.rear = qnode;
39         } else {
40                 qnode->next = NULL;
41                 pqueue.rear->next = qnode;
42                 pqueue.rear = qnode;
43         }
44 }
45
46 /* Return the node pointed to by the front ptr of the queue */
47 prefetchqelem_t *pre_dequeue(void) {
48         prefetchqelem_t *retnode;
49         if (pqueue.front == NULL) {
50                 printf("Queue empty: Underflow %s, %d\n", __FILE__, __LINE__);
51                 return NULL;
52         }
53         retnode = pqueue.front;
54         pqueue.front = pqueue.front->next;
55         if (pqueue.front == NULL)
56                 pqueue.rear = NULL;
57
58         return retnode;
59 }
60
61 void queueDisplay() {
62         int offset = sizeof(prefetchqelem_t);
63         int *ptr;
64         int ntuples;
65         char *ptr1;
66         prefetchqelem_t *tmp = pqueue.front;
67         while(tmp != NULL) {
68                 ptr1 = (char *) tmp;
69                 ptr = (int *)(ptr1 + offset);
70                 ntuples = *ptr;
71                 tmp = tmp->next;
72         }
73 }
74
75 void predealloc(prefetchqelem_t *node) {
76         free(node);
77         node->next = NULL;
78 }
79
80
81 #if 0
82 main() {
83         unsigned int oids[] = {11, 13};
84         short endoffsets[] = {2, 5};
85         short arrayfields[] = {2, 2, 1, 5, 6};
86         queueInit();
87         queueDisplay();
88         prefetch(2, oids, endoffsets, arrayfields);
89         queueDisplay();
90         unsigned int oids1[] = {21, 23, 25, 27};
91         short endoffsets1[] = {1, 2, 3, 4};
92         short arrayfields1[] = {3, 2, 1, 3};
93         prefetch(4, oids1, endoffsets1, arrayfields1);
94         queueDisplay();
95         delqnode();
96         queueDisplay();
97         delqnode();
98         queueDisplay();
99         delqnode();
100         queueDisplay();
101         delqnode();
102
103 }
104
105 #endif
106
107