SDAG: Don't free a stored message until it's dead
authorPhil Miller <mille121@illinois.edu>
Mon, 7 Mar 2011 01:54:16 +0000 (19:54 -0600)
committerPhil Miller <mille121@illinois.edu>
Mon, 7 Mar 2011 02:32:36 +0000 (20:32 -0600)
Commit 8f693c5af40eb40733a750b5802ab5f292b4288f added message
reference count increment/decrement calls to SDAG to enable marking
the targets in a 'when' clause as [nokeep]. However, it freed the
messages after the first SDAG statement in the body of the when,
rather than the last. This error was found in the course of Charm LU
development.

src/xlat-i/sdag/CSdagConstruct.C

index 35f7124034c602b5c0a0294d499f2eb439f01211..f5f8815c9752daa620bcab67cb392014a9b92207 100644 (file)
@@ -813,8 +813,6 @@ void SdagConstruct::generateWhen(XStr& op)
     e = el->entry;
     if (e->paramIsMarshalled() == 1) {
         op << "       delete " << e->getEntryName() << "_msg;\n";
     e = el->entry;
     if (e->paramIsMarshalled() == 1) {
         op << "       delete " << e->getEntryName() << "_msg;\n";
-    } else if (e->param->isMessage() == 1) {
-       op << "       CmiFree(UsrToEnv(" << e->param->param->getGivenName() << "));\n";
     }
     el = el->next;
   }
     }
     el = el->next;
   }
@@ -980,6 +978,18 @@ void SdagConstruct::generateWhen(XStr& op)
   generateCall(op, *stateVars); 
   
   op << ");\n";
   generateCall(op, *stateVars); 
   
   op << ");\n";
+
+  el = elist;
+  while (el) {
+    e = el->entry;
+    if (e->param->isMessage() == 1) {
+      sv = e->stateVars->begin();
+      op << "    CmiFree(UsrToEnv(" << sv->name->charstar() << "));\n";
+    }
+
+    el = el->next;
+  }
+
   // end actual code
   op << "  }\n\n";
 }
   // end actual code
   op << "  }\n\n";
 }