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 struct QueueItem* addWaitingQueueElement(AllocSite* allocSiteArray, int numAllocSites, long allocID, void *seseRec){
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);
56 //printf("add new item %d into waiting queue:%d\n",((SESEcommon*)seseRec)->classID,allocID);
62 int getQueueIdx(AllocSite* allocSiteArray, int numAllocSites, long allocID){
65 for(i=0;i<numAllocSites;i++){
66 if(allocSiteArray[i].id==allocID){
73 int resolveWaitingQueue(struct Queue* waitingQueue,struct QueueItem* qItem){
75 if(!isEmpty(waitingQueue)){
77 SESEcommon* qCommon=qItem->objectptr;
79 struct QueueItem* current=getHead(waitingQueue);
82 SESEcommon* currentCommon=current->objectptr;
83 if(hasConflicts(currentCommon->classID,qCommon->connectedList)){
89 current=getNextQueueItem(current);
95 int hasConflicts(int classID, struct Queue* connectedList){
97 if(!isEmpty(connectedList)){
98 struct QueueItem* queueItem=getHead(connectedList);
100 while(queueItem!=NULL){
101 ConflictNode* node=queueItem->objectptr;
102 if(node->id==classID){
105 queueItem=getNextQueueItem(queueItem);
111 void addNewConflictNode(ConflictNode* node, struct Queue* connectedList){
113 if(!isEmpty(connectedList)){
114 struct QueueItem* qItem=getHead(connectedList);
116 ConflictNode* qNode=qItem->objectptr;
117 if(qNode->id==node->id){
120 qItem=getNextQueueItem(qItem);
124 addNewItem(connectedList,node);
128 int contains(struct Queue* queue, struct QueueItem* qItem){
131 struct QueueItem* nextQItem=getHead(queue);
132 while(nextQItem!=NULL){
133 if((nextQItem->objectptr)==qItem){
136 nextQItem=getNextQueueItem(nextQItem);