changes...plus a little optimization
authorbdemsky <bdemsky>
Wed, 13 Oct 2010 21:35:18 +0000 (21:35 +0000)
committerbdemsky <bdemsky>
Wed, 13 Oct 2010 21:35:18 +0000 (21:35 +0000)
Robust/src/Analysis/MLP/MLPAnalysis.java
Robust/src/IR/Flat/BuildCode.java
Robust/src/IR/Flat/FlatSESEEnterNode.java
Robust/src/IR/Flat/RuntimeConflictResolver.java
Robust/src/Runtime/mlp_runtime.h
Robust/src/Runtime/oooJava/rcr_runtime.c
Robust/src/Runtime/oooJava/rcr_runtime.h
Robust/src/Runtime/workschedule.c

index 95744071d11dc8421b1aa02d783cf971fee145dd..c0e610cc25114d015e9fd566507be9a5fbd45cc1 100644 (file)
@@ -10,6 +10,7 @@ import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.Map;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.Map;
+import java.util.Collection;
 import java.util.Set;
 import java.util.Stack;
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.Stack;
 import java.util.Map.Entry;
@@ -1208,7 +1209,7 @@ public class MLPAnalysis {
                        
                        if (!fsen.getIsCallerSESEplaceholder()) {
                                // uniquely taint each live-in variable
                        
                        if (!fsen.getIsCallerSESEplaceholder()) {
                                // uniquely taint each live-in variable
-                               Set<TempDescriptor> set = fsen.getInVarSet();
+                               Collection<TempDescriptor> set = fsen.getInVarSet();
                                Iterator<TempDescriptor> iter = set.iterator();
                                int idx = 0;
                                while (iter.hasNext()) {
                                Iterator<TempDescriptor> iter = set.iterator();
                                int idx = 0;
                                while (iter.hasNext()) {
@@ -2394,7 +2395,7 @@ public class MLPAnalysis {
                                        .getOwnvershipGraphByMethodContext(mc);
 
                        if (!fsen.getIsCallerSESEplaceholder()) {
                                        .getOwnvershipGraphByMethodContext(mc);
 
                        if (!fsen.getIsCallerSESEplaceholder()) {
-                               Set<TempDescriptor> invar_set = fsen.getInVarSet();
+                         Collection<TempDescriptor> invar_set = fsen.getInVarSet();
                                
                                SESESummary seseSummary=seseSummaryMap.get(fsen);
                                ConflictGraph conflictGraph=null;
                                
                                SESESummary seseSummary=seseSummaryMap.get(fsen);
                                ConflictGraph conflictGraph=null;
index 600808612eb47034bec9fa836430cc0b23b61817..aaf0d431dfe681df37fcf0ebf951e719fec63cf2 100644 (file)
@@ -2122,14 +2122,34 @@ public class BuildCode {
     // calculated above should match the pointer object params
     // used in the following code, but let's just leave the working
     // implementation unless there is actually a problem...
     // calculated above should match the pointer object params
     // used in the following code, but let's just leave the working
     // implementation unless there is actually a problem...
+
+    Vector<TempDescriptor> inset=fsen.getInVarVector();
+    int incount=0;
+
+    for(int i=0; i<inset.size();i++) {
+      TempDescriptor temp=inset.get(i);
+      TypeDescriptor type=temp.getType();
+      if(type.isPtr()) {
+       incount++;
+       if (temp.getType().isNull())
+         outputStructs.println("  void * "+temp.getSafeSymbol()+
+                               ";  /* in-or-out-set obj in gl */");
+       else
+         outputStructs.println("  struct "+temp.getType().getSafeSymbol()+" * "+
+                               temp.getSafeSymbol()+"; /* in-or-out-set obj in gl */");
+      }
+    }
+
     for(int i=0; i<objectparams.numPointers(); i++) {
       TempDescriptor temp=objectparams.getPointer(i);
     for(int i=0; i<objectparams.numPointers(); i++) {
       TempDescriptor temp=objectparams.getPointer(i);
-      if (temp.getType().isNull())
-        outputStructs.println("  void * "+temp.getSafeSymbol()+
-                              ";  /* in-or-out-set obj in gl */");
-      else
-        outputStructs.println("  struct "+temp.getType().getSafeSymbol()+" * "+
-                              temp.getSafeSymbol()+"; /* in-or-out-set obj in gl */");
+      if (!inset.contains(temp)) {
+       if (temp.getType().isNull())
+         outputStructs.println("  void * "+temp.getSafeSymbol()+
+                               ";  /* in-or-out-set obj in gl */");
+       else
+         outputStructs.println("  struct "+temp.getType().getSafeSymbol()+" * "+
+                               temp.getSafeSymbol()+"; /* in-or-out-set obj in gl */");
+      }
     }
     
     outputStructs.println("  /* next is primitives for in-set and out-set and dynamic tracking */");
     }
     
     outputStructs.println("  /* next is primitives for in-set and out-set and dynamic tracking */");
@@ -2167,14 +2187,17 @@ public class BuildCode {
     while( itrStaticInVarSrcs.hasNext() ) {
       SESEandAgePair srcPair = itrStaticInVarSrcs.next();
       outputStructs.println("  "+srcPair.getSESE().getSESErecordName()+"* "+srcPair+";");
     while( itrStaticInVarSrcs.hasNext() ) {
       SESEandAgePair srcPair = itrStaticInVarSrcs.next();
       outputStructs.println("  "+srcPair.getSESE().getSESErecordName()+"* "+srcPair+";");
-      addingDepRecField( fsen, srcPair.toString() );
-    }    
+      addingDepRecField(fsen, srcPair.toString());
+    }
+
+    if (state.RCR) {
+      outputStructs.println("struct rcrRecord rcrRecords["+incount+"]");
+    }
     
     if( fsen.getFirstDepRecField() != null ) {
       outputStructs.println("  /* compiler believes first dependent SESE record field above is: "+
                             fsen.getFirstDepRecField()+" */" );
     }
     
     if( fsen.getFirstDepRecField() != null ) {
       outputStructs.println("  /* compiler believes first dependent SESE record field above is: "+
                             fsen.getFirstDepRecField()+" */" );
     }
-
     outputStructs.println("};\n");
 
     
     outputStructs.println("};\n");
 
     
@@ -2274,7 +2297,7 @@ public class BuildCode {
       if( !type.isPtr() && !fsen.getInVarSet().contains( temp ) ) {
        output.println("   "+type+" "+temp+";");       
       }
       if( !type.isPtr() && !fsen.getInVarSet().contains( temp ) ) {
        output.println("   "+type+" "+temp+";");       
       }
-    }    
+    }
 
 
     // initialize thread-local var to a the task's record, which is fused
 
 
     // initialize thread-local var to a the task's record, which is fused
@@ -2287,23 +2310,23 @@ public class BuildCode {
     // setup memory queue
     // eom
     if(state.OOOJAVA){
     // setup memory queue
     // eom
     if(state.OOOJAVA){
-    output.println("   // set up memory queues ");
-       output.println("   int numMemoryQueue=0;");
-       output.println("   int memoryQueueItemID=0;");
-       Analysis.OoOJava.ConflictGraph graph = oooa.getConflictGraph(fsen);
-       if (graph != null && graph.hasConflictEdge()) {
-               output.println("   {");
-               Set<Analysis.OoOJava.SESELock> lockSet = oooa.getLockMappings(graph);
-               System.out.println("#lockSet="+lockSet);
-               if (lockSet.size() > 0) {
-                       output.println("   numMemoryQueue=" + lockSet.size() + ";");
-                       output.println("   runningSESE->numMemoryQueue=numMemoryQueue;");
-                       output.println("   runningSESE->memoryQueueArray=mlpCreateMemoryQueueArray(numMemoryQueue);");
-                       output.println();
-               }
-               output.println("   }");
+      output.println("   // set up memory queues ");
+      output.println("   int numMemoryQueue=0;");
+      output.println("   int memoryQueueItemID=0;");
+      Analysis.OoOJava.ConflictGraph graph = oooa.getConflictGraph(fsen);
+      if (graph != null && graph.hasConflictEdge()) {
+       output.println("   {");
+       Set<Analysis.OoOJava.SESELock> lockSet = oooa.getLockMappings(graph);
+       System.out.println("#lockSet="+lockSet);
+       if (lockSet.size() > 0) {
+         output.println("   numMemoryQueue=" + lockSet.size() + ";");
+         output.println("   runningSESE->numMemoryQueue=numMemoryQueue;");
+         output.println("   runningSESE->memoryQueueArray=mlpCreateMemoryQueueArray(numMemoryQueue);");
+         output.println();
        }
        }
-    }else{
+       output.println("   }");
+      }
+    } else {
       output.println("   // set up memory queues ");
       output.println("   int numMemoryQueue=0;");
       output.println("   int memoryQueueItemID=0;");
       output.println("   // set up memory queues ");
       output.println("   int numMemoryQueue=0;");
       output.println("   int memoryQueueItemID=0;");
@@ -2323,7 +2346,6 @@ public class BuildCode {
         }
         output.println("   }");
       }
         }
         output.println("   }");
       }
-       
     }
 
 
     }
 
 
@@ -2356,9 +2378,7 @@ public class BuildCode {
     }
     
     output.println("   // decrement references to static sources");
     }
     
     output.println("   // decrement references to static sources");
-    for( Iterator<SESEandAgePair> pairItr = fsen.getStaticInVarSrcs().iterator();
-         pairItr.hasNext();
-         ) {
+    for( Iterator<SESEandAgePair> pairItr = fsen.getStaticInVarSrcs().iterator(); pairItr.hasNext(); ) {
       SESEandAgePair srcPair = pairItr.next();
       output.println("#ifndef OOO_DISABLE_TASKMEMPOOL" );
       output.println("   {");
       SESEandAgePair srcPair = pairItr.next();
       output.println("#ifndef OOO_DISABLE_TASKMEMPOOL" );
       output.println("   {");
@@ -2904,9 +2924,13 @@ public class BuildCode {
             output.println("#endif");
           }
          output.println("     pthread_mutex_lock( &(common->lock) );");
             output.println("#endif");
           }
          output.println("     pthread_mutex_lock( &(common->lock) );");
-         output.println("     while( common->doneExecuting == FALSE ) {");
-         output.println("       pthread_cond_wait( &(common->doneCond), &(common->lock) );");
-         output.println("     }");
+         output.println("     if( common->doneExecuting == FALSE ) {");
+          output.println("       stopforgc((struct garbagelist *)&___locals___);");
+         output.println("       do {");
+         output.println("         pthread_cond_wait( &(common->doneCond), &(common->lock) );");
+         output.println("       } while( common->doneExecuting == FALSE );");
+         output.println("       restartaftergc();");
+         output.println("    }");
          output.println("     pthread_mutex_unlock( &(common->lock) );");
 
          // copy things we might have stalled for                
          output.println("     pthread_mutex_unlock( &(common->lock) );");
 
          // copy things we might have stalled for                
@@ -3728,15 +3752,15 @@ public class BuildCode {
                      );
     }
     
                      );
     }
     
+    if (state.RCR) {
+      output.println("    seseToIssumer->common.offsetToParamRecords=(INTPTR)sizeof("+fsen.getSESErecordName()+") - (INTPTR) & ((("+fsen.getSESErecordName()+"*)0)->rcrRecords);");
+    }
+
     // fill in common data
     output.println("     int localCount=0;");
     output.println("     seseToIssue->common.classID = "+fsen.getIdentifier()+";");
     output.println("     psem_init( &(seseToIssue->common.stallSem) );");
     // fill in common data
     output.println("     int localCount=0;");
     output.println("     seseToIssue->common.classID = "+fsen.getIdentifier()+";");
     output.println("     psem_init( &(seseToIssue->common.stallSem) );");
-
     output.println("     seseToIssue->common.forwardList = createQueue();");
     output.println("     seseToIssue->common.forwardList = createQueue();");
-    //output.println("     seseToIssue->common.forwardList.numItems    = 0;");
-    //output.println("     seseToIssue->common.forwardList.nextElement = NULL;");
-
     output.println("     seseToIssue->common.unresolvedDependencies = 10000;");
     output.println("     pthread_cond_init( &(seseToIssue->common.doneCond), NULL );");
     output.println("     seseToIssue->common.doneExecuting = FALSE;");    
     output.println("     seseToIssue->common.unresolvedDependencies = 10000;");
     output.println("     pthread_cond_init( &(seseToIssue->common.doneCond), NULL );");
     output.println("     seseToIssue->common.doneExecuting = FALSE;");    
@@ -3790,22 +3814,10 @@ public class BuildCode {
        SESEandAgePair srcPair = staticSrcsItr.next();
        output.println("     {");
        output.println("       SESEcommon* src = (SESEcommon*)"+srcPair+";");
        SESEandAgePair srcPair = staticSrcsItr.next();
        output.println("     {");
        output.println("       SESEcommon* src = (SESEcommon*)"+srcPair+";");
-
-
-       if(GENERATEPRECISEGC){
-          output.println("       stopforgc((struct garbagelist *)&___locals___);");
-       }
-
        output.println("       pthread_mutex_lock( &(src->lock) );");
        output.println("       pthread_mutex_lock( &(src->lock) );");
-       
-        if(GENERATEPRECISEGC){
-          output.println("       restartaftergc();");
-       }
-
         // FORWARD TODO
        output.println("       if( !src->doneExecuting ) {");
         output.println("         addNewItem( src->forwardList, seseToIssue );");       
         // FORWARD TODO
        output.println("       if( !src->doneExecuting ) {");
         output.println("         addNewItem( src->forwardList, seseToIssue );");       
-        //output.println("         ADD_FORWARD_ITEM( src->forwardList, seseToIssue );");
        output.println("         ++(localCount);");
        output.println("       }");
         output.println("#ifndef OOO_DISABLE_TASKMEMPOOL" );
        output.println("         ++(localCount);");
        output.println("       }");
         output.println("#ifndef OOO_DISABLE_TASKMEMPOOL" );
@@ -3833,14 +3845,7 @@ public class BuildCode {
        // the address off to the new child, because you're not done executing and
        // might change the variable, so copy it right now
        output.println("       if( src != NULL ) {");
        // the address off to the new child, because you're not done executing and
        // might change the variable, so copy it right now
        output.println("       if( src != NULL ) {");
-       //eomgc
-       if(GENERATEPRECISEGC){
-               output.println("         stopforgc((struct garbagelist *)&___locals___);");
-       }
        output.println("         pthread_mutex_lock( &(src->lock) );");
        output.println("         pthread_mutex_lock( &(src->lock) );");
-       if(GENERATEPRECISEGC){
-               output.println("         restartaftergc();");
-       }
 
         // FORWARD TODO
 
 
         // FORWARD TODO
 
@@ -3908,19 +3913,23 @@ public class BuildCode {
         output.println("     }");
         output.println("#endif // OOO_DISABLE_TASKMEMPOOL" );
       }
         output.println("     }");
         output.println("#endif // OOO_DISABLE_TASKMEMPOOL" );
       }
-      
+
+      if (state.RCR) {
+
+       
+      }
+
+      if(state.RCR) {
+       //TODO BCD
+       //clear out the parameter records
+
+      }
 
 
       ////////////////
       // count up memory conflict dependencies,
       // eom
       if(state.OOOJAVA){
 
 
       ////////////////
       // count up memory conflict dependencies,
       // eom
       if(state.OOOJAVA){
-
-        //output.println("       seseToIssue->common.numMemoryQueue=0;");
-        //output.println("       seseToIssue->common.rentryIdx=0;");
-        //output.println("       seseToIssue->common.unresolvedRentryIdx=0;");
-        //output.println("       seseToIssue->common.memoryQueueArray=NULL;");
-
         FlatSESEEnterNode parent = fsen.getParent();
         Analysis.OoOJava.ConflictGraph graph = oooa.getConflictGraph(parent);
         if (graph != null && graph.hasConflictEdge()) {
         FlatSESEEnterNode parent = fsen.getParent();
         Analysis.OoOJava.ConflictGraph graph = oooa.getConflictGraph(parent);
         if (graph != null && graph.hasConflictEdge()) {
@@ -3929,23 +3938,21 @@ public class BuildCode {
           output.println("     //add memory queue element");
           Analysis.OoOJava.SESEWaitingQueue seseWaitingQueue=
             graph.getWaitingElementSetBySESEID(fsen.getIdentifier(), seseLockSet);
           output.println("     //add memory queue element");
           Analysis.OoOJava.SESEWaitingQueue seseWaitingQueue=
             graph.getWaitingElementSetBySESEID(fsen.getIdentifier(), seseLockSet);
-          if(seseWaitingQueue.getWaitingElementSize()>0){
+          if(seseWaitingQueue.getWaitingElementSize()>0) {
             output.println("     {");
             output.println("       REntry* rentry=NULL;");
             output.println("       INTPTR* pointer=NULL;");
             output.println("       seseToIssue->common.rentryIdx=0;");
             output.println("     {");
             output.println("       REntry* rentry=NULL;");
             output.println("       INTPTR* pointer=NULL;");
             output.println("       seseToIssue->common.rentryIdx=0;");
-            
+
             Set<Integer> queueIDSet=seseWaitingQueue.getQueueIDSet();
             Set<Integer> queueIDSet=seseWaitingQueue.getQueueIDSet();
-            for (Iterator iterator = queueIDSet.iterator(); iterator
-                   .hasNext();) {
+            for (Iterator iterator = queueIDSet.iterator(); iterator.hasNext();) {
               Integer key = (Integer) iterator.next();
               int queueID=key.intValue();
               Set<Analysis.OoOJava.WaitingElement> waitingQueueSet =  
                 seseWaitingQueue.getWaitingElementSet(queueID);
               int enqueueType=seseWaitingQueue.getType(queueID);
               Integer key = (Integer) iterator.next();
               int queueID=key.intValue();
               Set<Analysis.OoOJava.WaitingElement> waitingQueueSet =  
                 seseWaitingQueue.getWaitingElementSet(queueID);
               int enqueueType=seseWaitingQueue.getType(queueID);
-              if(enqueueType==SESEWaitingQueue.EXCEPTION){
-                output.println("       INITIALIZEBUF(runningSESE->memoryQueueArray["
-                               + queueID+ "]);");
+              if(enqueueType==SESEWaitingQueue.EXCEPTION) {
+                output.println("       INITIALIZEBUF(runningSESE->memoryQueueArray[" + queueID+ "]);");
               }
               for (Iterator iterator2 = waitingQueueSet.iterator(); iterator2.hasNext();) {
                 Analysis.OoOJava.WaitingElement waitingElement 
               }
               for (Iterator iterator2 = waitingQueueSet.iterator(); iterator2.hasNext();) {
                 Analysis.OoOJava.WaitingElement waitingElement 
@@ -3972,9 +3979,7 @@ public class BuildCode {
                     VariableSourceToken vst = fsen.getStaticInVarSrc(td);
                     if (vst != null) {
   
                     VariableSourceToken vst = fsen.getStaticInVarSrc(td);
                     if (vst != null) {
   
-                      String srcId = "SESE_"
-                        + vst.getSESE()
-                        .getPrettyIdentifier()
+                      String srcId = "SESE_" + vst.getSESE().getPrettyIdentifier()
                         + vst.getSESE().getIdentifier()
                         + "_" + vst.getAge();
                       output.println("       pointer=(void*)&seseToIssue->"
                         + vst.getSESE().getIdentifier()
                         + "_" + vst.getAge();
                       output.println("       pointer=(void*)&seseToIssue->"
@@ -3990,7 +3995,7 @@ public class BuildCode {
                   } else {
                     output.println("       rentry=mlpCreateFineREntry("
                                    + waitingElement.getStatus()
                   } else {
                     output.println("       rentry=mlpCreateFineREntry("
                                    + waitingElement.getStatus()
-                                   + ", &(seseToIssue->common),  (void*)&seseToIssue->"
+                                   + ", &(seseToIssue->common), (void*)&seseToIssue->"
                                    + waitingElement.getDynID()
                                    + ");");
                   }
                                    + waitingElement.getDynID()
                                    + ");");
                   }
@@ -4003,8 +4008,8 @@ public class BuildCode {
                   output.println("       seseToIssue->common.rentryArray[seseToIssue->common.rentryIdx++]=rentry;");
                   output.println("       if(ADDRENTRY(runningSESE->memoryQueueArray["
                                  + waitingElement.getQueueID()
                   output.println("       seseToIssue->common.rentryArray[seseToIssue->common.rentryIdx++]=rentry;");
                   output.println("       if(ADDRENTRY(runningSESE->memoryQueueArray["
                                  + waitingElement.getQueueID()
-                                 + "],rentry)==NOTREADY){");
-                  output.println("          ++(localCount);");
+                                 + "],rentry)==NOTREADY) {");
+                  output.println("          localCount++;");
                   output.println("       }");
                   
                   // Trying to execute the dynamic coarse grain conflict strategy...
                   output.println("       }");
                   
                   // Trying to execute the dynamic coarse grain conflict strategy...
@@ -4030,10 +4035,7 @@ public class BuildCode {
                     }
                   }
                 }else{
                     }
                   }
                 }else{
-                  output
-                    .println("       ADDRENTRYTOBUF(runningSESE->memoryQueueArray["
-                             + waitingElement.getQueueID()
-                             + "],rentry);");
+                  output.println("       ADDRENTRYTOBUF(runningSESE->memoryQueueArray[" + waitingElement.getQueueID() + "],rentry);");
                 }
               }
               if(enqueueType!=SESEWaitingQueue.NORMAL){
                 }
               }
               if(enqueueType!=SESEWaitingQueue.NORMAL){
@@ -4045,8 +4047,7 @@ public class BuildCode {
           }
           output.println();
         }
           }
           output.println();
         }
-        
-      }else{
+      } else {
        ConflictGraph graph = null;
        FlatSESEEnterNode parent = fsen.getParent();
        if (parent != null) {
        ConflictGraph graph = null;
        FlatSESEEnterNode parent = fsen.getParent();
        if (parent != null) {
@@ -4068,7 +4069,7 @@ public class BuildCode {
             output.println("     REntry* rentry=NULL;");
             output.println("     INTPTR* pointer=NULL;");
             output.println("     seseToIssue->common.rentryIdx=0;");
             output.println("     REntry* rentry=NULL;");
             output.println("     INTPTR* pointer=NULL;");
             output.println("     seseToIssue->common.rentryIdx=0;");
-                                       
+
             Set<Integer> queueIDSet=seseWaitingQueue.getQueueIDSet();
             for (Iterator iterator = queueIDSet.iterator(); iterator
                    .hasNext();) {
             Set<Integer> queueIDSet=seseWaitingQueue.getQueueIDSet();
             for (Iterator iterator = queueIDSet.iterator(); iterator
                    .hasNext();) {
@@ -4165,32 +4166,24 @@ public class BuildCode {
               if(enqueueType!=SESEWaitingQueue.NORMAL){
                 output.println("     localCount+=RESOLVEBUF(runningSESE->memoryQueueArray["
                                + queueID+ "],&seseToIssue->common);");
               if(enqueueType!=SESEWaitingQueue.NORMAL){
                 output.println("     localCount+=RESOLVEBUF(runningSESE->memoryQueueArray["
                                + queueID+ "],&seseToIssue->common);");
-              }                                
+              }
             }
             output.println("     }");
           }
           output.println();
         }
       }
             }
             output.println("     }");
           }
           output.println();
         }
       }
-      ////////////////
     }
     }
-    
-    // release this SESE for siblings to update its dependencies or,
-    // eventually, for it to mark itself finished
-    //    output.println("     pthread_mutex_unlock( &(seseToIssue->common.lock) );");
-    
+
+    // Enqueue Task Record
+    if (state.RCR) {
+      output.println("    enqueueTR((void *)seseToIssue);");
+    }
+
     // if there were no outstanding dependencies, issue here
     output.println("     if(  atomic_sub_and_test(10000-localCount,&(seseToIssue->common.unresolvedDependencies) ) ) {");
     output.println("       workScheduleSubmit( (void*)seseToIssue );");
     output.println("     }");
     // if there were no outstanding dependencies, issue here
     output.println("     if(  atomic_sub_and_test(10000-localCount,&(seseToIssue->common.unresolvedDependencies) ) ) {");
     output.println("       workScheduleSubmit( (void*)seseToIssue );");
     output.println("     }");
-    /*
-    output.println("     if( seseToIssue->common.unresolvedDependencies == 0 ) {");
-    output.println("       workScheduleSubmit( (void*)seseToIssue );");
-    output.println("     }");
-    */
-    // release this SESE for siblings to update its dependencies or,
-    // eventually, for it to mark itself finished
-//    output.println("     pthread_mutex_unlock( &(seseToIssue->common.lock) );");
 
     if( state.COREPROF ) {
       output.println("#ifdef CP_EVENTID_TASKDISPATCH");
 
     if( state.COREPROF ) {
       output.println("#ifdef CP_EVENTID_TASKDISPATCH");
@@ -4248,22 +4241,13 @@ public class BuildCode {
     // this SESE cannot be done until all of its children are done
     // so grab your own lock with the condition variable for watching
     // that the number of your running children is greater than zero    
     // this SESE cannot be done until all of its children are done
     // so grab your own lock with the condition variable for watching
     // that the number of your running children is greater than zero    
-    if (GENERATEPRECISEGC){
-       output.println("   stopforgc((struct garbagelist *)&___locals___);");
-    }
     output.println("   pthread_mutex_lock( &("+com+".lock) );");
     output.println("   pthread_mutex_lock( &("+com+".lock) );");
-    if (GENERATEPRECISEGC){
-       output.println("   restartaftergc();");
-    }
-    output.println("   while( "+com+".numRunningChildren > 0 ) {");
-    if (GENERATEPRECISEGC){
-//     output.println("   stopforgc((struct garbagelist *)&(((SESEcommon*)(___params___))[1]));");
-       output.println("   stopforgc((struct garbagelist *)&___locals___);");
-    }
-    output.println("     pthread_cond_wait( &("+com+".runningChildrenCond), &("+com+".lock) );");
-    if (GENERATEPRECISEGC){
-       output.println("   restartaftergc();");
-    }
+    output.println("   if ( "+com+".numRunningChildren > 0 ) {");
+    output.println("     stopforgc((struct garbagelist *)&___locals___);");
+    output.println("     do {");
+    output.println("       pthread_cond_wait( &("+com+".runningChildrenCond), &("+com+".lock) );");
+    output.println("     } while( "+com+".numRunningChildren > 0 );");
+    output.println("     restartaftergc();");
     output.println("   }");
 
 
     output.println("   }");
 
 
@@ -4325,13 +4309,9 @@ public class BuildCode {
     output.println("     }");
     
     
     output.println("     }");
     
     
-//    output.println("     pthread_mutex_lock( &(consumer->lock) );");
-//  output.println("     --(consumer->unresolvedDependencies);");
-//    output.println("     if( consumer->unresolvedDependencies == 0 ) {");
     output.println("     if( atomic_sub_and_test(1, &(consumer->unresolvedDependencies)) ){");
     output.println("       workScheduleSubmit( (void*)consumer );");
     output.println("     }");
     output.println("     if( atomic_sub_and_test(1, &(consumer->unresolvedDependencies)) ){");
     output.println("       workScheduleSubmit( (void*)consumer );");
     output.println("     }");
-//    output.println("     pthread_mutex_unlock( &(consumer->lock) );");
     output.println("   }");
     
     
     output.println("   }");
     
     
@@ -4363,13 +4343,7 @@ public class BuildCode {
     // last of all, decrement your parent's number of running children    
     output.println("   if( "+paramsprefix+"->common.parent != NULL ) {");
     output.println("     if (atomic_sub_and_test(1, &"+paramsprefix+"->common.parent->numRunningChildren)) {");
     // last of all, decrement your parent's number of running children    
     output.println("   if( "+paramsprefix+"->common.parent != NULL ) {");
     output.println("     if (atomic_sub_and_test(1, &"+paramsprefix+"->common.parent->numRunningChildren)) {");
-    if (GENERATEPRECISEGC){
-       output.println("   stopforgc((struct garbagelist *)&___locals___);");
-    }
     output.println("       pthread_mutex_lock( &("+paramsprefix+"->common.parent->lock) );");
     output.println("       pthread_mutex_lock( &("+paramsprefix+"->common.parent->lock) );");
-    if (GENERATEPRECISEGC){
-       output.println("   restartaftergc();");
-    }
     output.println("       pthread_cond_signal( &("+paramsprefix+"->common.parent->runningChildrenCond) );");
     output.println("       pthread_mutex_unlock( &("+paramsprefix+"->common.parent->lock) );");
     output.println("     }");
     output.println("       pthread_cond_signal( &("+paramsprefix+"->common.parent->runningChildrenCond) );");
     output.println("       pthread_mutex_unlock( &("+paramsprefix+"->common.parent->lock) );");
     output.println("     }");
index 79d01055c8251080109fb2b9cfa9c72d4d73db9c..d75e137ebe13d5e36f0a871824f55aebc24e1afa 100644 (file)
@@ -3,6 +3,8 @@ import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.Set;
 import java.util.Vector;
 import java.util.Hashtable;
 import java.util.Set;
 import java.util.Vector;
+import java.util.Iterator;
+import java.util.Collection;
 
 import Analysis.MLP.SESEEffectsKey;
 import Analysis.MLP.SESEEffectsSet;
 
 import Analysis.MLP.SESEEffectsKey;
 import Analysis.MLP.SESEEffectsSet;
@@ -35,7 +37,7 @@ public class FlatSESEEnterNode extends FlatNode {
 
   protected Set<FlatSESEEnterNode> children;
 
 
   protected Set<FlatSESEEnterNode> children;
 
-  protected Set<TempDescriptor> inVars;
+  protected Vector<TempDescriptor> inVars;
   protected Set<TempDescriptor> outVars;
 
   protected Set<SESEandAgePair> needStaticNameInCode;
   protected Set<TempDescriptor> outVars;
 
   protected Set<SESEandAgePair> needStaticNameInCode;
@@ -82,7 +84,7 @@ public class FlatSESEEnterNode extends FlatNode {
     oldestAgeToTrack     = new Integer( 0 );
 
     children             = new HashSet<FlatSESEEnterNode>();
     oldestAgeToTrack     = new Integer( 0 );
 
     children             = new HashSet<FlatSESEEnterNode>();
-    inVars               = new HashSet<TempDescriptor>();
+    inVars               = new Vector<TempDescriptor>();
     outVars              = new HashSet<TempDescriptor>();
     needStaticNameInCode = new HashSet<SESEandAgePair>();
     staticInVarSrcs      = new HashSet<SESEandAgePair>();
     outVars              = new HashSet<TempDescriptor>();
     needStaticNameInCode = new HashSet<SESEandAgePair>();
     staticInVarSrcs      = new HashSet<SESEandAgePair>();
@@ -167,7 +169,8 @@ public class FlatSESEEnterNode extends FlatNode {
   }
 
   public void addInVar( TempDescriptor td ) {
   }
 
   public void addInVar( TempDescriptor td ) {
-    inVars.add( td );
+    if (!inVars.contains(td))
+      inVars.add( td );
   }
 
   public void addOutVar( TempDescriptor td ) {
   }
 
   public void addOutVar( TempDescriptor td ) {
@@ -175,14 +178,22 @@ public class FlatSESEEnterNode extends FlatNode {
   }
 
   public void addInVarSet( Set<TempDescriptor> s ) {
   }
 
   public void addInVarSet( Set<TempDescriptor> s ) {
-    inVars.addAll( s );
+    for(Iterator<TempDescriptor> sit=s.iterator();sit.hasNext();) {
+      TempDescriptor tmp=sit.next();
+      if (!inVars.contains(tmp))
+       inVars.add(tmp);
+    }
   }
 
   public void addOutVarSet( Set<TempDescriptor> s ) {
     outVars.addAll( s );
   }
 
   }
 
   public void addOutVarSet( Set<TempDescriptor> s ) {
     outVars.addAll( s );
   }
 
-  public Set<TempDescriptor> getInVarSet() {
+  public Collection<TempDescriptor> getInVarSet() {
+    return inVars;
+  }
+
+  public Vector<TempDescriptor> getInVarVector() {
     return inVars;
   }
 
     return inVars;
   }
 
index 1714619b7fa68b0b8578c92e328f71958e517352..87c118f5f18adf7c96380ac78c66baba3430f1ce 100644 (file)
@@ -3,6 +3,7 @@ import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.io.FileNotFoundException;
 import java.io.PrintWriter;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.Iterator;
@@ -148,7 +149,7 @@ public class RuntimeConflictResolver {
 
   private void traverseSESEBlock(FlatSESEEnterNode rblock,
       ReachGraph rg) {
 
   private void traverseSESEBlock(FlatSESEEnterNode rblock,
       ReachGraph rg) {
-    Set<TempDescriptor> inVars = rblock.getInVarSet();
+    Collection<TempDescriptor> inVars = rblock.getInVarSet();
     
     if (inVars.size() == 0)
       return;
     
     if (inVars.size() == 0)
       return;
@@ -190,11 +191,7 @@ public class RuntimeConflictResolver {
     }
   }
   
     }
   }
   
-
-  private void traverseStallSite(
-      FlatNode enterNode,
-      TempDescriptor invar,
-      ReachGraph rg) {
+  private void traverseStallSite(FlatNode enterNode, TempDescriptor invar, ReachGraph rg) {
     TypeDescriptor type = invar.getType();
     if(type == null || type.isPrimitive()) {
       return;
     TypeDescriptor type = invar.getType();
     if(type == null || type.isPrimitive()) {
       return;
index 6a2972ea1cb44d24af1dabe3076c0b3cdac7205e..743fe18944d593b7cee9217b402b7cf35ff18aad 100644 (file)
@@ -122,6 +122,9 @@ typedef struct SESEcommon_t {
 
   int numDependentSESErecords;
   int offsetToDepSESErecords;
 
   int numDependentSESErecords;
   int offsetToDepSESErecords;
+#ifdef RCR
+  int offsetToParamRecords;
+#endif
 
   // for determining when task records can be returned
   // to the parent record's memory pool
 
   // for determining when task records can be returned
   // to the parent record's memory pool
index f0382d66041c161bdaee712c02a9f24b2d6f585e..cbf4e06b1280fea11f1640f834f4a79368933f01 100644 (file)
@@ -1,8 +1,17 @@
 #include "rcr_runtime.h"
 #include "rcr_runtime.h"
+#include "mlp_runtime.h"
 
 void workerTR(void *x) {
   struct trQueue * queue=(struct trQueue *)x;
   while(true) {
 
 void workerTR(void *x) {
   struct trQueue * queue=(struct trQueue *)x;
   while(true) {
+    SESEcommon * tmp;
+    do {
+      tmp=(SESEcommon *) dequeueTR(TRqueue);
+      if (tmp!=NULL)
+       break;
+      sched_yield();
+    } while(1);
+    
     
   }
 }
     
   }
 }
index bcc90a015bf94faa5a7a9ba51d04897db04b99eb..fe5b478243df7299b00589b5e6d7735d695b6e15 100644 (file)
@@ -5,4 +5,12 @@ extern __thread struct trqueue * TRqueue;
 
 void workerTR(void *);
 
 
 void workerTR(void *);
 
+#define RCRSIZE 32
+
+struct rcrRecord {
+  int count;
+  int index;
+  int flag;
+  int array[RCRSIZE];
+};
 #endif
 #endif
index bdca1127ca252fcb5644e178fbda59d06fa4b158..f342bedc1123808477c71c0270c8456b88ebfed5 100644 (file)
@@ -6,6 +6,9 @@
 #include "workschedule.h"
 #include "mlp_runtime.h"
 #include "coreprof/coreprof.h"
 #include "workschedule.h"
 #include "mlp_runtime.h"
 #include "coreprof/coreprof.h"
+#ifdef RCR
+#include "rcr_runtime.h"
+#endif
 
 // NOTE: Converting this from a work-stealing strategy
 // to a single-queue thread pool protected by a single
 
 // NOTE: Converting this from a work-stealing strategy
 // to a single-queue thread pool protected by a single
@@ -50,6 +53,10 @@ extern __thread SESEcommon* seseCommon;
 
 __thread int oid;
 
 
 __thread int oid;
 
+#ifdef RCR
+#include "trqueue.h"
+__thread struct trqueue * TRqueue;
+#endif
 
 
 void workerExit( void* arg ) {
 
 
 void workerExit( void* arg ) {
@@ -57,8 +64,6 @@ void workerExit( void* arg ) {
   CP_EXIT();
 }
 
   CP_EXIT();
 }
 
-
-
 void* workerMain( void* arg ) {
   void*       workUnit;
   WorkerData* myData = (WorkerData*) arg;
 void* workerMain( void* arg ) {
   void*       workUnit;
   WorkerData* myData = (WorkerData*) arg;
@@ -74,6 +79,21 @@ void* workerMain( void* arg ) {
   // oid with value 0 indicates an invalid object
   oid = myData->id + 1;
 
   // oid with value 0 indicates an invalid object
   oid = myData->id + 1;
 
+#ifdef RCR
+  //allocate task record queue
+  pthread_t thread;
+  pthread_attr_t nattr;  
+  pthread_attr_init(&nattr);
+  pthread_attr_setdetachstate(&nattr, PTHREAD_CREATE_DETACHED);
+  TRqueue=allocTR();
+  int status = pthread_create( &(workerDataArray[i].workerThread), 
+                              NULL,
+                              workerTR,
+                              (void*) TRqueue);
+  pthread_attr_destroy(&nattr);
+  if( status != 0 ) { printf( "Error\n" ); exit( -1 ); }
+#endif
+
   //pthread_setcanceltype ( PTHREAD_CANCEL_ASYNCHRONOUS, &oldState );
   //pthread_setcancelstate( PTHREAD_CANCEL_ENABLE,       &oldState );
 
   //pthread_setcanceltype ( PTHREAD_CANCEL_ASYNCHRONOUS, &oldState );
   //pthread_setcancelstate( PTHREAD_CANCEL_ENABLE,       &oldState );