several bug fixes. prefetching works so far, as well as starting remote threads.
[IRC.git] / Robust / src / Runtime / DSTM / interface / mcpileq.c
1 #include "mcpileq.h"
2
3 mcpileq_t mcqueue;
4
5 void mcpileqInit(void) {
6         /* Initialize machine queue that containing prefetch oids and offset values  sorted by remote machineid */  
7         mcqueue.front = mcqueue.rear = NULL;
8         pthread_mutex_init(&mcqueue.qlock, NULL); 
9         pthread_cond_init(&mcqueue.qcond, NULL); 
10 }
11
12 /* Insert to the rear of machine pile queue */
13 /*
14 void mcpileenqueue(prefetchpile_t *node) {
15         if(mcqueue.front == NULL && mcqueue.rear == NULL) {
16                 mcqueue.front = mcqueue.rear = node;
17         } else {
18                 node->next = NULL;
19                 mcqueue.rear->next = node;
20                 mcqueue.rear = node;
21         }
22 }
23 */
24
25 /* Insert to the rear of machine pile queue */
26 void mcpileenqueue(prefetchpile_t *node) {
27         prefetchpile_t *tmp, *prev;
28         if(mcqueue.front == NULL && mcqueue.rear == NULL) {
29                 mcqueue.front = mcqueue.rear = node;
30                 /*tmp = mcqueue.front = node;
31                 while(tmp != NULL) {
32                         prev = tmp;
33                         tmp = tmp->next;
34                 }
35                 mcqueue.rear = prev;*/
36         } else {
37                 tmp = mcqueue.rear->next = node;
38                 while(tmp != NULL) {
39                         prev = tmp;
40                         tmp = tmp->next;
41                 }
42                 mcqueue.rear = prev;
43         }
44 }
45
46 /* Return the node pointed to by the front ptr of the queue */
47 prefetchpile_t *mcpiledequeue(void) {
48         prefetchpile_t *retnode;
49         if(mcqueue.front == NULL) {
50                 printf("Machune pile queue empty: Underfloe %s %d\n", __FILE__, __LINE__);
51                 return NULL;
52         }
53         retnode = mcqueue.front;
54         mcqueue.front = mcqueue.front->next;
55         if (mcqueue.front == NULL)
56                 mcqueue.rear = NULL;
57         retnode->next = NULL;
58
59         return retnode;
60 }
61
62 /* Delete the node pointed to by the front ptr of the queue */
63 void delnode() {
64         prefetchpile_t *delnode;
65         if((mcqueue.front == NULL) && (mcqueue.rear == NULL)) {
66                 printf("The queue is empty: UNDERFLOW %s, %d\n", __FILE__, __LINE__);
67                 return;
68         } else if ((mcqueue.front == mcqueue.rear) && mcqueue.front != NULL && mcqueue.rear != NULL) {
69                 printf("TEST1\n");
70                 free(mcqueue.front);
71                 mcqueue.front = mcqueue.rear = NULL;
72         } else {
73                 delnode = mcqueue.front;
74                 mcqueue.front = mcqueue.front->next;
75                 printf("TEST2\n");
76                 free(delnode);
77         }
78 }
79
80 void mcpiledelete(void) {
81         /* Remove each element */
82         while(mcqueue.front != NULL)
83                 delqnode();
84         mcqueue.front = mcqueue.rear = NULL;
85 }
86
87
88 void mcpiledisplay() {
89         int mid;
90
91         prefetchpile_t *tmp = mcqueue.front;
92         while(tmp != NULL) {
93                 printf("Remote machine id = %d\n", tmp->mid);
94                 tmp = tmp->next;
95         }
96 }
97
98 /* Delete prefetchpile_t and everything it points to */
99 void mcdealloc(prefetchpile_t *node) {
100         prefetchpile_t *prefetchpile_ptr;
101         prefetchpile_t *prefetchpile_next_ptr;
102         objpile_t *objpile_ptr;
103         objpile_t *objpile_next_ptr;
104
105         prefetchpile_ptr = node;
106
107         while (prefetchpile_ptr != NULL)
108         {
109                 objpile_ptr = prefetchpile_ptr->objpiles;
110                 while (objpile_ptr != NULL)
111                 {
112                         if (objpile_ptr->numoffset > 0)
113                                 free(objpile_ptr->offset);
114                         objpile_next_ptr = objpile_ptr->next;
115                         free(objpile_ptr);
116                         objpile_ptr = objpile_next_ptr;
117                 }
118                 prefetchpile_next_ptr = prefetchpile_ptr->next;
119                 free(prefetchpile_ptr);
120                 prefetchpile_ptr = prefetchpile_next_ptr;
121         }
122 }
123
124