9 #include "mlp_runtime.h"
10 #include "workschedule.h"
14 __thread struct Queue* seseCallStack;
15 __thread pthread_once_t mlpOnceObj = PTHREAD_ONCE_INIT;
16 void mlpInitOncePerThread() {
17 seseCallStack = createQueue();
20 __thread SESEcommon_p seseCaller;
23 void* mlpAllocSESErecord( int size ) {
24 void* newrec = RUNMALLOC( size );
29 void mlpFreeSESErecord( void* seseRecord ) {
30 RUNFREE( seseRecord );
33 AllocSite* mlpCreateAllocSiteArray(int numAllocSites){
35 AllocSite* newAllocSite=(AllocSite*)RUNMALLOC( sizeof( AllocSite ) * numAllocSites );
36 for(i=0; i<numAllocSites; i++){
37 newAllocSite[i].waitingQueue=createQueue();
42 ConflictNode* mlpCreateConflictNode(int id){
43 ConflictNode* newConflictNode=(ConflictNode*)RUNMALLOC( sizeof( ConflictNode ) );
44 newConflictNode->id=id;
45 return newConflictNode;
48 WaitingElement* mlpCreateWaitingElement(int status, void* seseToIssue, struct Queue* queue, int id){
49 WaitingElement* newElement=(WaitingElement*)RUNMALLOC(sizeof(WaitingElement));
50 newElement->status=status;
51 newElement->seseRec=seseToIssue;
52 newElement->list=queue;
57 struct QueueItem* addWaitingQueueElement2(AllocSite* waitingQueueArray, int numWaitingQueue, int waitingID, WaitingElement* element){
60 struct QueueItem* newItem=NULL;
61 for(i=0;i<numWaitingQueue;i++){
62 if(waitingQueueArray[i].id==waitingID){
63 newItem=addNewItemBack(waitingQueueArray[i].waitingQueue,element);
65 //printf("add new item %d into waiting queue:%d\n",((SESEcommon*)seseRec)->classID,allocID);
72 struct QueueItem* addWaitingQueueElement(AllocSite* allocSiteArray, int numAllocSites, long allocID, void *seseRec){
75 struct QueueItem* newItem=NULL;
76 for(i=0;i<numAllocSites;i++){
77 if(allocSiteArray[i].id==allocID){
78 newItem=addNewItemBack(allocSiteArray[i].waitingQueue,seseRec);
80 //printf("add new item %d into waiting queue:%d\n",((SESEcommon*)seseRec)->classID,allocID);
86 int getQueueIdx(AllocSite* allocSiteArray, int numAllocSites, long allocID){
89 for(i=0;i<numAllocSites;i++){
90 if(allocSiteArray[i].id==allocID){
97 int isRunnable(struct Queue* waitingQueue, struct QueueItem* qItem){
99 if(!isEmpty(waitingQueue)){
101 struct QueueItem* current=getHead(waitingQueue);
102 while(current!=NULL){
104 if(isConflicted(current,qItem)){
110 current=getNextQueueItem(current);
116 int isConflicted(struct QueueItem* prevItem, struct QueueItem* item){
118 WaitingElement* element=item->objectptr;
119 WaitingElement* prevElement=prevItem->objectptr;
121 if(prevElement->id!=element->id){
123 if(element->status==0){ // fine read
125 if(prevElement->status==1 || prevElement->status==3){
127 if(isOverlapped(prevElement->list,element->list)){
135 }else if(element->status==1){ // fine write
136 if(isOverlapped(prevElement->list,element->list)){
139 }else if(element->status==2){// coarse read
141 if(prevElement->status==1 || prevElement->status==3){
142 if(isOverlapped(prevElement->list,element->list)){
147 }else if(element->status==3){// coarse write
156 int isOverlapped(struct Queue* prevList, struct Queue* itemList){
158 if(!isEmpty(prevList)){
159 struct QueueItem* queueItemA=getHead(prevList);
161 while(queueItemA!=NULL){
162 ConflictNode* nodeA=queueItemA->objectptr;
164 if(!isEmpty(itemList)){
165 struct QueueItem* queueItemB=getHead(itemList);
166 while(queueItemB!=NULL){
167 ConflictNode* nodeB=queueItemB->objectptr;
168 if(nodeA->id==nodeB->id){
171 queueItemB=getNextQueueItem(queueItemB);
174 queueItemA=getNextQueueItem(queueItemA);
181 int resolveWaitingQueue(struct Queue* waitingQueue,struct QueueItem* qItem){
183 if(!isEmpty(waitingQueue)){
185 SESEcommon* qCommon=qItem->objectptr;
187 struct QueueItem* current=getHead(waitingQueue);
188 while(current!=NULL){
190 SESEcommon* currentCommon=current->objectptr;
191 if(hasConflicts(currentCommon->classID,qCommon->connectedList)){
197 current=getNextQueueItem(current);
203 int hasConflicts(int classID, struct Queue* connectedList){
205 if(!isEmpty(connectedList)){
206 struct QueueItem* queueItem=getHead(connectedList);
208 while(queueItem!=NULL){
209 ConflictNode* node=queueItem->objectptr;
210 if(node->id==classID){
213 queueItem=getNextQueueItem(queueItem);
219 void addNewConflictNode(ConflictNode* node, struct Queue* connectedList){
221 if(!isEmpty(connectedList)){
222 struct QueueItem* qItem=getHead(connectedList);
224 ConflictNode* qNode=qItem->objectptr;
225 if(qNode->id==node->id){
228 qItem=getNextQueueItem(qItem);
232 addNewItem(connectedList,node);
236 int contains(struct Queue* queue, struct QueueItem* qItem){
239 struct QueueItem* nextQItem=getHead(queue);
240 while(nextQItem!=NULL){
241 if((nextQItem->objectptr)==qItem){
244 nextQItem=getNextQueueItem(nextQItem);