nasty bug...have to make sure we don't free a task record before it clears the memory...
authorbdemsky <bdemsky>
Tue, 9 Nov 2010 07:48:19 +0000 (07:48 +0000)
committerbdemsky <bdemsky>
Tue, 9 Nov 2010 07:48:19 +0000 (07:48 +0000)
Robust/src/IR/Flat/BuildCode.java
Robust/src/Runtime/mlp_runtime.h

index 156dc737ce0fd6cd93eb23fddf93a44818e0315d..97e09ca02742577e4e91c06195580efbd0ddbf54 100644 (file)
@@ -3119,7 +3119,8 @@ public class BuildCode {
     output.println("     stallrecord->common.unresolvedDependencies=10000;");
     output.println("     stallrecord->common.rcrstatus=1;");
     output.println("     stallrecord->common.offsetToParamRecords=(INTPTR) & (((SESEstall *)0)->rcrRecords);");
-    output.println("     stallrecord->common.refCount = 3;");
+    output.println("     stallrecord->common.refCount = 10003;");
+    output.println("     int refCount=10000;");
     output.println("     int localCount=10000;");
     output.println("     stallrecord->rcrRecords[0].index=0;");
     output.println("     stallrecord->rcrRecords[0].flag=0;");
@@ -3143,6 +3144,7 @@ public class BuildCode {
       output.println("     if(ADDRENTRY(runningSESE->memoryQueueArray["
                     + waitingElement.getQueueID() + "],rentry)==NOTREADY) {");
       output.println("       localCount--;");
+      output.println("       refCount--;");
       output.println("     }");
       output.println("#if defined(RCR)&&!defined(OOO_DISABLE_TASKMEMPOOL)");
       output.println("     else poolfreeinto(runningSESE->memoryQueueArray["+waitingElement.getQueueID()+"]->rentrypool, rentry);");
@@ -3188,7 +3190,7 @@ public class BuildCode {
     output.println("     }");
     //release our reference to stall record
     output.println("#ifndef OOO_DISABLE_TASKMEMPOOL");
-    output.println("  RELEASE_REFERENCE_TO((SESEcommon *)stallrecord);");
+    output.println("  RELEASE_REFERENCES_TO((SESEcommon *)stallrecord, refCount);");
     output.println("#endif");
     output.println("   }");//exit block
   }
@@ -4108,7 +4110,8 @@ public class BuildCode {
     if( state.RCR ) {
       // if we're using RCR, ref count is 3 because the traverser has
       // a reference, too
-      output.println("     seseToIssue->common.refCount = 3;");
+      output.println("     seseToIssue->common.refCount = 10003;");
+      output.println("     int refCount=10000;");
     } else {
       output.println("     seseToIssue->common.refCount = 2;");
     }
@@ -4585,6 +4588,7 @@ public class BuildCode {
            output.println("       rentry->queue=runningSESE->memoryQueueArray[" + waitingElement.getQueueID()+"];");
            
            output.println("       if(ADDRENTRY(runningSESE->memoryQueueArray["+ waitingElement.getQueueID()+ "],rentry)==READY) {");
+           output.println("         refCount--;");
            for(int j=0;mask!=0;j++) {
              if ((mask&1)==1)
                output.println("          dispCount"+j+"++;");
@@ -4603,6 +4607,12 @@ public class BuildCode {
          output.println("     if(!dispCount"+i+" || !atomic_sub_and_test(dispCount"+i+",&(seseToIssue->rcrRecords["+i+"].flag)))");
          output.println("       localCount++;");
        }
+
+       output.println("#ifndef OOO_DISABLE_TASKMEMPOOL");
+       output.println("  RELEASE_REFERENCES_TO((SESEcommon *)seseToIssue, refCount);");
+       output.println("#endif");
+
+
        output.println("    }");
       }
     }
index 3e1610e042bd2fede3caad119c63800e355bc8a1..4e4e343eece92ef831c95834595baf701957b102 100644 (file)
@@ -301,6 +301,14 @@ static inline int RELEASE_REFERENCE_TO( SESEcommon* seseRec ) {
   return 0;
 }
 
+static inline int RELEASE_REFERENCES_TO( SESEcommon* seseRec, int refCount) {
+  if( atomic_sub_and_test( refCount, &(seseRec->refCount) ) ) {
+    poolfreeinto( seseRec->parent->taskRecordMemPool, seseRec );
+    return 1;
+  }
+  return 0;
+}
+
 #define CHECK_RECORD(x) ;