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