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 );
26 printf( "mlpAllocSESErecord did not obtain memory!\n" );
33 void mlpFreeSESErecord( void* seseRecord ) {
34 RUNFREE( seseRecord );
37 AllocSite* mlpCreateAllocSiteArray(int numAllocSites){
39 AllocSite* newAllocSite=(AllocSite*)RUNMALLOC( sizeof( AllocSite ) * numAllocSites );
40 for(i=0; i<numAllocSites; i++){
41 newAllocSite[i].waitingQueue=createQueue();
46 ConflictNode* mlpCreateConflictNode(int id){
47 ConflictNode* newConflictNode=(ConflictNode*)RUNMALLOC( sizeof( ConflictNode ) );
48 newConflictNode->id=id;
49 return newConflictNode;
52 WaitingElement* mlpCreateWaitingElement(int status, void* seseToIssue, struct Queue* queue, int id){
53 WaitingElement* newElement=(WaitingElement*)RUNMALLOC(sizeof(WaitingElement));
54 newElement->status=status;
55 newElement->seseRec=seseToIssue;
56 newElement->list=queue;
61 struct QueueItem* addWaitingQueueElement2(AllocSite* waitingQueueArray, int numWaitingQueue, int waitingID, WaitingElement* element){
64 struct QueueItem* newItem=NULL;
65 for(i=0;i<numWaitingQueue;i++){
66 if(waitingQueueArray[i].id==waitingID){
67 newItem=addNewItemBack(waitingQueueArray[i].waitingQueue,element);
69 //printf("add new item %d into waiting queue:%d\n",((SESEcommon*)seseRec)->classID,allocID);
76 struct QueueItem* addWaitingQueueElement(AllocSite* allocSiteArray, int numAllocSites, long allocID, void *seseRec){
79 struct QueueItem* newItem=NULL;
80 for(i=0;i<numAllocSites;i++){
81 if(allocSiteArray[i].id==allocID){
82 newItem=addNewItemBack(allocSiteArray[i].waitingQueue,seseRec);
84 //printf("add new item %d into waiting queue:%d\n",((SESEcommon*)seseRec)->classID,allocID);
90 int getQueueIdx(AllocSite* allocSiteArray, int numAllocSites, long allocID){
93 for(i=0;i<numAllocSites;i++){
94 if(allocSiteArray[i].id==allocID){
101 int isRunnable(struct Queue* waitingQueue, struct QueueItem* qItem){
103 if(!isEmpty(waitingQueue)){
105 struct QueueItem* current=getHead(waitingQueue);
106 while(current!=NULL){
108 if(isConflicted(current,qItem)){
114 current=getNextQueueItem(current);
120 int isConflicted(struct QueueItem* prevItem, struct QueueItem* item){
122 WaitingElement* element=item->objectptr;
123 WaitingElement* prevElement=prevItem->objectptr;
125 if(prevElement->id!=element->id){
127 if(element->status==0){ // fine read
129 if(prevElement->status==1 || prevElement->status==3){
131 if(isOverlapped(prevElement->list,element->list)){
139 }else if(element->status==1){ // fine write
140 if(isOverlapped(prevElement->list,element->list)){
143 }else if(element->status==2){// coarse read
145 if(prevElement->status==1 || prevElement->status==3){
146 if(isOverlapped(prevElement->list,element->list)){
151 }else if(element->status==3){// coarse write
160 int isOverlapped(struct Queue* prevList, struct Queue* itemList){
162 if(!isEmpty(prevList)){
163 struct QueueItem* queueItemA=getHead(prevList);
165 while(queueItemA!=NULL){
166 ConflictNode* nodeA=queueItemA->objectptr;
168 if(!isEmpty(itemList)){
169 struct QueueItem* queueItemB=getHead(itemList);
170 while(queueItemB!=NULL){
171 ConflictNode* nodeB=queueItemB->objectptr;
172 if(nodeA->id==nodeB->id){
175 queueItemB=getNextQueueItem(queueItemB);
178 queueItemA=getNextQueueItem(queueItemA);
185 int resolveWaitingQueue(struct Queue* waitingQueue,struct QueueItem* qItem){
187 if(!isEmpty(waitingQueue)){
189 SESEcommon* qCommon=qItem->objectptr;
191 struct QueueItem* current=getHead(waitingQueue);
192 while(current!=NULL){
194 SESEcommon* currentCommon=current->objectptr;
195 if(hasConflicts(currentCommon->classID,qCommon->connectedList)){
201 current=getNextQueueItem(current);
207 int hasConflicts(int classID, struct Queue* connectedList){
209 if(!isEmpty(connectedList)){
210 struct QueueItem* queueItem=getHead(connectedList);
212 while(queueItem!=NULL){
213 ConflictNode* node=queueItem->objectptr;
214 if(node->id==classID){
217 queueItem=getNextQueueItem(queueItem);
223 void addNewConflictNode(ConflictNode* node, struct Queue* connectedList){
225 if(!isEmpty(connectedList)){
226 struct QueueItem* qItem=getHead(connectedList);
228 ConflictNode* qNode=qItem->objectptr;
229 if(qNode->id==node->id){
232 qItem=getNextQueueItem(qItem);
236 addNewItem(connectedList,node);
240 int contains(struct Queue* queue, struct QueueItem* qItem){
243 struct QueueItem* nextQItem=getHead(queue);
244 while(nextQItem!=NULL){
245 if((nextQItem->objectptr)==qItem){
248 nextQItem=getNextQueueItem(nextQItem);