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