00001 #include <ck.h>
00002 #include "envelope.h"
00003 #include <stdio.h>
00004 #include <stdlib.h>
00005 #include <string.h>
00006 #include "queueing.h"
00007
00008 #if 0
00009
00010 CqsEnumerateQueue((Queue)CpvAccess(CsdSchedQueue), &schedQueue);
00011 FIFOQueue = CdsFifo_Enumerate((CdsFifo)CpvAccess(CmiLocalQueue));
00012 DQueue = CdsFifo_Enumerate(CpvAccess(debugQueue));
00013 #endif
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 void CkPupMessage(PUP::er &p,void **atMsg,int pack_mode) {
00027 UChar type;
00028 int size,prioBits,envSize;
00029
00030
00031 int isNull = (*atMsg == NULL);
00032 p(isNull);
00033 if (isNull) { *atMsg = NULL; return; }
00034
00035 envelope *env=UsrToEnv(*atMsg);
00036 unsigned char wasPacked=0;
00037 p.comment("Begin Charm++ Message {");
00038 if (!p.isUnpacking()) {
00039 wasPacked=env->isPacked();
00040 if (0==wasPacked)
00041 CkPackMessage(&env);
00042 type=env->getMsgtype();
00043 size=env->getTotalsize();
00044 prioBits=env->getPriobits();
00045 envSize=sizeof(envelope);
00046 }
00047 p(type);
00048 p(wasPacked);
00049 p(size);
00050 p(prioBits);
00051 p(envSize);
00052 int userSize=size-envSize-sizeof(int)*CkPriobitsToInts(prioBits);
00053 if (p.isUnpacking())
00054 env=_allocEnv(type,userSize,prioBits);
00055 if (pack_mode == 1) {
00056
00057 p((char *)env,size);
00058 }
00059 else if (pack_mode == 2) {
00060
00061
00062 env->pup(p);
00063 p((char*)env+sizeof(envelope),size-envSize);
00064 }
00065 else
00066 {
00067 p.comment("Message Envelope:");
00068 env->pup(p);
00069 p.comment("Message User Data:");
00070 #if 0
00071 int ep=env->getEpIdx();
00072 if (ep>0 && ep<_numEntries)
00073 _entryTable[ep]->pupFn(p,*atMsg);
00074 else
00075 #endif
00076 ((CkMessage *)*atMsg)->pup(p);
00077 p.comment("} End Charm++ Message");
00078 }
00079 if (0==wasPacked)
00080 CkUnpackMessage(&env);
00081 *atMsg=EnvToUsr(env);
00082 }
00083
00084 void envelope::pup(PUP::er &p) {
00085
00086 int convHeaderSize;
00087 if (!p.isUnpacking()) convHeaderSize = CmiReservedHeaderSize;
00088 p(convHeaderSize);
00089
00090 p((char *)core,convHeaderSize);
00091 p(ref);
00092
00093 p(attribs.msgIdx);
00094 p(attribs.mtype);
00095 int d;
00096 if (!p.isUnpacking()) d = attribs.queueing;
00097 p|d;
00098 if (p.isUnpacking()) attribs.queueing = d;
00099 if (!p.isUnpacking()) d = attribs.isPacked;
00100 p|d;
00101 if (p.isUnpacking()) attribs.isPacked = d;
00102 if (!p.isUnpacking()) d = attribs.isUsed;
00103 p|d;
00104 if (p.isUnpacking()) attribs.isUsed = d;
00105 p(epIdx);
00106 p(pe);
00107 p(event);
00108 p((char*)getPrioPtr(),getPrioBytes());
00109 switch(getMsgtype()) {
00110 case NewChareMsg: case NewVChareMsg:
00111 case ForChareMsg: case ForVidMsg: case FillVidMsg:
00112 p((char *)&(type.chare.ptr),sizeof(void *));
00113 p(type.chare.forAnyPe);
00114 break;
00115 case NodeBocInitMsg: case BocInitMsg: case ForNodeBocMsg: case ForBocMsg:
00116 p|type.group.g;
00117 p|type.group.rednMgr;
00118 p|type.group.epoch;
00119 p|type.group.arrayEp;
00120 break;
00121 case ArrayEltInitMsg: case ForArrayEltMsg:
00122 p|type.array.arr;
00123 p(type.array.index.nInts);
00124 p(type.array.index.index,CK_ARRAYINDEX_MAXLEN);
00125 p(type.array.listenerData,CK_ARRAYLISTENER_MAXLEN);
00126 p(type.array.hopCount);
00127 p(type.array.ifNotThere);
00128 break;
00129 case RODataMsg:
00130 p(type.roData.count);
00131 break;
00132 case ROMsgMsg:
00133 p(type.roMsg.roIdx);
00134 break;
00135 default:
00136 break;
00137 }
00138 }
00139
00140 void CkMessage::pup(PUP::er &p) {
00141
00142 envelope *env=UsrToEnv((void *)this);
00143 int userSize=env->getTotalsize()-sizeof(envelope)-env->getPrioBytes();
00144 p((char *)this,userSize);
00145 }