bug fix
authorbdemsky <bdemsky>
Tue, 23 Jun 2009 08:00:26 +0000 (08:00 +0000)
committerbdemsky <bdemsky>
Tue, 23 Jun 2009 08:00:26 +0000 (08:00 +0000)
Robust/src/Analysis/Locality/DelayComputation.java
Robust/src/IR/Flat/AtomicRecord.java
Robust/src/IR/Flat/BuildCode.java
Robust/src/Runtime/STM/stm.c
Robust/src/Runtime/STM/tm.h
Robust/src/Runtime/thread.c

index c33102a6d452b106b3068559eb8e4cbe5b7b2f3d..6aa84d2a6cb0fc226ffd23f6ec72d91592b9bc2d 100644 (file)
@@ -124,6 +124,50 @@ public class DelayComputation {
     return liveinto;
   }
 
+  //This method computes which temps are live out of the second part
+  public Set<TempDescriptor> liveoutvirtualread(LocalityBinding lb, FlatAtomicEnterNode faen) {
+    MethodDescriptor md=lb.getMethod();
+    FlatMethod fm=state.getMethodFlat(md);
+    Set<FlatNode> exits=faen.getExits();
+    Hashtable<FlatNode, Set<TempDescriptor>> livemap=Liveness.computeLiveTemps(fm);
+    Hashtable<FlatNode, Hashtable<TempDescriptor, Set<FlatNode>>> reachingdefs=ReachingDefs.computeReachingDefs(fm);
+    
+    Set<FlatNode> atomicnodes=faen.getReachableSet(faen.getExits());
+
+    Set<FlatNode> secondpart=new HashSet<FlatNode>(getNotReady(lb));
+    secondpart.retainAll(atomicnodes);
+
+    Set<TempDescriptor> liveset=new HashSet<TempDescriptor>();
+    //Have list of all live temps
+
+    for(Iterator<FlatNode> fnit=exits.iterator();fnit.hasNext();) {
+      FlatNode fn=fnit.next();
+      Set<TempDescriptor> tempset=livemap.get(fn);
+      Hashtable<TempDescriptor, Set<FlatNode>> reachmap=reachingdefs.get(fn);
+      //Look for reaching defs for all live variables that are in the secondpart
+
+      for(Iterator<TempDescriptor> tmpit=tempset.iterator();tmpit.hasNext();) {
+       TempDescriptor tmp=tmpit.next();
+       Set<FlatNode> fnset=reachmap.get(tmp);
+       boolean outsidenode=false;
+       boolean insidenode=false;
+
+       for(Iterator<FlatNode> 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<TempDescriptor> liveout(LocalityBinding lb, FlatAtomicEnterNode faen) {
index ddf40f94e1363313a0d4100beaa1c6e4a133ab6c..cb347d7ede8c68152c8d286a82152feb73309d2e 100644 (file)
@@ -5,5 +5,6 @@ public class AtomicRecord {
   String name;
   Set<TempDescriptor> livein;
   Set<TempDescriptor> liveout;
+  Set<TempDescriptor> liveoutvirtualread;
   
-}
\ No newline at end of file
+}
index 0dd776a680db5eca848d69dd949bac18d77958e3..3af68ef8b5135ae81505024d079d95ac1af4353b 100644 (file)
@@ -1531,8 +1531,10 @@ public class BuildCode {
          Set<FlatNode> recordset=delaycomp.livecode(lb);
          Set<TempDescriptor> liveinto=delaycomp.liveinto(lb, faen, recordset);
          Set<TempDescriptor> liveout=delaycomp.liveout(lb, faen);
+         Set<TempDescriptor> liveoutvirtualread=delaycomp.liveoutvirtualread(lb, faen);
          ar.livein=liveinto;
          ar.liveout=liveout;
+         ar.liveoutvirtualread=liveoutvirtualread;
 
          for(Iterator<TempDescriptor> it=liveinto.iterator(); it.hasNext();) {
            TempDescriptor tmp=it.next();
@@ -1565,7 +1567,7 @@ public class BuildCode {
          for(Iterator<TempDescriptor> 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<TempDescriptor> 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
index 61a2354e07c53ce165ca174dda67cc0f5dd60bd2..e395c5d8d206c7ea68acab5ddb066d84f35d8225 100644 (file)
@@ -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);
   }
index 3d131777c5c672c0e9463aa38c5b9e5b119c6182..bae5bb7b16fdd4cf91f8e1b2dded79b6f7a5f17e 100644 (file)
@@ -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();
index e2d70acc13a7e65e7ca1286115149ce53206b987..26eb93903ac16bb174377aef2423de25c0351960 100644 (file)
@@ -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);