ck-core/register.C

Go to the documentation of this file.
00001 /*****************************************************************************
00002  * $Source: /cvsroot/charm/src/ck-core/register.C,v $
00003  * $Author: gioachin $
00004  * $Date: 2008-03-26 03:33:20 $
00005  * $Revision: 2.38 $
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   //c->pupData(p); Do not use puppers, just copy memory
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 //Print a debugging version of this entry method index:
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 //Print a debugging version of this chare index:
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 

Generated on Sun Jun 29 13:29:09 2008 for Charm++ by  doxygen 1.5.1