Fixed : crashing due to pile creation
[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         //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, NULL); 
12         pthread_mutex_init(&mcqueue.qlock,&mcqueue.qlockattr); 
13         pthread_cond_init(&mcqueue.qcond, NULL); 
14 }
15
16 /* Insert to the rear of machine pile queue */
17 void mcpileenqueue(prefetchpile_t *node) {
18         prefetchpile_t *tmp, *prev;
19         if(mcqueue.front == NULL && mcqueue.rear == NULL) {
20                 mcqueue.front = mcqueue.rear = node;
21         } else {
22                 tmp = mcqueue.rear->next = node;
23                 while(tmp != NULL) {
24                         prev = tmp;
25                         tmp = tmp->next;
26                 }
27                 mcqueue.rear = prev;
28         }
29 }
30
31 /* Return the node pointed to by the front ptr of the queue */
32 prefetchpile_t *mcpiledequeue(void) {
33         prefetchpile_t *retnode;
34         if(mcqueue.front == NULL) {
35                 printf("Machune pile queue empty: Underfloe %s %d\n", __FILE__, __LINE__);
36                 return NULL;
37         }
38         retnode = mcqueue.front;
39         mcqueue.front = mcqueue.front->next;
40         if (mcqueue.front == NULL)
41                 mcqueue.rear = NULL;
42         retnode->next = NULL;
43
44         return retnode;
45 }
46
47 void mcpiledelete(void) {
48         /* Remove each element */
49         while(mcqueue.front != NULL)
50                 delqnode();
51         mcqueue.front = mcqueue.rear = NULL;
52 }
53
54
55 void mcpiledisplay() {
56         int mid;
57
58         prefetchpile_t *tmp = mcqueue.front;
59         while(tmp != NULL) {
60                 printf("Remote machine id = %d\n", tmp->mid);
61                 tmp = tmp->next;
62         }
63 }
64
65 /* Delete prefetchpile_t and everything it points to */
66 void mcdealloc(prefetchpile_t *node) {
67         prefetchpile_t *prefetchpile_ptr;
68         prefetchpile_t *prefetchpile_next_ptr;
69         objpile_t *objpile_ptr;
70         objpile_t *objpile_next_ptr;
71
72         prefetchpile_ptr = node;
73
74         while (prefetchpile_ptr != NULL)
75         {
76                 objpile_ptr = prefetchpile_ptr->objpiles;
77                 while (objpile_ptr != NULL)
78                 {
79                         if (objpile_ptr->numoffset > 0)
80                                 free(objpile_ptr->offset);
81                         objpile_next_ptr = objpile_ptr->next;
82                         free(objpile_ptr);
83                         objpile_ptr = objpile_next_ptr;
84                 }
85                 prefetchpile_next_ptr = prefetchpile_ptr->next;
86                 free(prefetchpile_ptr);
87                 prefetchpile_ptr = prefetchpile_next_ptr;
88         }
89 }
90
91