00001
00002
00003
00004
00005
00006
00020 #include "ck.h"
00021 #include "debug-charm.h"
00022
00023 CkRegisteredInfo<EntryInfo> _entryTable;
00024 CkRegisteredInfo<MsgInfo> _msgTable;
00025 CkRegisteredInfo<ChareInfo> _chareTable;
00026 CkRegisteredInfo<MainInfo> _mainTable;
00027 CkRegisteredInfo<ReadonlyInfo> _readonlyTable;
00028 CkRegisteredInfo<ReadonlyMsgInfo> _readonlyMsgs;
00029
00030 static int __registerDone = 0;;
00031
00032 void _registerInit(void)
00033 {
00034 if(__registerDone)
00035 return;
00036 __registerDone = 1;
00037 }
00038
00039 extern "C"
00040 int CkRegisterMsg(const char *name, CkPackFnPtr pack, CkUnpackFnPtr unpack,
00041 size_t size)
00042 {
00043 return _msgTable.add(new MsgInfo(name, pack, unpack, size));
00044 }
00045
00046 extern "C"
00047 void ckInvalidCallFn(void *msg,void *obj) {
00048 CkAbort("Charm++: Invalid entry method executed. Perhaps there is an unregistered module?");
00049 }
00050
00051 extern "C"
00052 int CkRegisterEp(const char *name, CkCallFnPtr call, int msgIdx, int chareIdx,
00053 int ck_ep_flags)
00054 {
00055 EntryInfo *e = new EntryInfo(name, call?call:ckInvalidCallFn, msgIdx, chareIdx);
00056 if (ck_ep_flags & CK_EP_NOKEEP) e->noKeep=CmiTrue;
00057 if (ck_ep_flags & CK_EP_INTRINSIC) e->inCharm=CmiTrue;
00058 if (ck_ep_flags & CK_EP_TRACEDISABLE) e->traceEnabled=CmiFalse;
00059 return _entryTable.add(e);
00060 }
00061
00062 extern "C"
00063 int CkRegisterChare(const char *name, int dataSz)
00064 {
00065 return _chareTable.add(new ChareInfo(name, dataSz));
00066 }
00067
00068 extern "C"
00069 void CkRegisterChareInCharm(int chareIndex){
00070 _chareTable[chareIndex]->inCharm = CmiTrue;
00071 }
00072
00073 extern "C"
00074 void CkRegisterGroupIrr(int chareIndex,int isIrr){
00075 _chareTable[chareIndex]->isIrr = isIrr;
00076 }
00077
00078 extern "C"
00079 void CkRegisterDefaultCtor(int chareIdx, int ctorEpIdx)
00080 {
00081 _chareTable[chareIdx]->setDefaultCtor(ctorEpIdx);
00082 }
00083 extern "C"
00084 void CkRegisterMigCtor(int chareIdx, int ctorEpIdx)
00085 {
00086 _chareTable[chareIdx]->setMigCtor(ctorEpIdx);
00087 }
00088
00089 extern "C"
00090 int CkRegisterMainChare(int chareIdx, int entryIdx)
00091 {
00092 return _mainTable.add(new MainInfo(chareIdx, entryIdx));
00093 }
00094
00095 extern "C"
00096 void CkRegisterBase(int derivedIdx, int baseIdx)
00097 {
00098 if (baseIdx!=-1)
00099 _chareTable[derivedIdx]->addBase(baseIdx);
00100 }
00101
00102 extern "C"
00103 void CkRegisterReadonly(const char *name,const char *type,
00104 int size, void *ptr,CkPupReadonlyFnPtr pup_fn)
00105 {
00106 _readonlyTable.add(new ReadonlyInfo(name,type,size,ptr,pup_fn));
00107 }
00108
00109 extern "C"
00110 void CkRegisterReadonlyMsg(const char *name,const char *type,void **pMsg)
00111 {
00112 _readonlyMsgs.add(new ReadonlyMsgInfo(name,type,pMsg));
00113 }
00114
00115
00116 extern "C"
00117 void CkRegisterMarshallUnpackFn(int epIndex,CkMarshallUnpackFn m)
00118 {
00119 _entryTable[epIndex]->marshallUnpack=m;
00120 }
00121
00122 extern "C"
00123 CkMarshallUnpackFn CkLookupMarshallUnpackFn(int epIndex)
00124 {
00125 return _entryTable[epIndex]->marshallUnpack;
00126 }
00127 extern "C"
00128 void CkRegisterMessagePupFn(int epIndex,CkMessagePupFn m)
00129 {
00130 _entryTable[epIndex]->messagePup=m;
00131 }
00132 extern "C"
00133 int CkDisableTracing(int epIdx) {
00134 int oldStatus = _entryTable[epIdx]->traceEnabled;
00135 _entryTable[epIdx]->traceEnabled=CmiFalse;
00136 return oldStatus;
00137 }
00138
00139 extern "C"
00140 void CkEnableTracing(int epIdx) {
00141 _entryTable[epIdx]->traceEnabled=CmiTrue;
00142 }
00143
00144
00145 static void pupEntry(PUP::er &p,int index)
00146 {
00147 EntryInfo *c=_entryTable[index];
00148 PCOMS(name)
00149 p.comment("index");
00150 p(index);
00151 PCOM(msgIdx)
00152 PCOM(chareIdx)
00153 PCOM(inCharm);
00154 }
00155 static void pupMsg(PUP::er &p,int i)
00156 {
00157 MsgInfo *c=_msgTable[i];
00158 PCOMS(name) PCOM(size)
00159 }
00160 static void pupChare(PUP::er &p,int i)
00161 {
00162 ChareInfo *c=_chareTable[i];
00163 PCOMS(name) PCOM(size)
00164 PCOM(defCtor) PCOM(migCtor)
00165 PCOM(numbases)
00166 PCOM(inCharm)
00167 p.comment("List of base classes:");
00168 p(c->bases,c->numbases);
00169 }
00170 static void pupMain(PUP::er &p,int i)
00171 {
00172 MainInfo *c=_mainTable[i];
00173 PCOMS(name) PCOM(chareIdx) PCOM(entryIdx)
00174 }
00175 static void pupReadonly(PUP::er &p,int i)
00176 {
00177 ReadonlyInfo *c=_readonlyTable[i];
00178 PCOMS(name) PCOMS(type) PCOM(size)
00179 p.comment("value");
00180
00181 p((char *)c->ptr,c->size);
00182 }
00183 static void pupReadonlyMsg(PUP::er &p,int i)
00184 {
00185 ReadonlyMsgInfo *c=_readonlyMsgs[i];
00186 PCOMS(name) PCOMS(type)
00187 p.comment("value");
00188 CkPupMessage(p,c->pMsg,0);
00189 }
00190
00191 extern void CpdCharmInit(void);
00192 extern "C" {
00193 int cpd_memory_length(void*);
00194 void cpd_memory_pup(void*,void*,CpdListItemsRequest*);
00195 void cpd_memory_leak(void*,void*,CpdListItemsRequest*);
00196 int cpd_memory_getLength(void*);
00197 void cpd_memory_get(void*,void*,CpdListItemsRequest*);
00198 }
00199
00200 void _registerDone(void)
00201 {
00202 CpdListRegister(new CpdSimpleListAccessor("charm/entries",_entryTable.size(),pupEntry));
00203 CpdListRegister(new CpdSimpleListAccessor("charm/messages",_msgTable.size(),pupMsg));
00204 CpdListRegister(new CpdSimpleListAccessor("charm/chares",_chareTable.size(),pupChare));
00205 CpdListRegister(new CpdSimpleListAccessor("charm/mains",_mainTable.size(),pupMain));
00206 CpdListRegister(new CpdSimpleListAccessor("charm/readonly",_readonlyTable.size(),pupReadonly));
00207 CpdListRegister(new CpdSimpleListAccessor("charm/readonlyMsg",_readonlyMsgs.size(),pupReadonlyMsg));
00208 CpdListRegister(new CpdListAccessor_c("converse/memory",cpd_memory_length,0,cpd_memory_pup,0));
00209 CpdListRegister(new CpdListAccessor_c("converse/memory/leak",cpd_memory_length,0,cpd_memory_leak,0));
00210 CpdListRegister(new CpdListAccessor_c("converse/memory/data",cpd_memory_getLength,0,cpd_memory_get,0,false));
00211 #if CMK_CCS_AVAILABLE
00212 CpdCharmInit();
00213 #endif
00214 }
00215
00216
00217 void CkPrintEntryMethod(int epIdx) {
00218 if (epIdx<=0 || epIdx>=_entryTable.size())
00219 CkPrintf("INVALID ENTRY METHOD %d!",epIdx);
00220 else {
00221 EntryInfo *e=_entryTable[epIdx];
00222 CkPrintChareName(e->chareIdx);
00223 CkPrintf("::%s",e->name);
00224 }
00225 }
00226
00227
00228 void CkPrintChareName(int chareIdx) {
00229 if (chareIdx<=0 || chareIdx>=_chareTable.size())
00230 CkPrintf("INVALID CHARE INDEX %d!",chareIdx);
00231 else {
00232 ChareInfo *c=_chareTable[chareIdx];
00233 CkPrintf("%s",c->name);
00234 }
00235 }
00236
00237
00238
00239