void ParamList::beginUnmarshallSDAG(XStr &str) { if (isMarshalled()) { str << " PUP::fromMem implP(impl_buf);\n"; callEach(&Parameter::beginUnmarshall,str); str << " impl_buf+=CK_ALIGN(implP.size(),16);\n"; callEach(&Parameter::unmarshallArrayDataSDAG,str); } }
/** 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); } }
/** marshalling: pack fields into flat byte buffer **/ void ParamList::marshall(XStr &str, XStr &entry) { if (isVoid()) str<<" void *impl_msg = CkAllocSysMsg();\n"; else if (isMarshalled()) { str<<" //Marshall: ";print(str,0);str<<"\n"; //First pass: find sizes str<<" int impl_off=0;\n"; int hasArrays=orEach(&Parameter::isArray); if (hasArrays) { str<<" int impl_arrstart=0;\n"; callEach(&Parameter::marshallArraySizes,str); } str<<" { //Find the size of the PUP'd data\n"; str<<" PUP::sizer implP;\n"; callEach(&Parameter::pup,str); if (hasArrays) { /*round up pup'd data length--that's the first array*/ str<<" impl_arrstart=CK_ALIGN(implP.size(),16);\n"; str<<" impl_off+=impl_arrstart;\n"; } else /*No arrays--no padding*/ str<<" impl_off+=implP.size();\n"; str<<" }\n"; //Now that we know the size, allocate the packing buffer if (hasConditional()) str<<" MarshallMsg_"<<entry<<" *impl_msg=CkAllocateMarshallMsgT<MarshallMsg_"<<entry<<" >(impl_off,impl_e_opts);\n"; else str<<" CkMarshallMsg *impl_msg=CkAllocateMarshallMsg(impl_off,impl_e_opts);\n"; //Second pass: write the data str<<" { //Copy over the PUP'd data\n"; str<<" PUP::toMem implP((void *)impl_msg->msgBuf);\n"; callEach(&Parameter::pup,str); callEach(&Parameter::copyPtr,str); str<<" }\n"; if (hasArrays) { //Marshall each array str<<" char *impl_buf=impl_msg->msgBuf+impl_arrstart;\n"; callEach(&Parameter::marshallArrayData,str); } } }
/** unmarshalling: unpack fields from flat buffer **/ void ParamList::beginUnmarshallSDAGCall(XStr &str, bool usesImplBuf) { bool hasArray = false; for (ParamList* pl = this; pl != NULL; pl = pl->next) { hasArray = hasArray || pl->param->isArray(); } if (isMarshalled()) { str << " PUP::fromMem implP(impl_buf);\n"; str << " " << *entry->genClosureTypeNameProxyTemp << "*" << " genClosure = new " << *entry->genClosureTypeNameProxyTemp << "()" << ";\n"; callEach(&Parameter::beginUnmarshallSDAGCall, str); str << " impl_buf+=CK_ALIGN(implP.size(),16);\n"; callEach(&Parameter::unmarshallArrayDataSDAGCall,str); if (hasArray) { if (!usesImplBuf) { str << " genClosure->_impl_marshall = impl_msg_typed;\n"; str << " CmiReference(UsrToEnv(genClosure->_impl_marshall));\n"; } else { str << " genClosure->_impl_buf_in = impl_buf;\n"; str << " genClosure->_impl_buf_size = implP.size();\n"; } } } }
void ParamList::pupAllValues(XStr &str) { if (isMarshalled()) callEach(&Parameter::pupAllValues,str); }
void ParamList::beginRednWrapperUnmarshall(XStr &str, bool isSDAGGen) { if (isSDAGGen) { str << *entry->genClosureTypeNameProxyTemp << "*" << " genClosure = new " << *entry->genClosureTypeNameProxyTemp << "()" << ";\n"; } 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()) { if (!isSDAGGen) { Type* dt = next->param->type->deref(); str << " " << dt << " " << next->param->name << "; " << next->param->name << " = " << "((CkReductionMsg*)impl_msg)->getLength() / sizeof(" << param->type->deref() << ");\n"; dt = param->type->deref(); str << " " << dt << "* " << param->name << "; " << param->name << " = (" << dt << "*)impl_buf;\n"; } else { Type* dt = param->type->deref(); str << " genClosure->" << next->param->name << " = " << "((CkReductionMsg*)impl_msg)->getLength() / sizeof(" << param->type->deref() << ");\n"; dt = param->type->deref(); str << " genClosure->" << param->name << " = (" << dt << "*)impl_buf;\n"; } } else if (next->isArray()) { if (!isSDAGGen) { Type* dt = param->type->deref(); str << " " << dt << " " << param->name << "; " << param->name << " = " << "((CkReductionMsg*)impl_msg)->getLength() / sizeof(" << next->param->type->deref() << ");\n"; dt = next->param->type->deref(); str << " " << dt << "* " << next->param->name << "; " << next->param->name << " = (" << dt << "*)impl_buf;\n"; } else { Type* dt = param->type->deref(); str << " genClosure->" << param->name << " = " << "((CkReductionMsg*)impl_msg)->getLength() / sizeof(" << next->param->type->deref() << ");\n"; dt = next->param->type->deref(); str << " genClosure->" << next->param->name << " = (" << dt << "*)impl_buf;\n"; } } else { if (!isSDAGGen) callEach(&Parameter::beginUnmarshall,str); else callEach(&Parameter::beginUnmarshallSDAGCall,str); } } else { str << " /* non two-param case */\n"; if (!isSDAGGen) callEach(&Parameter::beginUnmarshall,str); else callEach(&Parameter::beginUnmarshallSDAGCall,str); str<<" impl_buf+=CK_ALIGN(implP.size(),16);\n"; str<<" /*Unmarshall arrays:*/\n"; if (!isSDAGGen) callEach(&Parameter::unmarshallArrayData,str); else callEach(&Parameter::unmarshallArrayDataSDAGCall,str); } } }
void ParamList::getAllValuesFromMessage(XStr &str) { callEach(&Parameter::getValueFromMessage,str); }
void ParamList::addAllValuesToMessage(XStr &str) { callEach(&Parameter::addValueToMessage,str); }