fixes in handling unresolved pointer.
authoryeom <yeom>
Fri, 9 Apr 2010 17:57:58 +0000 (17:57 +0000)
committeryeom <yeom>
Fri, 9 Apr 2010 17:57:58 +0000 (17:57 +0000)
Robust/src/IR/Flat/BuildCode.java
Robust/src/Runtime/mlp_runtime.c
Robust/src/Runtime/mlp_runtime.h

index 7f061e870ab9ce8ff676948049be1c9b4ae3f304..1aa30566d2d2bed67dc84daa0829333749b1093f 100644 (file)
@@ -3386,88 +3386,6 @@ public class BuildCode {
        output.println("     seseToIssue->"+srcPair+" = "+srcPair+";");
       }
       
-      ////////////////
-      // count up memory conflict dependencies,
-      // eom
-       ConflictGraph graph = null;
-       FlatSESEEnterNode parent = fsen.getParent();
-       if (parent != null) {
-               if (parent.isCallerSESEplaceholder) {
-                       graph = mlpa.getConflictGraphResults().get(parent.getfmEnclosing());
-               } else {
-                       graph = mlpa.getConflictGraphResults().get(parent);
-               }
-       }
-                       if (graph != null && graph.hasConflictEdge()) {
-                               HashSet<SESELock> seseLockSet = mlpa.getConflictGraphLockMap()
-                                               .get(graph);
-                               output.println();
-                               output.println("     //add memory queue element");
-                               Set<WaitingElement> waitingQueueSet = graph
-                                               .getWaitingElementSetBySESEID(fsen.getIdentifier(),
-                                                               seseLockSet);
-                               if (waitingQueueSet.size() > 0) {
-                                       output.println("     {");
-                                       output.println("     REntry* rentry=NULL;");
-                                       output.println("     seseToIssue->common.rentryIdx=0;");
-                                       for (Iterator iterator = waitingQueueSet.iterator(); iterator
-                                                       .hasNext();) {
-                                               WaitingElement waitingElement = (WaitingElement) iterator
-                                                               .next();
-
-                                               if (waitingElement.getStatus() >= ConflictNode.COARSE) {
-                                                       output.println("     rentry=mlpCreateREntry("
-                                                                       + waitingElement.getStatus()
-                                                                       + ", seseToIssue);");
-                                               } else {
-                                                       TempDescriptor td = waitingElement.getTempDesc();
-                                                               output
-                                                                               .println("     rentry=mlpCreateFineREntry("
-                                                                                               + waitingElement.getStatus()
-                                                                                               + ", seseToIssue,  seseToIssue->"
-                                                                                               + waitingElement.getDynID()
-                                                                                               + ");");
-                                                       if (td != null) {
-                                                               VariableSourceToken vst = fsen
-                                                                               .getStaticInVarSrc(td);
-                                                               String srcId = "SESE_"
-                                                                               + vst.getSESE().getPrettyIdentifier()
-                                                                               + vst.getSESE().getIdentifier() + "_"
-                                                                               + vst.getAge();
-                                                               output.println("     if(seseToIssue->"
-                                                                               + waitingElement.getDynID()
-                                                                               + " == NULL) {");
-                                                               output
-                                                                               .println("        rentry->pointer=(void*)&seseToIssue->"
-                                                                                               + srcId
-                                                                                               + "->"
-                                                                                               + waitingElement.getDynID()
-                                                                                               + ";");
-                                                               output
-                                                                               .println("        seseToIssue->common.unresolvedRentryArray[seseToIssue->common.unresolvedRentryIdx++]=rentry;");
-                                                               output.println("     }");
-                                                       }
-                                               }
-                                               output
-                                                               .println("     rentry->queue=parentCommon->memoryQueueArray["
-                                                                               + waitingElement.getQueueID() + "];");
-                                               output
-                                                               .println("     seseToIssue->common.rentryArray[seseToIssue->common.rentryIdx++]=rentry;");
-                                               output
-                                                               .println("     if(ADDRENTRY(parentCommon->memoryQueueArray["
-                                                                               + waitingElement.getQueueID()
-                                                                               + "],rentry)==NOTREADY){");
-                                               output.println("        ++(localCount);");
-                                               output.println("     } ");
-                                               output.println();
-                                       }
-                                       output.println("     }");
-                               }
-                               output.println();
-                       }
-      
-      ////////////////
-
       // dynamic sources might already be accounted for in the static list,
       // so only add them to forwarding lists if they're not already there
       Iterator<TempDescriptor> dynVarsItr = fsen.getDynamicInVarSet().iterator();
@@ -3531,6 +3449,97 @@ public class BuildCode {
        }      
        output.println("     "+pair+" = seseToIssue;");
       }
+      
+      ////////////////
+      // count up memory conflict dependencies,
+      // eom
+       ConflictGraph graph = null;
+       FlatSESEEnterNode parent = fsen.getParent();
+       if (parent != null) {
+               if (parent.isCallerSESEplaceholder) {
+                       graph = mlpa.getConflictGraphResults().get(parent.getfmEnclosing());
+               } else {
+                       graph = mlpa.getConflictGraphResults().get(parent);
+               }
+       }
+                       if (graph != null && graph.hasConflictEdge()) {
+                               HashSet<SESELock> seseLockSet = mlpa.getConflictGraphLockMap()
+                                               .get(graph);
+                               output.println();
+                               output.println("     //add memory queue element");
+                               Set<WaitingElement> waitingQueueSet = graph
+                                               .getWaitingElementSetBySESEID(fsen.getIdentifier(),
+                                                               seseLockSet);
+                               if (waitingQueueSet.size() > 0) {
+                                       output.println("     {");
+                                       output.println("     REntry* rentry=NULL;");
+                                       output.println("     INTPTR* pointer=NULL;");
+                                       output.println("     seseToIssue->common.rentryIdx=0;");
+                                       for (Iterator iterator = waitingQueueSet.iterator(); iterator
+                                                       .hasNext();) {
+                                               WaitingElement waitingElement = (WaitingElement) iterator
+                                                               .next();
+
+                                               if (waitingElement.getStatus() >= ConflictNode.COARSE) {
+                                                       output.println("     rentry=mlpCreateREntry("
+                                                                       + waitingElement.getStatus()
+                                                                       + ", seseToIssue);");
+                                               } else {
+                                                       TempDescriptor td = waitingElement.getTempDesc();
+                                                       // decide whether waiting element is dynamic or
+                                                       // static
+                                                       if(fsen.getDynamicInVarSet().contains(td)){
+                                                               // dynamic in-var case
+                                                               output.println("     pointer=seseToIssue->"+ waitingElement.getDynID()+"_srcSESE+seseToIssue->"+ waitingElement.getDynID()+"_srcOffset;");
+                                                               output.println("     rentry=mlpCreateFineREntry("
+                                                                               + waitingElement.getStatus()
+                                                                               + ", seseToIssue,  pointer );");                                                                
+                                                       }else if(fsen.getStaticInVarSet().contains(td)){
+                                                               // static in-var case
+                                                               VariableSourceToken vst = fsen.getStaticInVarSrc(td);
+                                                               if (vst != null) {
+                                                                       String srcId = "SESE_"
+                                                                                       + vst.getSESE()
+                                                                                                       .getPrettyIdentifier()
+                                                                                       + vst.getSESE().getIdentifier()
+                                                                                       + "_" + vst.getAge();
+                                                                       output
+                                                                       .println("     pointer=(void*)&seseToIssue->"
+                                                                                       + srcId
+                                                                                       + "->"
+                                                                                       + waitingElement.getDynID()
+                                                                                       + ";");
+                                                                       output.println("     rentry=mlpCreateFineREntry("
+                                                                                       + waitingElement.getStatus()
+                                                                                       + ", seseToIssue,  pointer );");                
+                                                               }
+                                                       }else{
+                                                               output.println("     rentry=mlpCreateFineREntry("
+                                                                               + waitingElement.getStatus()
+                                                                               + ", seseToIssue,  (void*)&seseToIssue->"
+                                                                               + waitingElement.getDynID() + ");");
+                                                       }
+                                               }
+                                               output
+                                                               .println("     rentry->queue=parentCommon->memoryQueueArray["
+                                                                               + waitingElement.getQueueID() + "];");
+                                               output
+                                                               .println("     seseToIssue->common.rentryArray[seseToIssue->common.rentryIdx++]=rentry;");
+                                               output
+                                                               .println("     if(ADDRENTRY(parentCommon->memoryQueueArray["
+                                                                               + waitingElement.getQueueID()
+                                                                               + "],rentry)==NOTREADY){");
+                                               output.println("        ++(localCount);");
+                                               output.println("     } ");
+                                               output.println();
+                                       }
+                                       output.println("     }");
+                               }
+                               output.println();
+                       }
+      
+      ////////////////
+                       
  
     }
     
@@ -3635,14 +3644,16 @@ public class BuildCode {
     output.println("   while( !isEmpty( "+com+".forwardList ) ) {");
     output.println("     SESEcommon* consumer = (SESEcommon*) getItem( "+com+".forwardList );");
     
-    output.println("     if(consumer->unresolvedRentryIdx>0){");
+   
+    output.println("     if(consumer->rentryIdx>0){");
     output.println("        // resolved null pointer");
     output.println("        int idx;");
-    output.println("        for(idx=0;idx<consumer->unresolvedRentryIdx;idx++){");
-    output.println("           resolvePointer(consumer->unresolvedRentryArray[idx]);");
+    output.println("        for(idx=0;idx<consumer->rentryIdx;idx++){");
+    output.println("           resolvePointer(consumer->rentryArray[idx]);");
     output.println("        }");
     output.println("     }");
     
+    
 //    output.println("     pthread_mutex_lock( &(consumer->lock) );");
 //  output.println("     --(consumer->unresolvedDependencies);");
 //    output.println("     if( consumer->unresolvedDependencies == 0 ) {");
index 7f931d6f530470ef2b3a6a1daabcad553e46a901..fc0fcef32befe021ff3de531db10b80c07a51071 100644 (file)
@@ -51,7 +51,7 @@ REntry* mlpCreateFineREntry(int type, void* seseToIssue, void* dynID){
   REntry* newREntry=(REntry*)RUNMALLOC(sizeof(REntry));
   newREntry->type=type;
   newREntry->seseRec=seseToIssue;
-  newREntry->dynID=dynID; 
+  newREntry->pointer=dynID;
   return newREntry;
 }
 
@@ -239,44 +239,35 @@ int ADDTABLE(MemoryQueue *q, REntry *r) {
 
   //at this point, have table
   Hashtable* table=(Hashtable*)q->tail;
-  r->hashtable=table;
-  if(r->pointer!=0 && (*(r->pointer)==0 || (*(r->pointer)!=0 && table->unresolvedQueue!=NULL))){
-     struct Queue* val;
+  r->hashtable=table; // set rentry's hashtable
+  if((*(r->pointer)==0 || (*(r->pointer)!=0 && BARRIER() && table->unresolvedQueue!=NULL))){
+    struct Queue* val;
     // grab lock on the queue    
     do {  
       val=(struct Queue*)0x1;       
       val=(struct Queue*)LOCKXCHG((unsigned INTPTR*)&(table->unresolvedQueue), (unsigned INTPTR)val);
-    } while(val==(struct Queue*)0x1);  
-
+    } while(val==(struct Queue*)0x1);     
     if(val==NULL){
-      //first case
+      //queue is null, first case
       if(*(r->pointer)!=0){
-       // pointer is already resolved.
-       table->unresolvedQueue=val; //released lock;
-       return ADDTABLE(q,r);
+       // check whether pointer is already resolved, or not.
+       table->unresolvedQueue=NULL; //released lock;
+       return ADDTABLEITEM(table,r,TRUE);
       }
-      table->unresolvedQueue=(struct Queue*)0x1;
       struct Queue* queue=createQueue();
-      addNewItem(queue,r);
+      addNewItemBack(queue,r);
       atomic_inc(&table->item.total); 
       table->unresolvedQueue=queue; // expose new queue     
-    }else{
-      if(val==NULL){
-       // someone else has already cleared all queue stuff
-       table->unresolvedQueue=val; // released lock
-       return ADDTABLE(q,r);
-      }
+    }else{ 
+      // add unresolved rentry at the end of the queue.
       addNewItemBack(val,r);
       atomic_inc(&table->item.total);    
       table->unresolvedQueue=val; // released lock
     }   
     return NOTREADY;
   }
-  if(r->pointer!=0){
-    r->dynID=(void*)*(r->pointer); // interim fix.
-  }
   BinItem * val;
-  int key=generateKey((unsigned int)(unsigned INTPTR)r->dynID);
+  int key=generateKey((unsigned int)(unsigned INTPTR)*(r->pointer));
   do {  
     val=(BinItem*)0x1;       
     BinElement* bin=table->array[key];
@@ -294,22 +285,23 @@ int ADDTABLE(MemoryQueue *q, REntry *r) {
   }
 }
 
-int ADDTABLEITEM(Hashtable* table, REntry* r){
+int ADDTABLEITEM(Hashtable* table, REntry* r, int inc){
   BinItem * val;
-  int key=generateKey((unsigned int)(unsigned INTPTR)r->dynID);
+  int key=generateKey((unsigned int)(unsigned INTPTR)*(r->pointer));
   do {  
     val=(BinItem*)0x1;       
     BinElement* bin=table->array[key];
-    val=(BinItem*)LOCKXCHG((unsigned INTPTR*)&(bin->head), (unsigned INTPTR)val);//note...talk to me about optimizations here. 
+    val=(BinItem*)LOCKXCHG((unsigned INTPTR*)&(bin->head), (unsigned INTPTR)val); 
   } while(val==(BinItem*)0x1);
   //at this point have locked bin
   if (val==NULL) {
-    return EMPTYBINCASE(table, table->array[key], r, FALSE);
+    return EMPTYBINCASE(table, table->array[key], r, inc);
   } else {
     if (isFineWrite(r)) {
-      return WRITEBINCASE(table, r, val, key, FALSE);
+      return WRITEBINCASE(table, r, val, key, inc);
     } else if (isFineRead(r)) {
-      return READBINCASE(table, r, val, key, FALSE);
+      return READBINCASE(table, r, val, key, inc);
     }
   }
 }
@@ -388,9 +380,9 @@ int WRITEBINCASE(Hashtable *T, REntry *r, BinItem *val, int key, int inc) {
 READBINCASE(Hashtable *T, REntry *r, BinItem *val, int key, int inc) {
   BinItem * bintail=T->array[key]->tail;
   if (isReadBinItem(bintail)) {
-    return TAILREADCASE(T, r, val, bintail, key);
+    return TAILREADCASE(T, r, val, bintail, key, inc);
   } else if (!isReadBinItem(bintail)) {
-    TAILWRITECASE(T, r, val, bintail, key);
+    TAILWRITECASE(T, r, val, bintail, key, inc);
     return NOTREADY;
   }
 }
@@ -572,7 +564,7 @@ RETIREHASHTABLE(MemoryQueue *q, REntry *r) {
 }
 
 RETIREBIN(Hashtable *T, REntry *r, BinItem *b) {
-  int key=generateKey((unsigned int)(unsigned INTPTR)r->dynID);
+  int key=generateKey((unsigned int)(unsigned INTPTR)*(r->pointer));
   if(isFineRead(r)) {
     atomic_dec(&b->total);
   }
@@ -776,8 +768,12 @@ resolveDependencies(REntry* rentry){
 }
 
 resolvePointer(REntry* rentry){  
-  rentry->dynID=(void*)*(rentry->pointer); // interim.
   Hashtable* table=rentry->hashtable;
+  if(table==NULL){
+    //resolved already before related rentry is enqueued to the waiting queue
+    return;
+  }
   struct Queue* val;
   do {  
     val=(struct Queue*)0x1;       
@@ -796,9 +792,8 @@ resolvePointer(REntry* rentry){
          break;
        }
        removeItem(val,head);
-       if(ADDTABLEITEM(table, rentry)==READY){
-         SESEcommon* seseCommon=(SESEcommon*)rentry->seseRec;
-         atomic_sub_and_test(1, &(seseCommon->unresolvedDependencies));
+       if(ADDTABLEITEM(table, rentry, FALSE)==READY){
+         resolveDependencies(rentry);
        }
       }else{
        table->unresolvedQueue=NULL; // set hashtable as normal-mode.
@@ -806,7 +801,7 @@ resolvePointer(REntry* rentry){
       }
     }while(TRUE);
   }else{
+    // resolved rentry is not head of queue
     table->unresolvedQueue=val;//released lock;
   }  
 }
-
index 489d388f83003ddbfcc08eb448136407d4febdfa..4348cd5cf3933e4eb42ab99c620949d9bb4986fc 100644 (file)
@@ -57,7 +57,6 @@ typedef struct REntry_t{
   struct MemoryQueue_t* queue;
   psemaphore parentStallSem;
   void* seseRec;
-  void* dynID;
   INTPTR* pointer;
 } REntry;