major changes to prefetching code
[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_mutexattr_init(&pqueue.qlockattr);
9   pthread_mutexattr_settype(&pqueue.qlockattr, PTHREAD_MUTEX_RECURSIVE_NP);
10   pthread_mutex_init(&pqueue.qlock, &pqueue.qlockattr);
11   pthread_cond_init(&pqueue.qcond, NULL);
12 }
13
14 /* Delete the node pointed to by the front ptr of the queue */
15 void delqnode() {
16   prefetchqelem_t *delnode;
17   if(pqueue.front == NULL) {
18     printf("The queue is empty: UNDERFLOW %s, %d\n", __FILE__, __LINE__);
19     return;
20   } else if (pqueue.front == pqueue.rear) {
21     free(pqueue.front);
22     pqueue.front = pqueue.rear = NULL;
23   } else {
24     delnode = pqueue.front;
25     pqueue.front = pqueue.front->next;
26     free(delnode);
27   }
28 }
29
30 void queueDelete(void) {
31   /* Remove each element */
32   while(pqueue.front != NULL)
33     delqnode();
34 }
35
36 /* Inserts to the rear of primary prefetch queue */
37 void pre_enqueue(prefetchqelem_t *qnode) {
38   if(pqueue.front == NULL) {
39     pqueue.front = pqueue.rear = qnode;
40     qnode->next=NULL;
41   } else {
42     qnode->next = NULL;
43     pqueue.rear->next = qnode;
44     pqueue.rear = qnode;
45   }
46 }
47
48 /* Return the node pointed to by the front ptr of the queue */
49 prefetchqelem_t *pre_dequeue(void) {
50   prefetchqelem_t *retnode;
51   if (pqueue.front == NULL) {
52     printf("Queue empty: Underflow %s, %d\n", __FILE__, __LINE__);
53     return NULL;
54   }
55   retnode = pqueue.front;
56   pqueue.front = pqueue.front->next;
57   if (pqueue.front == NULL)
58     pqueue.rear = NULL;
59   retnode->next = NULL;
60   
61   return retnode;
62 }
63
64 void queueDisplay() {
65   int offset = sizeof(prefetchqelem_t);
66   int *ptr;
67   int ntuples;
68   char *ptr1;
69   prefetchqelem_t *tmp = pqueue.front;
70   while(tmp != NULL) {
71     ptr1 = (char *) tmp;
72     ptr = (int *)(ptr1 + offset);
73     ntuples = *ptr;
74     tmp = tmp->next;
75   }
76 }
77
78 void predealloc(prefetchqelem_t *node) {
79   free(node);
80 }
81