if(rcr != null) {
rcr.close();
System.out.println("Runtime Conflict Resolver Done.");
- }
+ }
}
/* This method goes though the call graph and tag those methods that are
if( !fsen.getIsLeafSESE() ) {
output.println(" runningSESE->taskRecordMemPool = poolcreate( "+
maxTaskRecSizeStr+", freshTaskRecordInitializer );");
+ if (state.RCR) {
+ output.println(" createTR();");
+ output.println(" runningSESE->allHashStructures=TRqueue->allHashStructures;");
+ }
} else {
// make it clear we purposefully did not initialize this
output.println(" runningSESE->taskRecordMemPool = (MemPool*)0x7;");
throw new Error();
}
+
+ void stallMEMRCR(FlatMethod fm, FlatNode fn, Set<Analysis.OoOJava.WaitingElement> waitingElementSet, PrintWriter output) {
+ output.println("// stall on parent's stall sites ");
+ output.println(" {");
+ output.println(" REntry* rentry;");
+ output.println(" SESEstall * stallrecord=(SESEstall *) poolalloc(runningSESE->taskRecordMemPool);");
+ output.println(" stallrecord->common.unresolvedDependencies=10000;");
+ output.println(" stallrecord->common.rcrstatus=1;");
+ output.println(" stallrecord->common.offsetToParamRecords=(INTPTR) & (((SESEstall *)0)->rcrRecords);");
+ output.println(" stallrecord->common.refCount = 3;");
+ output.println(" stallrecord->tag=rentry->tag;");
+ output.println(" int localCount=10000;");
+ output.println(" stallrecord->rcrRecords[0].index=0;");
+ output.println(" stallrecord->rcrRecords[0].flag=0;");
+ output.println(" stallrecord->rcrRecords[0].next=NULL;");
+ output.println(" stallrecord->common.parentsStallSem=&runningSESEstallSem;");
+
+ TempDescriptor stalltd=null;
+ for (Iterator iterator = waitingElementSet.iterator(); iterator.hasNext();) {
+ Analysis.OoOJava.WaitingElement waitingElement =(Analysis.OoOJava.WaitingElement) iterator.next();
+ if (waitingElement.getStatus() >= ConflictNode.COARSE) {
+ output.println(" rentry=mlpCreateREntry(runningSESE->memoryQueueArray["
+ + waitingElement.getQueueID() + "]," + waitingElement.getStatus()
+ + ", (SESEcommon *) stallrecord, 1LL);");
+ } else {
+ throw new Error("Fine-grained conflict: This should not happen in RCR");
+ }
+ output.println(" rentry->parentStallSem=&runningSESEstallSem;");
+ output.println(" psem_reset( &runningSESEstallSem);");
+ output.println(" rentry->tag=runningSESEstallSem.tag;");
+ output.println(" rentry->queue=runningSESE->memoryQueueArray["
+ + waitingElement.getQueueID() + "];");
+ output.println(" if(ADDRENTRY(runningSESE->memoryQueueArray["
+ + waitingElement.getQueueID() + "],rentry)==READY) ");
+ output.println(" localCount--;");
+ if (stalltd==null) {
+ stalltd=waitingElement.getTempDesc();
+ } else if (stalltd!=waitingElement.getTempDesc()) {
+ throw new Error("Multiple temp descriptors at stall site"+stalltd+"!="+waitingElement.getTempDesc());
+ }
+ }
+
+ //did all of the course grained stuff
+ output.println(" if(!atomic_sub_and_test(localCount, &(stallrecord->common.unresolvedDependencies))) {");
+ //have to do fine-grained work also
+ output.println(" stallrecord->___obj___=(struct ___Object___ *)"
+ + generateTemp(fm, stalltd, null) + ";");
+ output.println(" stallrecord->common.classID=-"
+ + rcr.getTraverserID(stalltd, fn) + ";");
+
+ output.println(" enqueueTR(TRqueue, (void *)stallrecord);");
+
+ if (state.COREPROF) {
+ output.println("#ifdef CP_EVENTID_TASKSTALLMEM");
+ output
+ .println(" CP_LOGEVENT( CP_EVENTID_TASKSTALLMEM, CP_EVENTTYPE_BEGIN );");
+ output.println("#endif");
+ }
+
+ output.println(" psem_take( &runningSESEstallSem, (struct garbagelist *)&___locals___ );");
+
+ if (state.COREPROF) {
+ output.println("#ifdef CP_EVENTID_TASKSTALLMEM");
+ output
+ .println(" CP_LOGEVENT( CP_EVENTID_TASKSTALLMEM, CP_EVENTTYPE_END );");
+ output.println("#endif");
+ }
+
+ output.println(" } else {");//exit if condition
+ //release traversers reference if we didn't use traverser
+ output.println("#ifndef OOO_DISABLE_TASKMEMPOOL");
+ output.println(" RELEASE_REFERENCE_TO((SESEcommon *)stallrecord);");
+ output.println("#endif");
+ output.println(" }");
+ //release our reference to stall record
+ output.println("#ifndef OOO_DISABLE_TASKMEMPOOL");
+ output.println(" RELEASE_REFERENCE_TO((SESEcommon *)stallrecord);");
+ output.println("#endif");
+ output.println(" }");//exit block
+ }
+
protected void generateFlatNode(FlatMethod fm, LocalityBinding lb, FlatNode fn, PrintWriter output) {
// insert pre-node actions from the code plan
Set<Analysis.OoOJava.WaitingElement> waitingElementSet = graph.getStallSiteWaitingElementSet(fn, seseLockSet);
if (waitingElementSet.size() > 0) {
- output.println("// stall on parent's stall sites ");
- output.println(" {");
- output.println(" REntry* rentry;");
-
- for (Iterator iterator = waitingElementSet.iterator(); iterator.hasNext();) {
- Analysis.OoOJava.WaitingElement waitingElement =
- (Analysis.OoOJava.WaitingElement) iterator.next();
- if (waitingElement.getStatus() >= ConflictNode.COARSE) {
- if (state.RCR) {
- output.println(" rentry=mlpCreateREntry(runningSESE->memoryQueueArray["
- + waitingElement.getQueueID() + "]," + waitingElement.getStatus()
- + ", runningSESE, 1LL);");
- } else {
- output.println(" rentry=mlpCreateREntry(runningSESE->memoryQueueArray["
- + waitingElement.getQueueID() + "]," + waitingElement.getStatus()
- + ", runningSESE);");
- }
- } else {
- output.println(" rentry=mlpCreateFineREntry(runningSESE->memoryQueueArray["
- + waitingElement.getQueueID() + "]," + waitingElement.getStatus()
- + ", runningSESE, (void*)&"
- + generateTemp(fm, waitingElement.getTempDesc(), lb) + ");");
- }
- output.println(" rentry->parentStallSem=&runningSESEstallSem;");
- output.println(" psem_reset( &runningSESEstallSem);");
- output.println(" rentry->tag=runningSESEstallSem.tag;");
- output.println(" rentry->queue=runningSESE->memoryQueueArray["
- + waitingElement.getQueueID() + "];");
- output.println(" if(ADDRENTRY(runningSESE->memoryQueueArray["
- + waitingElement.getQueueID() + "],rentry)==NOTREADY){");
- if (state.COREPROF) {
- output.println("#ifdef CP_EVENTID_TASKSTALLMEM");
- output
+ if (state.RCR) {
+ stallMEMRCR(fm, fn, waitingElementSet, output);
+ } else {
+ output.println("// stall on parent's stall sites ");
+ output.println(" {");
+ output.println(" REntry* rentry;");
+
+ for (Iterator iterator = waitingElementSet.iterator(); iterator.hasNext();) {
+ Analysis.OoOJava.WaitingElement waitingElement =
+ (Analysis.OoOJava.WaitingElement) iterator.next();
+ if (waitingElement.getStatus() >= ConflictNode.COARSE) {
+ output.println(" rentry=mlpCreateREntry(runningSESE->memoryQueueArray["
+ + waitingElement.getQueueID() + "]," + waitingElement.getStatus()
+ + ", runningSESE);");
+ } else {
+ output.println(" rentry=mlpCreateFineREntry(runningSESE->memoryQueueArray["
+ + waitingElement.getQueueID() + "]," + waitingElement.getStatus()
+ + ", runningSESE, (void*)&"
+ + generateTemp(fm, waitingElement.getTempDesc(), lb) + ");");
+ }
+ output.println(" rentry->parentStallSem=&runningSESEstallSem;");
+ output.println(" psem_reset( &runningSESEstallSem);");
+ output.println(" rentry->tag=runningSESEstallSem.tag;");
+ output.println(" rentry->queue=runningSESE->memoryQueueArray["
+ + waitingElement.getQueueID() + "];");
+ output.println(" if(ADDRENTRY(runningSESE->memoryQueueArray["
+ + waitingElement.getQueueID() + "],rentry)==NOTREADY){");
+ if (state.COREPROF) {
+ output.println("#ifdef CP_EVENTID_TASKSTALLMEM");
+ output
.println(" CP_LOGEVENT( CP_EVENTID_TASKSTALLMEM, CP_EVENTTYPE_BEGIN );");
- output.println("#endif");
- }
- if (state.RCR) {
- // no need to enqueue parent effect if coarse grained conflict
- // clears us
-
- output.println(" while(stallrecord.common.rcrstatus) BARRIER();");
- // was the code above actually meant to look like this?
- // output.println(" while(stallrecord.common.rcrstatus) {");
- // output.println(" BARRIER();");
- // output.println(" sched_yield();");
- // output.println(" }");
-
- output.println(" stallrecord.common.parentsStallSem=&runningSESEstallSem;");
- output.println(" stallrecord.tag=rentry->tag;");
- output.println(" stallrecord.___obj___=(struct ___Object___ *)"
- + generateTemp(fm, waitingElement.getTempDesc(), null) + ";");
- output.println(" stallrecord.common.classID=-"
- + rcr.getTraverserID(waitingElement.getTempDesc(), fn) + ";");
- // mark the record used..so we won't use it again until it is
- // free
- // clear rcrRecord
- output.println(" stallrecord.rcrRecords[0].index=0;");
- output.println(" stallrecord.rcrRecords[0].flag=0;");
- output.println(" stallrecord.rcrRecords[0].next=NULL;");
- output.println(" stallrecord.common.rcrstatus=1;");
- output.println(" enqueueTR(TRqueue, (void *)&stallrecord);");
- }
-
- output
- .println(" psem_take( &runningSESEstallSem, (struct garbagelist *)&___locals___ );");
-
- if (state.RCR) {
- output.println(" stallrecord.common.rcrstatus=0;");
- }
-
- if (state.COREPROF) {
- output.println("#ifdef CP_EVENTID_TASKSTALLMEM");
- output
+ output.println("#endif");
+ }
+
+ output.println(" psem_take( &runningSESEstallSem, (struct garbagelist *)&___locals___ );");
+
+ if (state.COREPROF) {
+ output.println("#ifdef CP_EVENTID_TASKSTALLMEM");
+ output
.println(" CP_LOGEVENT( CP_EVENTID_TASKSTALLMEM, CP_EVENTTYPE_END );");
- output.println("#endif");
- }
- output.println(" } ");
- }
- output.println(" }");
- }
- }
- }else{
+ output.println("#endif");
+ }
+ output.println(" } ");
+ }
+ output.println(" }");
+ }
+ }
+ }
+ } else{
ParentChildConflictsMap conflictsMap = mlpa.getConflictsResults().get(fn);
if (conflictsMap != null) {
Set<Long> allocSet = conflictsMap.getAllocationSiteIDSetofStallSite();
output.println(" }");
}
-
-
if( state.COREPROF ) {
output.println("#ifdef CP_EVENTID_PREPAREMEMQ");
output.println(" CP_LOGEVENT( CP_EVENTID_PREPAREMEMQ, CP_EVENTTYPE_BEGIN );");
output.println(" }");
output.println("{");
output.println(" int idx,idx2;");
- if(inset.size()==1){
- output.println(" idx=0; {");
- } else {
- output.println(" for(idx=0;idx<" + inset.size() + ";idx++){");
+
+ //NEED TO FIX THIS
+ //XXXXXXXXX
+ output.println(" struct rcrRecord *rec;");
+ output.println(" struct Hashtable_rcr ** hashstruct=runningSESE->parent->allHashStructures;");
+ for(int i=0;i<inset.size();i++) {
+ output.println(" rec=&" + paramsprefix + "->rcrRecords["+i+"];");
+ output.println(" while(rec!=NULL) {");
+ output.println(" for(idx2=0;idx2<rec->index;idx2++) {");
+ output.println(" rcr_RETIREHASHTABLE(hashstruct["+rcr.getWeakID(inset.get(i),fsen)+"],&(___params___->common), rec->array[idx2], (BinItem_rcr *) rec->ptrarray[idx2]);");
+ output.println(" }");// exit idx2 for loop
+ output.println(" rec=rec->next;");
+ output.println(" }");// exit rec while loop
}
- output.println(" struct rcrRecord *rec=&" + paramsprefix + "->rcrRecords[idx];");
- output.println(" while(rec!=NULL) {");
- output.println(" for(idx2=0;idx2<rec->index;idx2++) {");
- output
- .println(" rcr_RETIREHASHTABLE(allHashStructures[0],&(___params___->common),rec->array[idx2], (BinItem_rcr *) rec->ptrarray[idx2]);");
- output.println(" }");// exit idx2 for loop
- output.println(" rec=rec->next;");
- output.println(" }");// exit rec while loop
- output.println(" }");// exit idx for loop
output.println("}");
}
// destroy this task's mempool if it is not a leaf task
if( !fsen.getIsLeafSESE() ) {
output.println(" pooldestroy( runningSESE->taskRecordMemPool );");
+ if (state.RCR) {
+ output.println(" returnTR();");
+ }
}
output.println("#endif // OOO_DISABLE_TASKMEMPOOL" );
//The Integer keeps track of the weakly connected group it's in (used in enumerateHeapRoots)
private Hashtable<Taint, Integer> doneTaints;
private Hashtable<Tuple, Integer> idMap=new Hashtable<Tuple,Integer>();
+ private Hashtable<Tuple, Integer> weakMap=new Hashtable<Tuple,Integer>();
private Hashtable<Taint, Set<Effect>> globalEffects;
private Hashtable<Taint, Set<Effect>> globalConflicts;
private ArrayList<TraversalInfo> toTraverse;
removeInvalidChars(flatname) + "___("+varString+");";
}
+ public int getWeakID(TempDescriptor invar, FlatNode fn) {
+ return weakMap.get(new Tuple(invar, fn)).intValue();
+ }
+
public int getTraverserID(TempDescriptor invar, FlatNode fn) {
Tuple t=new Tuple(invar, fn);
if (idMap.containsKey(t))
//TODO: This is only temporary, remove when thread local variables are functional.
private void createMasterHashTableArray() {
- headerFile.println("void createAndFillMasterHashStructureArray();");
- cFile.println("void createAndFillMasterHashStructureArray() {\n" +
- " rcr_createMasterHashTableArray("+weaklyConnectedHRCounter + ");");
+ headerFile.println("struct Hashtable_rcr ** createAndFillMasterHashStructureArray();");
+ cFile.println("struct Hashtable_rcr ** createAndFillMasterHashStructureArray() {");
+ cFile.println(" struct Hashtable_rcr **table=rcr_createMasterHashTableArray("+weaklyConnectedHRCounter + ");");
for(int i = 0; i < weaklyConnectedHRCounter; i++) {
- cFile.println(" allHashStructures["+i+"] = (HashStructure *) rcr_createHashtable("+num2WeaklyConnectedHRGroup.get(i).connectedHRs.size()+");");
+ cFile.println(" table["+i+"] = (struct Hashtable_rcr *) rcr_createHashtable("+num2WeaklyConnectedHRGroup.get(i).connectedHRs.size()+");");
}
+ cFile.println(" return table;");
cFile.println("}");
}
private void printMasterTraverserInvocation() {
headerFile.println("\nint tasktraverse(SESEcommon * record);");
cFile.println("\nint tasktraverse(SESEcommon * record) {");
- cFile.println(" if(!CAS(&record->rcrstatus,1,2)) return;");
+ cFile.println(" if(!CAS(&record->rcrstatus,1,2)) {");
+ //release traverser reference...no traversal necessary
+ cFile.println("#ifndef OOO_DISABLE_TASKMEMPOOL");
+ cFile.println(" RELEASE_REFERENCE_TO(record);");
+ cFile.println("#endif");
+ cFile.println(" return;");
+ cFile.println(" }");
cFile.println(" switch(record->classID) {");
for(Iterator<FlatSESEEnterNode> seseit=oooa.getAllSESEs().iterator();seseit.hasNext();) {
cFile.println(" default:\n printf(\"Invalid SESE ID was passed in: %d.\\n\",record->classID);\n break;");
cFile.println(" }");
+ //release traverser reference...traversal finished...
+ //executing thread will clean bins for us
+ cFile.println("#ifndef OOO_DISABLE_TASKMEMPOOL");
+ cFile.println(" RELEASE_REFERENCE_TO(record);");
+ cFile.println("#endif");
cFile.println("}");
}
cFile.println(" return;");
} else {
cFile.println(" int totalcount=RUNBIAS;");
- if (taint.isStallSiteTaint()) {
+ if (!taint.isStallSiteTaint()) {
cFile.println(" record->rcrRecords[0].count=RUNBIAS;");
- cFile.println(" record->rcrRecords[0].index=0;");
- cFile.println(" record->rcrRecords[0].next=NULL;");
} else {
cFile.println(" record->rcrRecords["+index+"].count=RUNBIAS;");
- cFile.println(" record->rcrRecords["+index+"].index=0;");
- cFile.println(" record->rcrRecords["+index+"].next=NULL;");
}
//clears queue and hashtable that keeps track of where we've been.
cFile.println(" if(atomic_sub_and_test(RUNBIAS-totalcount,&(record->rcrRecords[0].count))) {");
cFile.println(" psem_give_tag(record->common.parentsStallSem, record->tag);");
cFile.println(" BARRIER();");
- cFile.println(" record->common.rcrstatus=0;");
cFile.println("}");
+ cFile.println(" record->common.rcrstatus=0;");
} else {
cFile.println(" if(atomic_sub_and_test(RUNBIAS-totalcount,&(record->rcrRecords["+index+"].count))) {");
cFile.println(" int flag=LOCKXCHG32(&(record->rcrRecords["+index+"].flag),0);");
num2WeaklyConnectedHRGroup.add(weaklyConnectedHRCounter, hg);
weaklyConnectedHRCounter++;
}
+ if(t.isRBlockTaint()) {
+ int id=connectedHRHash.get(t).id;
+ Tuple tup=new Tuple(t.getVar(),t.getSESE());
+ if (weakMap.containsKey(tup)) {
+ if (weakMap.get(tup).intValue()!=id)
+ throw new Error("Var/SESE not unique for weak component.");
+ } else weakMap.put(tup, new Integer(id));
+ }
}
}