major changes to prefetching code
[IRC.git] / Robust / src / Runtime / DSTM / interface / mcpileq.c
1 #include "mcpileq.h"
2
3 mcpileq_t mcqueue; //Global queue
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   //Intiliaze and set machile pile queue's mutex attribute
9   pthread_mutexattr_init(&mcqueue.qlockattr);
10   pthread_mutexattr_settype(&mcqueue.qlockattr, PTHREAD_MUTEX_RECURSIVE_NP);
11   pthread_mutex_init(&mcqueue.qlock,&mcqueue.qlockattr); 
12   pthread_cond_init(&mcqueue.qcond, NULL); 
13 }
14
15 /* Insert to the rear of machine pile queue */
16 void mcpileenqueue(prefetchpile_t *node, prefetchpile_t *tail) {
17   if(mcqueue.front == NULL) {
18     mcqueue.front = node;
19     mcqueue.rear = tail;
20   } else {
21     mcqueue.rear->next = node;
22     mcqueue.rear = tail;
23   }
24 }
25
26 /* Return the node pointed to by the front ptr of the queue */
27 prefetchpile_t *mcpiledequeue(void) {
28   prefetchpile_t *retnode=mcqueue.front;
29   if(retnode == NULL) {
30     printf("Machine pile queue empty: Underflow %s %d\n", __FILE__, __LINE__);
31     return NULL;
32   }
33   mcqueue.front = retnode->next;
34   if (mcqueue.front == NULL)
35     mcqueue.rear = NULL;
36   retnode->next = NULL;
37   
38   return retnode;
39 }
40
41 void mcpiledelete(void) {
42   /* Remove each element */
43   while(mcqueue.front != NULL)
44     delqnode();
45 }
46
47
48 void mcpiledisplay() {
49   int mid;
50   
51   prefetchpile_t *tmp = mcqueue.front;
52   while(tmp != NULL) {
53     printf("Remote machine id = %d\n", tmp->mid);
54     tmp = tmp->next;
55   }
56 }
57
58 /* Delete prefetchpile_t and everything it points to */
59 void mcdealloc(prefetchpile_t *node) {
60   prefetchpile_t *prefetchpile_ptr;
61   prefetchpile_t *prefetchpile_next_ptr;
62   objpile_t *objpile_ptr;
63   objpile_t *objpile_next_ptr;
64   
65   prefetchpile_ptr = node;
66   
67   while (prefetchpile_ptr != NULL) {
68     prefetchpile_next_ptr = prefetchpile_ptr;
69     while(prefetchpile_ptr->objpiles != NULL) {
70       //offsets aren't owned by us, so we don't free them.
71       objpile_ptr = prefetchpile_ptr->objpiles;
72       prefetchpile_ptr->objpiles = objpile_ptr->next;
73       free(objpile_ptr);
74     }
75     prefetchpile_ptr = prefetchpile_next_ptr->next;
76     free(prefetchpile_next_ptr);
77   }
78 }