Пример #1
0
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);
  }
}
Пример #2
0
/** 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);
    }
}
Пример #3
0
/** 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);
		}
	}
}
Пример #4
0
/** 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";
      }
    }
  }
}
Пример #5
0
void ParamList::pupAllValues(XStr &str) {
	if (isMarshalled())
		callEach(&Parameter::pupAllValues,str);
}
Пример #6
0
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);
        }
    }
}
Пример #7
0
void ParamList::getAllValuesFromMessage(XStr &str) {
		callEach(&Parameter::getValueFromMessage,str);
}
Пример #8
0
void ParamList::addAllValuesToMessage(XStr &str) {
		callEach(&Parameter::addValueToMessage,str);
}