From 99941ef079b80431ff9effb21aeed87f5f848a8a Mon Sep 17 00:00:00 2001 From: bdemsky Date: Tue, 23 Jun 2009 08:00:26 +0000 Subject: [PATCH 1/1] bug fix --- .../Analysis/Locality/DelayComputation.java | 44 +++++++++++++++++++ Robust/src/IR/Flat/AtomicRecord.java | 3 +- Robust/src/IR/Flat/BuildCode.java | 12 ++++- Robust/src/Runtime/STM/stm.c | 19 ++++---- Robust/src/Runtime/STM/tm.h | 2 +- Robust/src/Runtime/thread.c | 6 +++ 6 files changed, 75 insertions(+), 11 deletions(-) diff --git a/Robust/src/Analysis/Locality/DelayComputation.java b/Robust/src/Analysis/Locality/DelayComputation.java index c33102a6..6aa84d2a 100644 --- a/Robust/src/Analysis/Locality/DelayComputation.java +++ b/Robust/src/Analysis/Locality/DelayComputation.java @@ -124,6 +124,50 @@ public class DelayComputation { return liveinto; } + //This method computes which temps are live out of the second part + public Set liveoutvirtualread(LocalityBinding lb, FlatAtomicEnterNode faen) { + MethodDescriptor md=lb.getMethod(); + FlatMethod fm=state.getMethodFlat(md); + Set exits=faen.getExits(); + Hashtable> livemap=Liveness.computeLiveTemps(fm); + Hashtable>> reachingdefs=ReachingDefs.computeReachingDefs(fm); + + Set atomicnodes=faen.getReachableSet(faen.getExits()); + + Set secondpart=new HashSet(getNotReady(lb)); + secondpart.retainAll(atomicnodes); + + Set liveset=new HashSet(); + //Have list of all live temps + + for(Iterator fnit=exits.iterator();fnit.hasNext();) { + FlatNode fn=fnit.next(); + Set tempset=livemap.get(fn); + Hashtable> reachmap=reachingdefs.get(fn); + //Look for reaching defs for all live variables that are in the secondpart + + for(Iterator tmpit=tempset.iterator();tmpit.hasNext();) { + TempDescriptor tmp=tmpit.next(); + Set fnset=reachmap.get(tmp); + boolean outsidenode=false; + boolean insidenode=false; + + for(Iterator fnit2=fnset.iterator();fnit2.hasNext();) { + FlatNode fn2=fnit2.next(); + if (secondpart.contains(fn2)) { + insidenode=true; + } else { + outsidenode=true; + } + if (outsidenode&&insidenode) { + liveset.add(tmp); + break; + } + } + } + } + return liveset; + } //This method computes which temps are live out of the second part public Set liveout(LocalityBinding lb, FlatAtomicEnterNode faen) { diff --git a/Robust/src/IR/Flat/AtomicRecord.java b/Robust/src/IR/Flat/AtomicRecord.java index ddf40f94..cb347d7e 100644 --- a/Robust/src/IR/Flat/AtomicRecord.java +++ b/Robust/src/IR/Flat/AtomicRecord.java @@ -5,5 +5,6 @@ public class AtomicRecord { String name; Set livein; Set liveout; + Set liveoutvirtualread; -} \ No newline at end of file +} diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java index 0dd776a6..3af68ef8 100644 --- a/Robust/src/IR/Flat/BuildCode.java +++ b/Robust/src/IR/Flat/BuildCode.java @@ -1531,8 +1531,10 @@ public class BuildCode { Set recordset=delaycomp.livecode(lb); Set liveinto=delaycomp.liveinto(lb, faen, recordset); Set liveout=delaycomp.liveout(lb, faen); + Set liveoutvirtualread=delaycomp.liveoutvirtualread(lb, faen); ar.livein=liveinto; ar.liveout=liveout; + ar.liveoutvirtualread=liveoutvirtualread; for(Iterator it=liveinto.iterator(); it.hasNext();) { TempDescriptor tmp=it.next(); @@ -1565,7 +1567,7 @@ public class BuildCode { for(Iterator tmpit=alltemps.iterator();tmpit.hasNext();) { TempDescriptor tmp=tmpit.next(); if (!tmp.getType().isPtr()) { - if (liveinto.contains(tmp)) { + if (liveinto.contains(tmp)||liveoutvirtualread.contains(tmp)) { //read from live into set output.println(tmp.getType().getSafeSymbol()+" "+tmp.getSafeSymbol()+"=primitives->"+tmp.getSafeSymbol()+";"); } else { @@ -2503,6 +2505,14 @@ public class BuildCode { TempDescriptor tmp=tmpit.next(); output.println("primitives."+tmp.getSafeSymbol()+"="+tmp.getSafeSymbol()+";"); } + + //copy outs that depend on path + for(Iterator tmpit=ar.liveoutvirtualread.iterator();tmpit.hasNext();) { + TempDescriptor tmp=tmpit.next(); + if (!ar.livein.contains(tmp)) + output.println("primitives."+tmp.getSafeSymbol()+"="+tmp.getSafeSymbol()+";"); + } + //do call output.println("if (transCommit((void (*)(void *, void *, void *))&"+ar.name+", &primitives, &"+localsprefix+", "+paramsprefix+")) {"); } else diff --git a/Robust/src/Runtime/STM/stm.c b/Robust/src/Runtime/STM/stm.c index 61a2354e..e395c5d8 100644 --- a/Robust/src/Runtime/STM/stm.c +++ b/Robust/src/Runtime/STM/stm.c @@ -267,7 +267,7 @@ __attribute__((pure)) void *transRead(void * oid, void *gl) { /* Insert into cache's lookup table */ STATUS(objcopy)=0; if (((unsigned int)oid)<((unsigned int ) curr_heapbase)|| ((unsigned int)oid) >((unsigned int) curr_heapptr)) - printf("ERROR!\n"); + printf("ERROR! Bad object address!\n"); t_chashInsert(oid, &objcopy[1]); return &objcopy[1]; } @@ -515,6 +515,8 @@ int traverseCache() { #ifdef DELAYCOMP //acquire other locks + unsigned int numoidwrtotal=numoidwrlocked; + chashlistnode_t *dc_curr = dc_c_list; /* Inner loop to traverse the linked list of the cache lookupTable */ while(likely(dc_curr != NULL)) { @@ -522,7 +524,7 @@ int traverseCache() { objheader_t * headeraddr=&((objheader_t *) dc_curr->val)[-1]; objheader_t *header=(objheader_t *)(((char *)dc_curr->key)-sizeof(objheader_t)); if(write_trylock(&header->lock)) { //can aquire write lock - oidwrlocked[numoidwrlocked++] = header; + oidwrlocked[numoidwrtotal++] = header; } else { //maybe we already have lock void * key=dc_curr->key; @@ -604,7 +606,7 @@ int traverseCache() { /* Decide the final response */ #ifdef DELAYCOMP - transCommitProcess(oidwrlocked, numoidwrlocked, commitmethod, primitives, locals, params); + transCommitProcess(oidwrlocked, numoidwrlocked, numoidwrtotal, commitmethod, primitives, locals, params); #else transCommitProcess(oidwrlocked, numoidwrlocked); #endif @@ -722,6 +724,7 @@ int alttraverseCache() { #ifdef DELAYCOMP //acquire other locks + unsigned int numoidwrtotal=numoidwrlocked; chashlistnode_t *dc_curr = dc_c_list; /* Inner loop to traverse the linked list of the cache lookupTable */ while(likely(dc_curr != NULL)) { @@ -729,7 +732,7 @@ int alttraverseCache() { objheader_t * headeraddr=&((objheader_t *) dc_curr->val)[-1]; objheader_t *header=(objheader_t *)(((char *)dc_curr->key)-sizeof(objheader_t)); if(write_trylock(&header->lock)) { //can aquire write lock - oidwrlocked[numoidwrlocked++] = header; + oidwrlocked[numoidwrtotal++] = header; } else { //maybe we already have lock void * key=dc_curr->key; @@ -808,7 +811,7 @@ int alttraverseCache() { /* Decide the final response */ #ifdef DELAYCOMP - transCommitProcess(oidwrlocked, numoidwrlocked, commitmethod, primitives, locals, params); + transCommitProcess(oidwrlocked, numoidwrlocked, numoidwrtotal, commitmethod, primitives, locals, params); #else transCommitProcess(oidwrlocked, numoidwrlocked); #endif @@ -1013,7 +1016,7 @@ void transAbortProcess(void **oidwrlocked, int numoidwrlocked) { * ================================= */ #ifdef DELAYCOMP - void transCommitProcess(void ** oidwrlocked, int numoidwrlocked, void (*commitmethod)(void *, void *, void *), void * primitives, void * locals, void * params) { + void transCommitProcess(void ** oidwrlocked, int numoidwrlocked, int numoidwrtotal, void (*commitmethod)(void *, void *, void *), void * primitives, void * locals, void * params) { #else void transCommitProcess(void ** oidwrlocked, int numoidwrlocked) { #endif @@ -1048,11 +1051,11 @@ void transAbortProcess(void **oidwrlocked, int numoidwrlocked) { #ifdef DELAYCOMP // call commit method - commitmethod(primitives, locals, params); + commitmethod(params, locals, primitives); #endif /* Release write locks */ - for(i=numoidwrlocked-1; i>=0; i--) { + for(i=numoidwrtotal-1; i>=0; i--) { header = (objheader_t *)oidwrlocked[i]; write_unlock(&header->lock); } diff --git a/Robust/src/Runtime/STM/tm.h b/Robust/src/Runtime/STM/tm.h index 3d131777..bae5bb7b 100644 --- a/Robust/src/Runtime/STM/tm.h +++ b/Robust/src/Runtime/STM/tm.h @@ -173,7 +173,7 @@ __attribute__((pure)) void *transRead(void *, void *); int transCommit(void (*commitmethod)(void *, void *, void *), void * primitives, void * locals, void * params); int traverseCache(void (*commitmethod)(void *, void *, void *), void * primitives, void * locals, void * params); int alttraverseCache(void (*commitmethod)(void *, void *, void *), void * primitives, void * locals, void * params); -void transCommitProcess(void **, int, void (*commitmethod)(void *, void *, void *), void * primitives, void * locals, void * params); +void transCommitProcess(void **, int, int, void (*commitmethod)(void *, void *, void *), void * primitives, void * locals, void * params); #else int transCommit(); int traverseCache(); diff --git a/Robust/src/Runtime/thread.c b/Robust/src/Runtime/thread.c index e2d70acc..26eb9390 100644 --- a/Robust/src/Runtime/thread.c +++ b/Robust/src/Runtime/thread.c @@ -173,6 +173,9 @@ void initializethreads() { t_cache = objstrCreate(1048576); t_reserve=NULL; t_chashCreate(CHASH_SIZE, CLOADFACTOR); +#ifdef DELAYCOMP + dc_t_chashCreate(CHASH_SIZE, CLOADFACTOR); +#endif #ifdef STMSTATS trec=calloc(1, sizeof(threadrec_t)); trec->blocked = 0; @@ -234,6 +237,9 @@ void initthread(struct ___Thread___ * ___this___) { t_cache = objstrCreate(1048576); t_reserve=NULL; t_chashCreate(CHASH_SIZE, CLOADFACTOR); +#ifdef DELAYCOMP + dc_t_chashCreate(CHASH_SIZE, CLOADFACTOR); +#endif ___Thread____NNR____staticStart____L___Thread___((struct ___Thread____NNR____staticStart____L___Thread____params *)p); objstrDelete(t_cache); objstrDelete(t_reserve); -- 2.34.1