3 mcpileq_t mcqueue; //Global queue
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);
16 /* Insert to the rear of machine pile queue */
17 void mcpileenqueue(prefetchpile_t *node, prefetchpile_t *tail) {
18 if(mcqueue.front == NULL && mcqueue.rear == NULL) {
22 mcqueue.rear->next = node;
27 /* Return the node pointed to by the front ptr of the queue */
28 prefetchpile_t *mcpiledequeue(void) {
29 prefetchpile_t *retnode;
30 if(mcqueue.front == NULL) {
31 printf("Machine pile queue empty: Underflow %s %d\n", __FILE__, __LINE__);
34 retnode = mcqueue.front;
35 mcqueue.front = mcqueue.front->next;
36 if (mcqueue.front == NULL)
43 void mcpiledelete(void) {
44 /* Remove each element */
45 while(mcqueue.front != NULL)
47 mcqueue.front = mcqueue.rear = NULL;
51 void mcpiledisplay() {
54 prefetchpile_t *tmp = mcqueue.front;
56 printf("Remote machine id = %d\n", tmp->mid);
61 /* Delete prefetchpile_t and everything it points to */
62 void mcdealloc(prefetchpile_t *node) {
63 prefetchpile_t *prefetchpile_ptr;
64 prefetchpile_t *prefetchpile_next_ptr;
65 objpile_t *objpile_ptr;
66 objpile_t *objpile_next_ptr;
68 prefetchpile_ptr = node;
70 while (prefetchpile_ptr != NULL)
72 prefetchpile_next_ptr = prefetchpile_ptr;
73 while(prefetchpile_ptr->objpiles != NULL) {
74 if(prefetchpile_ptr->objpiles->numoffset > 0) {
75 free(prefetchpile_ptr->objpiles->offset);
77 objpile_ptr = prefetchpile_ptr->objpiles;
78 prefetchpile_ptr->objpiles = objpile_ptr->next;
81 prefetchpile_ptr = prefetchpile_next_ptr->next;
82 free(prefetchpile_next_ptr);