various bug fixes.
[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         } else {
31                 tmp = mcqueue.rear->next = node;
32                 while(tmp != NULL) {
33                         prev = tmp;
34                         tmp = tmp->next;
35                 }
36                 mcqueue.rear = prev;
37         }
38 }
39
40 /* Return the node pointed to by the front ptr of the queue */
41 prefetchpile_t *mcpiledequeue(void) {
42         prefetchpile_t *retnode;
43         if(mcqueue.front == NULL) {
44                 printf("Machune pile queue empty: Underfloe %s %d\n", __FILE__, __LINE__);
45                 return NULL;
46         }
47         retnode = mcqueue.front;
48         mcqueue.front = mcqueue.front->next;
49         if (mcqueue.front == NULL)
50                 mcqueue.rear = NULL;
51         retnode->next = NULL;
52
53         return retnode;
54 }
55
56 void mcpiledelete(void) {
57         /* Remove each element */
58         while(mcqueue.front != NULL)
59                 delqnode();
60         mcqueue.front = mcqueue.rear = NULL;
61 }
62
63
64 void mcpiledisplay() {
65         int mid;
66
67         prefetchpile_t *tmp = mcqueue.front;
68         while(tmp != NULL) {
69                 printf("Remote machine id = %d\n", tmp->mid);
70                 tmp = tmp->next;
71         }
72 }
73
74 /* Delete prefetchpile_t and everything it points to */
75 void mcdealloc(prefetchpile_t *node) {
76         prefetchpile_t *prefetchpile_ptr;
77         prefetchpile_t *prefetchpile_next_ptr;
78         objpile_t *objpile_ptr;
79         objpile_t *objpile_next_ptr;
80
81         prefetchpile_ptr = node;
82
83         while (prefetchpile_ptr != NULL)
84         {
85                 objpile_ptr = prefetchpile_ptr->objpiles;
86                 while (objpile_ptr != NULL)
87                 {
88                         if (objpile_ptr->numoffset > 0)
89                                 free(objpile_ptr->offset);
90                         objpile_next_ptr = objpile_ptr->next;
91                         free(objpile_ptr);
92                         objpile_ptr = objpile_next_ptr;
93                 }
94                 prefetchpile_next_ptr = prefetchpile_ptr->next;
95                 free(prefetchpile_ptr);
96                 prefetchpile_ptr = prefetchpile_next_ptr;
97         }
98 }
99
100