changes.
[IRC.git] / Robust / src / Runtime / mlp_runtime.c
1 #include "runtime.h"
2
3 #include <stdlib.h>
4 #include <stdio.h>
5 #include <assert.h>
6
7 #include "mem.h"
8 #include "Queue.h"
9 #include "mlp_runtime.h"
10 #include "workschedule.h"
11
12
13 /*
14 __thread struct Queue* seseCallStack;
15 __thread pthread_once_t mlpOnceObj = PTHREAD_ONCE_INIT;
16 void mlpInitOncePerThread() {
17   seseCallStack = createQueue();
18 }
19 */
20 __thread SESEcommon_p seseCaller;
21
22
23 void* mlpAllocSESErecord( int size ) {
24   void* newrec = RUNMALLOC( size );  
25   return newrec;
26 }
27
28
29 void mlpFreeSESErecord( void* seseRecord ) {
30   RUNFREE( seseRecord );
31 }
32
33 AllocSite* mlpCreateAllocSiteArray(int numAllocSites){
34   int i;
35   AllocSite* newAllocSite=(AllocSite*)RUNMALLOC( sizeof( AllocSite ) * numAllocSites );
36   for(i=0; i<numAllocSites; i++){
37     newAllocSite[i].waitingQueue=createQueue();
38   }
39   return newAllocSite;
40 }
41
42 ConflictNode* mlpCreateConflictNode(int id){
43   ConflictNode* newConflictNode=(ConflictNode*)RUNMALLOC( sizeof( ConflictNode ) );
44   newConflictNode->id=id;
45   return newConflictNode;
46 }
47
48 struct QueueItem* addWaitingQueueElement(AllocSite* allocSiteArray, int numAllocSites, long allocID, void *seseRec){
49
50   int i;
51   struct QueueItem* newItem=NULL;
52   for(i=0;i<numAllocSites;i++){
53     if(allocSiteArray[i].id==allocID){
54       newItem=addNewItemBack(allocSiteArray[i].waitingQueue,seseRec);
55       return newItem;
56       //printf("add new item %d into waiting queue:%d\n",((SESEcommon*)seseRec)->classID,allocID);
57     }
58   }
59   return newItem;
60 }
61
62 int getQueueIdx(AllocSite* allocSiteArray, int numAllocSites, long  allocID){
63
64   int i;
65   for(i=0;i<numAllocSites;i++){
66     if(allocSiteArray[i].id==allocID){
67       return i;      
68     }
69   }
70   return -1;
71 }
72
73 int resolveWaitingQueue(struct Queue* waitingQueue,struct QueueItem* qItem){
74
75   if(!isEmpty(waitingQueue)){
76
77     SESEcommon* qCommon=qItem->objectptr;
78     
79     struct QueueItem* current=getHead(waitingQueue);
80     while(current!=NULL){
81          if(current!=qItem){
82            SESEcommon* currentCommon=current->objectptr;
83            if(hasConflicts(currentCommon->classID,qCommon->connectedList)){
84              return 0;
85            }
86          }else{
87            return 1;
88          }
89          current=getNextQueueItem(current);
90     }
91   }
92   return 1;
93 }
94
95 int hasConflicts(int classID, struct Queue* connectedList){
96   
97   if(!isEmpty(connectedList)){
98     struct QueueItem* queueItem=getHead(connectedList); 
99     
100     while(queueItem!=NULL){
101       ConflictNode* node=queueItem->objectptr;
102       if(node->id==classID){
103         return 1;
104       }
105       queueItem=getNextQueueItem(queueItem);      
106     }
107   }
108   return 0;
109 }
110
111 void addNewConflictNode(ConflictNode* node, struct Queue* connectedList){
112   
113   if(!isEmpty(connectedList)){
114     struct QueueItem* qItem=getHead(connectedList);
115     while(qItem!=NULL){
116       ConflictNode* qNode=qItem->objectptr;
117       if(qNode->id==node->id){
118         return;
119       }
120       qItem=getNextQueueItem(qItem);
121     }
122   }
123
124   addNewItem(connectedList,node);
125
126 }
127
128 int contains(struct Queue* queue, struct QueueItem* qItem){
129
130   if(!isEmpty(queue)){
131     struct QueueItem* nextQItem=getHead(queue);
132     while(nextQItem!=NULL){
133       if((nextQItem->objectptr)==qItem){
134         return 1;
135       } 
136       nextQItem=getNextQueueItem(nextQItem);
137     }
138   }
139
140   return 0;
141
142 }