00001
00005 #ifndef _REGISTER_H
00006 #define _REGISTER_H
00007
00009
00022 class EntryInfo {
00023 public:
00025 const char *name;
00026
00050 CkCallFnPtr call;
00052 int msgIdx;
00054 int chareIdx;
00056 CmiBool traceEnabled;
00058 CmiBool noKeep;
00060 CmiBool inCharm;
00061
00062 #ifdef ADAPT_SCHED_MEM
00064 CmiBool isMemCritical;
00065 #endif
00066
00074 CkMarshallUnpackFn marshallUnpack;
00075
00086 CkMessagePupFn messagePup;
00087
00088 EntryInfo(const char *n, CkCallFnPtr c, int m, int ci) :
00089 name(n), call(c), msgIdx(m), chareIdx(ci),
00090 marshallUnpack(0), messagePup(0)
00091 { traceEnabled=CmiTrue; noKeep=CmiFalse; inCharm=CmiFalse;}
00092 };
00093
00098 class MsgInfo {
00099 public:
00101 const char *name;
00115 CkPackFnPtr pack;
00120 CkUnpackFnPtr unpack;
00125 CkDeallocFnPtr dealloc;
00131 size_t size;
00132
00133 MsgInfo(const char *n,CkPackFnPtr p,CkUnpackFnPtr u,CkDeallocFnPtr d,int s):
00134 name(n), pack(p), unpack(u), dealloc(d), size(s)
00135 {}
00136 };
00137
00142 class ChareInfo {
00143 public:
00145 const char *name;
00147 int size;
00148
00150 int defCtor,migCtor;
00152 int numbases;
00154 int bases[16];
00155
00157 int isIrr;
00158
00160 ChareType chareType;
00161
00163 CmiBool inCharm;
00164
00165 int mainChareIdx;
00166
00167 ChareInfo(const char *n, int s, ChareType t) : name(n), size(s) {
00168 defCtor=migCtor=-1;
00169 isIrr = numbases = 0;
00170 chareType = t;
00171 inCharm = CmiFalse;
00172 mainChareIdx = -1;
00173 }
00174 void setDefaultCtor(int idx) { defCtor = idx; }
00175 int getDefaultCtor(void) { return defCtor; }
00176 void setMigCtor(int idx) { migCtor = idx; }
00177 int getMigCtor(void) { return migCtor; }
00178 void addBase(int idx) { bases[numbases++] = idx; }
00179 void setInCharm() { inCharm = CmiTrue; }
00180 CmiBool isInCharm() { return inCharm; }
00181 void setMainChareType(int idx) { mainChareIdx = idx; }
00182 int mainChareType() { return mainChareIdx; }
00183 };
00184
00186 class MainInfo {
00187 public:
00188 const char *name;
00189 int chareIdx;
00190 int entryIdx;
00191 int entryMigCtor;
00192 void* obj;
00193 MainInfo(int c, int e) : name("main"), chareIdx(c), entryIdx(e) {}
00194 inline void* getObj(void) { return obj; }
00195 inline void setObj(void *_obj) { obj=_obj; }
00196 };
00197
00199 class ReadonlyInfo {
00200 public:
00202 const char *name,*type;
00204 int size;
00206 void *ptr;
00208 CkPupReadonlyFnPtr pup;
00209
00211 void pupData(PUP::er &p) {
00212 if (pup!=NULL)
00213 (pup)((void *)&p);
00214 else
00215 p((char *)ptr,size);
00216 }
00217 ReadonlyInfo(const char *n,const char *t,
00218 int s, void *p,CkPupReadonlyFnPtr pf)
00219 : name(n), type(t), size(s), ptr(p), pup(pf) {}
00220 };
00221
00227 class ReadonlyMsgInfo {
00228 public:
00229 const char *name, *type;
00230 void **pMsg;
00231 ReadonlyMsgInfo(const char *n, const char *t,
00232 void **p) : name(n), type(t), pMsg(p) {}
00233 };
00234
00239 template <class T>
00240 class CkRegisteredInfo {
00241 CkVec<T *> vec;
00242
00243 void outOfBounds(int idx) {
00244 const char *exampleName="";
00245 if (vec.size()>0) exampleName=vec[0]->name;
00246 CkPrintf("register.h> CkRegisteredInfo<%d,%s> called with invalid index "
00247 "%d (should be less than %d)\n", sizeof(T),exampleName,
00248 idx, vec.size());
00249 CkAbort("Registered idx is out of bounds-- is message or memory corrupted?");
00250 }
00251 public:
00259 CkRegisteredInfo() :vec(CkSkipInitialization()) {}
00260 ~CkRegisteredInfo() {
00261 for (size_t i=0; i<vec.size(); i++) if (vec[i]) delete vec[i];
00262 }
00263
00266 int add(T *t) {
00267 #if CMK_ERROR_CHECKING
00268
00269 if (CkMyRank()!=0)
00270 CkAbort("Can only do registrations from rank 0 processors");
00271 #endif
00272 vec.push_back(t);
00273 return vec.size()-1;
00274 }
00275
00278 size_t &size(void) {return vec.length();}
00279
00281 T *operator[](size_t idx) {
00282 #if CMK_ERROR_CHECKING
00283
00284 if (idx>=vec.size()) outOfBounds(idx);
00285 #endif
00286 return vec[idx];
00287 }
00288 };
00289
00291 extern CkRegisteredInfo<EntryInfo> _entryTable;
00292 extern CkRegisteredInfo<MsgInfo> _msgTable;
00293 extern CkRegisteredInfo<ChareInfo> _chareTable;
00294 extern CkRegisteredInfo<MainInfo> _mainTable;
00295 extern CkRegisteredInfo<ReadonlyInfo> _readonlyTable;
00296 extern CkRegisteredInfo<ReadonlyMsgInfo> _readonlyMsgs;
00297
00298 extern void _registerInit(void);
00299 extern void _registerDone(void);
00300
00302 #endif