Merge branch 'charm' of charmgit:charm into charm
authorGengbin Zheng <gzheng@illinois.edu>
Fri, 28 Jan 2011 20:22:21 +0000 (14:22 -0600)
committerGengbin Zheng <gzheng@illinois.edu>
Fri, 28 Jan 2011 20:22:21 +0000 (14:22 -0600)
13 files changed:
contrib/ci.vim
examples/charm++/typed_reduction/Makefile [new file with mode: 0644]
examples/charm++/typed_reduction/TypedReduction.cc [new file with mode: 0644]
examples/charm++/typed_reduction/TypedReduction.ci [new file with mode: 0644]
examples/charm++/typed_reduction/TypedReduction.h [new file with mode: 0644]
src/ck-core/ckmemcheckpoint.C
src/ck-core/ckreduction.h
src/langs/charj/share/charj.vim
src/langs/charj/tests/fib/Fib.cj
src/langs/charj/tests/unit/ObjectField.cj
src/util/pup_stl.h
src/xlat-i/xi-symbol.C
src/xlat-i/xi-symbol.h

index ff64f97a52dd9a107e06342053e3420ed7b5b359..08811d46409f62e163d1835ceea07471a582082a 100644 (file)
@@ -31,7 +31,7 @@ syn keyword cppOperator               and bitor or xor compl bitand and_eq or_eq xor_eq not n
 syn match cppCast              "\<\(const\|static\|dynamic\|reinterpret\)_cast\s*<"me=e-1
 syn match cppCast              "\<\(const\|static\|dynamic\|reinterpret\)_cast\s*$"
 syn keyword cppStorageClass    mutable
-syn keyword cppStorageClass    threaded sync exclusive nokeep notrace immediate expedited inline local python accel readwrite writeonly accelblock memcritical packed varsize initproc initnode initcall stacksize createhere createhome
+syn keyword cppStorageClass    threaded sync exclusive nokeep notrace immediate expedited inline local python accel readwrite writeonly accelblock memcritical packed varsize initproc initnode initcall stacksize createhere createhome reductiontarget
 syn keyword cppStructure       class typename template namespace message conditional
 syn keyword cppStructure        mainmodule mainchare module chare array group nodegroup
 syn keyword cppNumber          NPOS
diff --git a/examples/charm++/typed_reduction/Makefile b/examples/charm++/typed_reduction/Makefile
new file mode 100644 (file)
index 0000000..4fac284
--- /dev/null
@@ -0,0 +1,27 @@
+CHARMC = ../../../bin/charmc
+BINARY = typed_reduction
+
+CHARMCFLAGS =
+CHARMCLINKFLAGS = -language charm++
+TESTFLAGS = 
+
+%.o: %.cc
+
+all: $(BINARY)
+$(BINARY): $(patsubst %.cc,%.o,$(wildcard *.cc))
+       $(CHARMC) $(CHARMCLINKFLAGS) -o $@ $+
+
+.SECONDARY: $(patsubst %.cc,%.decl.h,$(wildcard *.cc))
+.SECONDARY: $(patsubst %.cc,%.def.h,$(wildcard *.cc))
+
+%.o: %.cc %.decl.h %.def.h
+       $(CHARMC) $(CHARMCFLAGS) $<
+
+%.decl.h %.def.h: %.ci
+       $(CHARMC) $(CHARMCFLAGS) $<
+
+test: $(BINARY)
+       ./charmrun ./$(BINARY) $(TESTFLAGS)
+
+clean:
+       rm -f *.o *.decl.h *.def.h charmrun $(BINARY)
diff --git a/examples/charm++/typed_reduction/TypedReduction.cc b/examples/charm++/typed_reduction/TypedReduction.cc
new file mode 100644 (file)
index 0000000..15b3434
--- /dev/null
@@ -0,0 +1,62 @@
+#include "TypedReduction.h"
+#include <stdlib.h>
+
+Driver::Driver(CkArgMsg* args) {
+    int array_size = 10;
+    if (args->argc > 1) array_size = strtol(args->argv[1], NULL, 10);
+    w = CProxy_Worker::ckNew(array_size);
+    CkCallback *cb = new CkCallback(CkIndex_Driver::untyped_done(NULL), thisProxy);
+    w.ckSetReductionClient(cb);
+    w.reduce();
+}
+
+void Driver::untyped_done(CkReductionMsg* m) {
+    int* output = (int*)m->getData();
+    CkPrintf("Untyped Sum: %d\n", output[0]);
+    delete m;
+
+    CkCallback *cb = new CkCallback(
+            CkIndex_Driver::typed_done_redn_wrapper(NULL), thisProxy);
+    w.ckSetReductionClient(cb);
+    w.reduce();
+}
+
+void Driver::typed_done(int result)
+{
+    CkPrintf("Typed Sum: %d\n", result);
+    CkCallback *cb = new CkCallback(
+            CkIndex_Driver::typed_array_done_redn_wrapper(NULL), thisProxy);
+    w.ckSetReductionClient(cb);
+    w.reduce_array();
+}
+
+void Driver::typed_array_done(int* results, int n)
+{
+    CkPrintf("Typed Sum: [ ");
+    for (int i=0; i<n; ++i) CkPrintf("%d ", results[i]);
+    CkPrintf("]\n");
+    CkCallback *cb = new CkCallback(
+            CkIndex_Driver::typed_array_done2_redn_wrapper(NULL), thisProxy);
+    w.ckSetReductionClient(cb);
+    w.reduce_array();
+}
+
+void Driver::typed_array_done2(int x, int y, int z)
+{
+    CkPrintf("Typed Sum: (x, y, z) = (%d, %d, %d)\n", x, y, z);
+    CkExit();
+}
+
+Worker::Worker() { }
+
+void Worker::reduce() {
+    int contribution = 1;
+    contribute(1*sizeof(int), &contribution, CkReduction::sum_int); 
+}
+
+void Worker::reduce_array() {
+    int contribution[3] = { 1, 2, 3 };
+    contribute(3*sizeof(int), &contribution, CkReduction::sum_int); 
+}
+
+#include "TypedReduction.def.h"
diff --git a/examples/charm++/typed_reduction/TypedReduction.ci b/examples/charm++/typed_reduction/TypedReduction.ci
new file mode 100644 (file)
index 0000000..14df6e4
--- /dev/null
@@ -0,0 +1,15 @@
+mainmodule TypedReduction {
+    mainchare Driver {
+        entry Driver(CkArgMsg*);
+        entry void untyped_done(CkReductionMsg* msg);
+        entry [reductiontarget] void typed_done(int x);
+        entry [reductiontarget] void typed_array_done(int results[n], int n);
+        entry [reductiontarget] void typed_array_done2(int x, int y, int z);
+    }
+
+    array [1d] Worker {
+        entry Worker(void);
+        entry void reduce(void);
+        entry void reduce_array(void);
+    }
+}
diff --git a/examples/charm++/typed_reduction/TypedReduction.h b/examples/charm++/typed_reduction/TypedReduction.h
new file mode 100644 (file)
index 0000000..87e4b74
--- /dev/null
@@ -0,0 +1,20 @@
+#include "TypedReduction.decl.h"
+class Driver : public CBase_Driver {
+    public: 
+        Driver(CkArgMsg*);
+        void untyped_done(CkReductionMsg* m);
+        void typed_done(int x);
+        void typed_array_done(int* results, int n);
+        void typed_array_done2(int x, int y, int z);
+    private:
+        CProxy_Worker w;
+};
+
+class Worker : public CBase_Worker {
+    public:
+        Worker(void);
+        Worker(CkMigrateMessage* m) {}
+        void reduce();
+        void reduce_array();
+};
+
index 4882531d132950677fa2327aadd0445c18454479..7c05c73c190d9c7cf427e674f145fa99f0e65653 100644 (file)
@@ -57,8 +57,7 @@ TODO:
 #define CK_NO_PROC_POOL                                1
 
 #define STREAMING_INFORMHOME                    1
-
-int crashed_node = -1;
+CpvDeclare(int, _crashedNode);
 
 // static, so that it is accessible from Converse part
 int CkMemCheckPT::inRestarting = 0;
@@ -88,7 +87,7 @@ CpvDeclare(CkProcCheckPTMessage*, procChkptBuf);
 
 // compute the backup processor
 // FIXME: avoid crashed processors
-inline int ChkptOnPe(int pe) { return (pe+1)%CkNumPes(); }
+inline int ChkptOnPe(int pe) { return (pe+CmiMyNodeSize())%CkNumPes(); }
 
 inline int CkMemCheckPT::BuddyPE(int pe)
 {
@@ -885,7 +884,8 @@ void CkMemCheckPT::recoverArrayElements()
   CKLOCMGR_LOOP(mgr->doneInserting(););
 
   inRestarting = 0;
-  crashed_node = -1;
+ // _crashedNode = -1;
+CpvAccess(_crashedNode) = -1;
 
   if (CkMyPe() == 0)
     CkStartQD(CkCallback(CkIndex_CkMemCheckPT::finishUp(), thisProxy));
@@ -1099,29 +1099,44 @@ static void askProcDataHandler(char *msg)
 // called on PE 0
 void qd_callback(void *m)
 {
-   CmiPrintf("[%d] callback after QD for crashed node: %d. \n", CkMyPe(), crashed_node);
+   CmiPrintf("[%d] callback after QD for crashed node: %d. \n", CkMyPe(), CpvAccess(_crashedNode));
    CkFreeMsg(m);
+#ifdef CMK_SMP
+   for(int i=0;i<CmiMyNodeSize();i++){
+   char *msg = (char*)CmiAlloc(CmiMsgHeaderSizeBytes+sizeof(int));
+   *(int *)(msg+CmiMsgHeaderSizeBytes) =CpvAccess(_crashedNode);
+       CmiSetHandler(msg, askProcDataHandlerIdx);
+       int pe = ChkptOnPe(CpvAccess(_crashedNode)*CmiMyNodeSize()+i);    // FIXME ?
+       CmiSyncSendAndFree(pe, CmiMsgHeaderSizeBytes+sizeof(int), (char *)msg);
+   }
+   return;
+#endif
    char *msg = (char*)CmiAlloc(CmiMsgHeaderSizeBytes+sizeof(int));
-   *(int *)(msg+CmiMsgHeaderSizeBytes) = crashed_node;
+   *(int *)(msg+CmiMsgHeaderSizeBytes) = CpvAccess(_crashedNode);
    // cur_restart_phase = RESTART_PHASE_MAX;             // big enough to get it processed, moved to machine.c
    CmiSetHandler(msg, askProcDataHandlerIdx);
-   int pe = ChkptOnPe(crashed_node);    // FIXME ?
+   int pe = ChkptOnPe(CpvAccess(_crashedNode));
    CmiSyncSendAndFree(pe, CmiMsgHeaderSizeBytes+sizeof(int), (char *)msg);
+
 }
 
-// on crashed PE
+// on crashed node
 void CkMemRestart(const char *dummy, CkArgMsg *args)
 {
 #if CMK_MEM_CHECKPOINT
-   _diePE = CkMyPe();
+   _diePE = CmiMyNode();
    CkMemCheckPT::startTime = restartT = CmiWallTimer();
    CmiPrintf("[%d] I am restarting  cur_restart_phase:%d at time: %f\n",CmiMyPe(), cur_restart_phase, CkMemCheckPT::startTime);
    CkMemCheckPT::inRestarting = 1;
-   crashed_node = CkMyPe();
 
-   _discard_charm_message();
+  CpvAccess( _crashedNode )= CmiMyNode();
+       
+  _discard_charm_message();
+ if(CmiMyRank()==0){
+   CkPrintf("crash_node:%d\n",CpvAccess( _crashedNode));
    CkCallback cb(qd_callback);
    CkStartQD(cb);
+ }
 #else
    CmiAbort("Fault tolerance is not support, rebuild charm++ with 'syncft' option");
 #endif
@@ -1133,7 +1148,7 @@ extern "C"
 int CkInRestarting()
 {
 #if CMK_MEM_CHECKPOINT
-  if (crashed_node!=-1) return 1;
+  if (CpvAccess( _crashedNode)!=-1) return 1;
   // gzheng
   //if (cur_restart_phase == RESTART_PHASE_MAX || cur_restart_phase == 0) return 1;
   //return CProxy_CkMemCheckPT(ckCheckPTGroupID).ckLocalBranch()->inRestarting;
@@ -1155,6 +1170,11 @@ void init_memcheckpt(char **argv)
     if (CmiGetArgFlagDesc(argv, "+ftc_disk", "Double-disk Checkpointing")) {
       arg_where = CkCheckPoint_inDISK;
     }
+
+       // initiliazing _crashedNode variable
+       CpvInitialize(int, _crashedNode);
+       CpvAccess(_crashedNode) = -1;
+
 }
 #endif
 
@@ -1186,20 +1206,25 @@ extern "C"
 void notify_crash(int node)
 {
 #ifdef CMK_MEM_CHECKPOINT
-  crashed_node = node;
-  CmiAssert(CmiMyNode() != crashed_node);
+  CpvAccess( _crashedNode) = node;
+  CmiAssert(CmiMyNode() !=CpvAccess( _crashedNode));
   CkMemCheckPT::inRestarting = 1;
 
 #ifdef CMK_SMP
-       // @TODO: this code is temporary. It just makes the SMP charmrun to restart without problems.
-       return;
-#endif
-
+//     CkPrintf("%d %d notify crash\n",CkMyPe(), CmiMyNode()); 
+  for(int i=0;i<CkMyNodeSize();i++){
+       char *msg = (char*)CmiAlloc(CmiMsgHeaderSizeBytes);
+       CmiSetHandler(msg, notifyHandlerIdx);
+       CmiSyncSendAndFree(CkMyNode()*CkMyNodeSize()+i, CmiMsgHeaderSizeBytes, (char *)msg);
+  }
+ return;
+#else 
     // this may be in interrupt handler, send a message to reset QD
   char *msg = (char*)CmiAlloc(CmiMsgHeaderSizeBytes);
   CmiSetHandler(msg, notifyHandlerIdx);
   CmiSyncSendAndFree(CkMyPe(), CmiMsgHeaderSizeBytes, (char *)msg);
 #endif
+#endif
 }
 
 extern "C" void (*notify_crash_fn)(int node);
index df8636406bb9f9ca40d8e9500d6204e964a2e884..8ca0a7d4265db623a911ad1a7d218a504f1da81a 100644 (file)
@@ -406,7 +406,4 @@ class Group : public CkReductionMgr
 };
 
 
-
-
-
 #endif //_CKREDUCTION_H
index 2310559b657fe78e45aca596ca5d34a763a6f1a8..95d6d69f06f5d3df1cdf16c7e1ea80971ec3930f 100644 (file)
@@ -35,7 +35,7 @@ syn keyword javaExternal      native package
 syn match javaExternal         "\<import\>\(\s\+static\>\)\?"
 syn keyword javaError          goto const
 syn keyword javaConditional    if else switch
-syn keyword javaRepeat         while for do overlap when forall
+syn keyword javaRepeat         while for do overlap when forall let in
 syn keyword javaBoolean                true false
 syn keyword javaConstant       null
 syn keyword javaTypedef                this super thisHandle thisIndex thisProxy thishandle
@@ -46,7 +46,7 @@ syn keyword javaStatement     return
 syn keyword javaStorageClass   static synchronized transient volatile final strictfp serializable readonly
 syn keyword javaExceptions     throw try catch finally
 syn keyword javaAssert         assert
-syn keyword javaMethodDecl     synchronized throws traced chare chare_array group nodegroup
+syn keyword javaMethodDecl     synchronized throws traced chare chare_array group nodegroup mainchare
 syn keyword javaClassDecl      extends implements interface
 " to differentiate the keyword class from MyClass.class we use a match here
 syn match   javaTypedef                "\.\s*\<class\>"ms=s+1
@@ -58,7 +58,7 @@ syn match   javaClassDecl     "@interface\>"
 syn keyword javaBranch         break continue nextgroup=javaUserLabelRef skipwhite
 syn match   javaUserLabelRef   "\k\+" contained
 syn match   javaVarArg         "\.\.\."
-syn keyword javaScopeDecl      public protected private abstract entry traced
+syn keyword javaScopeDecl      public protected private abstract entry traced sdagentry divcon
 
 if exists("java_highlight_java_lang_ids")
   let java_highlight_all=1
index e4065b7e6dc50895aba137691f56229e9768d29f..36bc4ce4cafe0a1dc614698be40545a70631aedd 100644 (file)
@@ -1,6 +1,4 @@
 
-package tests;
-
 readonly Main@ main;
 
 public mainchare Main {
@@ -9,7 +7,7 @@ public mainchare Main {
     public entry Main(CkArgMsg m) {
         if (m.argc < 2) n = 16;
         else n = atoi(m.argv[1]);
-        main = thishandle;
+        main = thisProxy;
         Fib@ fib = new Fib@(true, n, thishandle);
     }
 
@@ -40,8 +38,8 @@ public chare Fib {
             partialResult = seq_fib(n);
             passUp();
         } else {
-            Fib@ child1 = new Fib@(false, n-1, thishandle);
-            Fib@ child2 = new Fib@(false, n-2, thishandle);
+            Fib@ child1 = new Fib@(false, n-1, thisProxy);
+            Fib@ child2 = new Fib@(false, n-2, thisProxy);
             partialResult = 0;
             pendingChildren = 2;
         }
index a1445d1e2569a104f2f798783d0b79f649f9d6e4..6a5da524c3f665b88948128204bd9ca66953c834 100644 (file)
@@ -1,7 +1,7 @@
 package tests.unit;
 
 public class Foo {
-    public Foo(int _x) { property = _x; }
+    //public Foo(int _x) { property = _x; }
     public int property;
 }
 
@@ -18,13 +18,15 @@ public class SimpleClass {
         m.property++;
         m.property = 0;
         m.foo.property++;
-        Foo n = new Foo(m.foo.property);
-        this.method(m.property);
-        method(n.property);
-        delete n;
+        method1(m.property, m.foo);
+        //Foo n = new Foo(m.foo.property);
+        //this.method(m.property);
+        //method(n.property);
+        //delete n;
     }
 
-    void method(int x) { }
+    void method1(int x) { }
+    void method2(int x, Foo f) { }
 
     Bar get_m() {
         return m;
index 5750202dbc6d08252337db46cb678209217fdf01..e7874062a7ca17b756eab54b78ba0554d60ef62d 100644 (file)
@@ -29,7 +29,6 @@ Orion Sky Lawlor, olawlor@acm.org, 7/22/2002
 #include "pup.h"
 
 /*************** Simple classes ***************/
-
 // Non-const version is required for puping std::pair
 template <class A,class B>
 inline void operator|(PUP::er &p,typename std::pair<A,B> &v)
index d1b29248be9a1b57773196a1872b49bf6362a755..bf57075373ab12b374d3db3191a9ccc402ec1e8f 100644 (file)
@@ -3086,9 +3086,6 @@ void Entry::genChareDecl(XStr& str)
   } else {
     // entry method declaration
     str << "    "<<retType<<" "<<name<<"("<<paramType(1,1)<<");\n";
-    if (isReductionTarget()) {
-        str << "    " << "void _" << name << "_redn_wrapper(CkReductionMsg* m);\n";
-    }
   }
 }
 
@@ -3127,9 +3124,14 @@ void Entry::genChareDefs(XStr& str)
     str << "}\n";
   }
   if (isReductionTarget()) {
-      XStr retStr;
-      str << makeDecl(retStr, 1) << "::" << name << "_redn_wrapper(CkReductionMsg* m)\n{\n";
-      str << "}\n\n";
+      XStr retStr; retStr<<retType;
+      str << retType << " " << indexName(); //makeDecl(retStr, 1)
+      str << "::_" << name << "_redn_wrapper(void* impl_msg, " 
+          << container->baseName() << "* impl_obj)\n{\n"
+          << "  char* impl_buf = (char*)((CkReductionMsg*)impl_msg)->getData();\n";
+      XStr precall;
+      genCall(str, precall, true);
+      str << "\n}\n\n";
   }
 }
 
@@ -4232,6 +4234,14 @@ void Entry::genIndexDecls(XStr& str)
     #endif
   }
 
+  if (isReductionTarget()) {
+      str << "    static int __idx_" << name << "_redn_wrapper;\n"
+          << "    static int " << name << "_redn_wrapper"
+          << "(CkReductionMsg* impl_msg) { return __idx_" << name << "_redn_wrapper; }\n"
+          << "    static void _" << name << "_redn_wrapper(void* impl_msg, "
+          << container->baseName() <<"* impl_obj);\n";
+  }
+
   // call function declaration
   str << "    static void _call_"<<epStr()<<"(void* impl_msg,"<<
     container->baseName()<<"* impl_obj);\n";
@@ -4420,7 +4430,7 @@ XStr Entry::callThread(const XStr &procName,int prependEntryName)
   Generate the code to actually unmarshall the parameters and call
   the entry method.
 */
-void Entry::genCall(XStr& str, const XStr &preCall)
+void Entry::genCall(XStr& str, const XStr &preCall, bool redn_wrapper)
 {
   bool isArgcArgv=false;
   bool isMigMain=false;
@@ -4432,9 +4442,11 @@ void Entry::genCall(XStr& str, const XStr &preCall)
       (!param->isVoid()) && (!param->isCkArgMsgPtr())){
        if(param->isCkMigMsgPtr()) isMigMain = true;
        else isArgcArgv = true;
+  } else {
+    //Normal case: Unmarshall variables
+    if (redn_wrapper) param->beginRednWrapperUnmarshall(str);
+    else param->beginUnmarshall(str);
   }
-  else //Normal case: Unmarshall variables
-       param->beginUnmarshall(str);
 
   str << preCall;
   if (!isConstructor() && fortranMode) {
@@ -4498,9 +4510,9 @@ void Entry::genCall(XStr& str, const XStr &preCall)
 
     if (isArgcArgv) { //Extract parameters from CkArgMsg (should be parameter marshalled)
         str<<"(m->argc,m->argv);\n";
-       str<<"  delete m;\n";
+        str<<"  delete m;\n";
     }else if(isMigMain){
-       str<<"((CkMigrateMessage*)impl_msg);\n";
+        str<<"((CkMigrateMessage*)impl_msg);\n";
     }
     else {//Normal case: unmarshall parameters (or just pass message)
         str<<"("; param->unmarshall(str); str<<");\n";
@@ -4529,6 +4541,9 @@ void Entry::genDefs(XStr& str)
 
   //Define storage for entry point number
   str << container->tspec()<<" int "<<indexName()<<"::"<<epIdx(0)<<"=0;\n";
+  if (isReductionTarget()) {
+      str << " int " << indexName() << "::__idx_" << name <<"_redn_wrapper=0;\n";
+  }
 
   // DMK - Accel Support
   #if CMK_CELL != 0
@@ -4723,6 +4738,12 @@ void Entry::genReg(XStr& str)
       str << "  CkRegisterMessagePupFn("<<epIdx(0)<<", (CkMessagePupFn)";
       str << param->param->getType()->getBaseName() <<"::ckDebugPup);\n";
   }
+  if (isReductionTarget()) {
+      str << "  " << "__idx_" << name << "_redn_wrapper = CkRegisterEp(\""
+          << name << "_redn_wrapper(CkReductionMsg* impl_msg)\",\n"
+          << "     (CkCallFnPtr)_" << name << "_redn_wrapper, "
+          << "CMessage_CkReductionMsg::__idx, __idx, 0);";
+  }
 }
 
 void Entry::preprocess() {
@@ -5040,19 +5061,59 @@ void Parameter::copyPtr(XStr &str)
   }
 }
 
+void ParamList::beginRednWrapperUnmarshall(XStr &str)
+{
+    if (isMarshalled())
+    {
+        str<<"  /*Unmarshall pup'd fields: ";print(str,0);str<<"*/\n";
+        str<<"  PUP::fromMem implP(impl_buf);\n";
+        if (next != NULL && next->next == NULL) {
+            if (isArray()) {
+                Type* dt = next->param->type->deref();
+                str << "  " << dt << " " << next->param->name << "; "
+                    << next->param->name << " = "
+                    << "((CkReductionMsg*)impl_msg)->getLength() / sizeof("
+                    << dt << ");\n";
+                dt = param->type->deref();
+                str << "  " << dt << "* " << param->name << "; "
+                    << param->name << " = (" << dt << "*)impl_buf;\n";
+            } else if (next->isArray()) {
+                Type* dt = param->type->deref();
+                str << "  " << dt << " " << param->name << "; "
+                    << param->name << " = "
+                    << "((CkReductionMsg*)impl_msg)->getLength() / sizeof("
+                    << dt << ");\n";
+                dt = next->param->type->deref();
+                str << "  " << dt << "* " << next->param->name << "; "
+                    << next->param->name << " = (" << dt << "*)impl_buf;\n";
+            } else {
+                callEach(&Parameter::beginUnmarshall,str);
+            }
+        } else {
+            str << "/* non two-param case */\n";
+            callEach(&Parameter::beginUnmarshall,str);
+            str<<"  impl_buf+=CK_ALIGN(implP.size(),16);\n";
+            str<<"  /*Unmarshall arrays:*/\n";
+            callEach(&Parameter::unmarshallArrayData,str);
+        }
+    } else if (isVoid()) {
+        str<<"  CkFreeSysMsg(impl_msg);\n";
+    }
+}
+
 /** unmarshalling: unpack fields from flat buffer **/
 void ParamList::beginUnmarshall(XStr &str)
 {
-       if (isMarshalled())
-       {
-               str<<"  /*Unmarshall pup'd fields: ";print(str,0);str<<"*/\n";
-               str<<"  PUP::fromMem implP(impl_buf);\n";
-               callEach(&Parameter::beginUnmarshall,str);
-               str<<"  impl_buf+=CK_ALIGN(implP.size(),16);\n";
-               str<<"  /*Unmarshall arrays:*/\n";
-               callEach(&Parameter::unmarshallArrayData,str);
-       }
-       else if (isVoid()) {str<<"  CkFreeSysMsg(impl_msg);\n";}
+    if (isMarshalled())
+    {
+        str<<"  /*Unmarshall pup'd fields: ";print(str,0);str<<"*/\n";
+        str<<"  PUP::fromMem implP(impl_buf);\n";
+        callEach(&Parameter::beginUnmarshall,str);
+        str<<"  impl_buf+=CK_ALIGN(implP.size(),16);\n";
+        str<<"  /*Unmarshall arrays:*/\n";
+        callEach(&Parameter::unmarshallArrayData,str);
+    }
+    else if (isVoid()) {str<<"  CkFreeSysMsg(impl_msg);\n";}
 }
 void Parameter::beginUnmarshall(XStr &str)
 { //First pass: unpack pup'd entries
index 7298ae16fa088365e4b8cbebb4f0347bee5d2875..e43d59c15b36f34bd43aa1148c5d53398e5f99fb 100644 (file)
@@ -372,6 +372,7 @@ class ParamList {
     int hasConditional();
     void marshall(XStr &str, XStr &entry);
     void beginUnmarshall(XStr &str);
+    void beginRednWrapperUnmarshall(XStr &str);
     void unmarshall(XStr &str, int isFirst=1);
     void unmarshallAddress(XStr &str, int isFirst=1);
     void pupAllValues(XStr &str);
@@ -924,7 +925,7 @@ class Entry : public Member {
 
 //    friend class CParsedFile;
     int hasCallMarshall;
-    void genCall(XStr &dest,const XStr &preCall);
+    void genCall(XStr &dest,const XStr &preCall, bool redn_wrapper=false);
 
     XStr epStr(void);
     XStr epIdx(int fromProxy=1);