From 240cd6b776fccbbbc69db82b0fc6b7230cd48a90 Mon Sep 17 00:00:00 2001 From: bdemsky Date: Fri, 22 Oct 2010 21:02:40 +0000 Subject: [PATCH] more core...fix traversers... --- Robust/src/IR/Flat/BuildCode.java | 11 +++++---- .../src/IR/Flat/RuntimeConflictResolver.java | 24 ++++++++++++++++++- Robust/src/Runtime/oooJava/hashStructure.c | 2 +- Robust/src/Runtime/oooJava/rcr_runtime.h | 3 +-- Robust/src/Runtime/workschedule.c | 2 +- Robust/src/Util/Tuple.java | 19 +++++++++++++++ 6 files changed, 51 insertions(+), 10 deletions(-) create mode 100644 Robust/src/Util/Tuple.java diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java index ef1d21b4..bf81596b 100644 --- a/Robust/src/IR/Flat/BuildCode.java +++ b/Robust/src/IR/Flat/BuildCode.java @@ -3229,8 +3229,7 @@ public class BuildCode { Analysis.OoOJava.ConflictGraph graph = oooa.getConflictGraph(currentSESE); if(graph!=null){ Set seseLockSet = oooa.getLockMappings(graph); - Set waitingElementSet = - graph.getStallSiteWaitingElementSet(fn, seseLockSet); + Set waitingElementSet = graph.getStallSiteWaitingElementSet(fn, seseLockSet); if(waitingElementSet.size()>0){ output.println("// stall on parent's stall sites "); @@ -3255,9 +3254,11 @@ public class BuildCode { } if(state.RCR) { //no need to enqueue parent effect if coarse grained conflict clears us - output.println(" stallrecord.common.parentsStallSem=&rentry->parentStallSem;"); - output.println(" stallrecord.tag=rentry->tag;"); - output.println(" "+rcr.getTraverserInvocation(waitingElement.getTempDesc(), generateTemp(fm, waitingElement.getTempDesc(), null)+", &stallrecord", fn)); + output.println(" stallrecord.common.parentsStallSem=&rentry->parentStallSem;"); + 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)+";"); + output.println(" enqueueTR(TRqueue, (void *)&stallrecord);"); } output.println(" psem_take( &(rentry->parentStallSem), (struct garbagelist *)&___locals___ );"); if( state.COREPROF ) { diff --git a/Robust/src/IR/Flat/RuntimeConflictResolver.java b/Robust/src/IR/Flat/RuntimeConflictResolver.java index e2e6cec0..b97486c6 100644 --- a/Robust/src/IR/Flat/RuntimeConflictResolver.java +++ b/Robust/src/IR/Flat/RuntimeConflictResolver.java @@ -9,6 +9,7 @@ import java.util.Hashtable; import java.util.Iterator; import java.util.Set; import java.util.Vector; +import Util.Tuple; import Analysis.Disjoint.*; import Analysis.MLP.CodePlan; import IR.Flat.*; @@ -37,10 +38,13 @@ public class RuntimeConflictResolver { //This keeps track of taints we've traversed to prevent printing duplicate traverse functions //The Integer keeps track of the weakly connected group it's in (used in enumerateHeapRoots) private Hashtable doneTaints; + private Hashtable idMap=new Hashtable(); private Hashtable> globalEffects; private Hashtable> globalConflicts; private ArrayList toTraverse; + public int currentID=1; + // initializing variables can be found in printHeader() private static final String getAllocSiteInC = "->allocsite"; private static final String queryVistedHashtable = "hashRCRInsert"; @@ -297,6 +301,15 @@ public class RuntimeConflictResolver { return "traverse___" + invar.getSafeSymbol() + removeInvalidChars(flatname) + "___("+varString+");"; } + + public int getTraverserID(TempDescriptor invar, FlatNode fn) { + Tuple t=new Tuple(invar, fn); + if (idMap.containsKey(t)) + return idMap.get(t).intValue(); + int value=currentID++; + idMap.put(t, new Integer(value)); + return value; + } public String removeInvalidChars(String in) { StringBuilder s = new StringBuilder(in); @@ -390,6 +403,16 @@ public class RuntimeConflictResolver { cFile.println( " break;"); } + for(Taint t: doneTaints.keySet()) { + if (t.isStallSiteTaint()){ + cFile.println( " case -" + getTraverserID(t.getVar(), t.getStallSite())+ ": {"); + cFile.println( " SESEstall * rec=(SESEstall*) record;"); + cFile.println( " " + this.getTraverserInvocation(t.getVar(), "rec->___obj___, rec", t.getStallSite())+";"); + cFile.println( " }"); + cFile.println(" break;"); + } + } + cFile.println(" default:\n printf(\"Invalid SESE ID was passed in.\\n\");\n break;"); cFile.println(" }"); @@ -803,7 +826,6 @@ public class RuntimeConflictResolver { //This is done with the assumption that an array of object stores pointers. currCase.append("{\n int i;\n"); currCase.append(" for(i = 0; i<((struct ArrayObject *) " + prefix + " )->___length___; i++ ) {\n"); - //XXXXXXXXX currCase.append(" struct ___Object___ * arrayElement =((struct ___Object___ **)(((char *) &(((struct ArrayObject *)"+ prefix+")->___length___))+sizeof(int)))[i];\n"); currCase.append(" if( arrayElement != NULL && ("); diff --git a/Robust/src/Runtime/oooJava/hashStructure.c b/Robust/src/Runtime/oooJava/hashStructure.c index 18b6fbe4..24c17c86 100644 --- a/Robust/src/Runtime/oooJava/hashStructure.c +++ b/Robust/src/Runtime/oooJava/hashStructure.c @@ -399,7 +399,7 @@ void RESOLVE(SESEcommon *record, bitvt mask) { int shift=__builtin_ctzll(mask)+1; index+=shift; if (atomic_sub_and_test(1,&array[index].count)) { - if(unlikely(record->classID==STALLCLASSID)) { + if(unlikely(record->classID<0)) { //parent stall...clear it psem_give_tag(record->parentsStallSem, ((SESEstall *)record)->tag); } else { diff --git a/Robust/src/Runtime/oooJava/rcr_runtime.h b/Robust/src/Runtime/oooJava/rcr_runtime.h index f6f58dbd..4f5f9c2a 100644 --- a/Robust/src/Runtime/oooJava/rcr_runtime.h +++ b/Robust/src/Runtime/oooJava/rcr_runtime.h @@ -16,12 +16,11 @@ struct rcrRecord { struct rcrRecord *next; }; -#define STALLCLASSID 1939921 - typedef struct SESEstall_t { SESEcommon common; int size; void * next; + struct ___Object___* ___obj___; struct rcrRecord rcrRecords[1]; int tag; } SESEstall; diff --git a/Robust/src/Runtime/workschedule.c b/Robust/src/Runtime/workschedule.c index 8b089069..26b5fb65 100644 --- a/Robust/src/Runtime/workschedule.c +++ b/Robust/src/Runtime/workschedule.c @@ -103,8 +103,8 @@ void* workerMain( void* arg ) { pthread_attr_setdetachstate( &nattr, PTHREAD_CREATE_DETACHED ); //set up the stall site SESErecord - stallrecord.common.classID=STALLCLASSID; stallrecord.common.offsetToParamRecords=(INTPTR) &((SESEstall *)0)->rcrRecords; + stallrecord.common.classID=-1; if( TRqueue == NULL ) { TRqueue = allocTR(); diff --git a/Robust/src/Util/Tuple.java b/Robust/src/Util/Tuple.java new file mode 100644 index 00000000..2859717d --- /dev/null +++ b/Robust/src/Util/Tuple.java @@ -0,0 +1,19 @@ +package Util; + +public class Tuple { + private Object a; + private Object b; + public Tuple(Object a, Object b) { + this.a=a; + this.b=b; + } + public int hashCode() { + return a.hashCode()*31+b.hashCode(); + } + public boolean equals(Object o) { + if (!(o instanceof Tuple)) + return false; + Tuple t=(Tuple)o; + return a.equals(t.a)&&b.equals(t.b); + } +} \ No newline at end of file -- 2.34.1