00001 #ifndef _INIT_H
00002 #define _INIT_H
00003
00004 #include "charm.h"
00005 #include <new>
00006 #include "ckhashtable.h"
00007
00008 typedef CkQ<void *> PtrQ;
00009 class envelope;
00010 typedef CkVec<CkZeroPtr<envelope> > PtrVec;
00011
00012 class IrrGroup;
00013 class TableEntry {
00014 IrrGroup *obj;
00015 PtrQ *pending;
00016 int cIdx;
00017 char gName[256];
00018 int defCtor,migCtor;
00019
00020 public:
00021 TableEntry(int ignored=0) { obj=0; pending=0; cIdx=defCtor=migCtor=-1; }
00022 inline IrrGroup* getObj(void) { return obj; }
00023 inline void setObj(void *_obj) { obj=(IrrGroup *)_obj; }
00024 PtrQ* getPending(void) { return pending; }
00025 inline void clearPending(void) { delete pending; pending = NULL; }
00026 void enqMsg(void *msg) {
00027 if (pending==0)
00028 pending=new PtrQ();
00029 pending->enq(msg);
00030 }
00031 void setcIdx(int cIdx_){
00032 cIdx = cIdx_;
00033 }
00034 inline int getcIdx(void) const { return cIdx; }
00035 inline int getmigCtor(void) const { return migCtor; }
00036 };
00037
00038 template <class dtype>
00039 class GroupIdxArray {
00040
00041 enum {INIT_BINS_PE0=32};
00042
00043 dtype *tab;
00044 CkHashtable_c hashTab;
00045 int max;
00046
00047
00048
00049 dtype& nonInlineFind(CkGroupID n) {
00050 #if CMK_ERROR_CHECKING
00051 if (n.idx==0) {CkAbort("Group ID is zero-- invalid!\n"); dtype *nul=NULL; return *nul;}
00052 else
00053 #endif
00054 if (n.idx>=max) {
00055 dtype *oldtab=tab;
00056 int i, oldmax=max;
00057 max=2*n.idx+1;
00058 tab=new dtype[max];
00059 for (i=0;i<oldmax;i++) tab[i]=oldtab[i];
00060 for (i=oldmax;i<max;i++) tab[i]=dtype(0);
00061 delete [] oldtab;
00062 return tab[n.idx];
00063 }
00064 else
00065 {
00066 if(hashTab == NULL)
00067 hashTab = CkCreateHashtable_int(sizeof(dtype),17);
00068
00069 dtype *ret = (dtype *)CkHashtableGet(hashTab,&(n.idx));
00070
00071 if(ret == NULL)
00072 {
00073 ret = (dtype *)CkHashtablePut(hashTab,&(n.idx));
00074 new (ret) dtype(0);
00075 }
00076 return *ret;
00077 }
00078 }
00079
00080 public:
00081 GroupIdxArray() {tab=NULL;max=0;hashTab=NULL;}
00082 ~GroupIdxArray() {delete[] tab; if (hashTab!=NULL) CkDeleteHashtable(hashTab);}
00083 void init(void) {
00084 max = INIT_BINS_PE0;
00085 tab = new dtype[max];
00086 for(int i=0;i<max;i++)
00087 tab[i]=dtype(0);
00088 hashTab=NULL;
00089 }
00090
00091 inline dtype& find(CkGroupID n) {
00092 if(n.idx>0 && n.idx<max)
00093 return tab[n.idx];
00094 else
00095 return nonInlineFind(n);
00096 }
00097 };
00098
00099 typedef GroupIdxArray<TableEntry> GroupTable;
00100 typedef CkVec<CkGroupID> GroupIDTable;
00101
00102 typedef void (*CkInitCallFn)(void);
00103 class InitCallTable
00104 {
00105 public:
00106 CkQ<CkInitCallFn> initNodeCalls;
00107 CkQ<CkInitCallFn> initProcCalls;
00108 public:
00109 void enumerateInitCalls();
00110 };
00111 void _registerInitCall(CkInitCallFn fn, int isNodeCall);
00112
00113
00119 extern unsigned int _printCS;
00120 extern unsigned int _printSS;
00121
00122 extern int _infoIdx;
00123 extern int _charmHandlerIdx;
00124 extern int _roRestartHandlerIdx;
00125 extern int _bocHandlerIdx;
00126 extern int _qdHandlerIdx;
00127 extern unsigned int _numInitMsgs;
00128
00129 CksvExtern(unsigned int, _numInitNodeMsgs);
00130 CksvExtern(CmiNodeLock, _nodeLock);
00131 CksvExtern(GroupTable*, _nodeGroupTable);
00132 CksvExtern(GroupIDTable, _nodeGroupIDTable);
00133 CksvExtern(CmiImmediateLockType, _nodeGroupTableImmLock);
00134 CksvExtern(unsigned int, _numNodeGroups);
00135
00136 CkpvExtern(int, _charmEpoch);
00137
00138 CkpvExtern(CkGroupID,_currentGroup);
00139 CkpvExtern(void*, _currentNodeGroupObj);
00140 CkpvExtern(CkGroupID, _currentGroupRednMgr);
00141
00142 CkpvExtern(GroupTable*, _groupTable);
00143 CkpvExtern(GroupIDTable*, _groupIDTable);
00144 CkpvExtern(CmiImmediateLockType, _groupTableImmLock);
00145 CkpvExtern(unsigned int, _numGroups);
00146
00147 CkpvExtern(char **,Ck_argv);
00148
00149 static inline IrrGroup *_localBranch(CkGroupID gID)
00150 {
00151 return CkpvAccess(_groupTable)->find(gID).getObj();
00152 }
00153
00154 extern void _initCharm(int argc, char **argv);
00155
00159 extern "C" void CkRegisterMainModule(void);
00160
00161 typedef void (*CkExitFn) (void);
00162
00163 extern CkQ<CkExitFn> _CkExitFnVec;
00164 extern void registerExitFn(CkExitFn);
00165
00166 extern "C" void EmergencyExit(void);
00167
00170 #endif
00171
00172