ck-core/init.h

Go to the documentation of this file.
00001 #ifndef _INIT_H
00002 #define _INIT_H
00003 
00004 #include "charm.h" // For CkNumPes
00005 #if CMK_STL_DONT_USE_DOT_H
00006 #include <new>   // for in-place new operator
00007 #else
00008 #include <new.h>   // for in-place new operator
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; //Buffers msgs recv'd before group is created
00020     int cIdx;
00021     char gName[256];
00022     int defCtor,migCtor; // the index of default and migration constructors in _entryTable,
00023                          // to be fed in CkCreateLocalGroup
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   // The initial size of the table for groups created on PE 0:
00044   enum {INIT_BINS_PE0=32};
00045   
00046   dtype *tab;         // direct table for groups created on processor 0
00047   CkHashtable_c hashTab; // hashtable for groups created on processors >0
00048   int max;   // Size of "tab"
00049    
00050   //This non-inline version of "find", below, allows the (much simpler)
00051   // common case to be inlined.
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) { /* Extend processor 0's group table */
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 /*n.idx < 0*/
00068       { /*Groups created on processors >0 go into a hashtable:*/
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)  // insert new entry into the table
00075         {
00076           ret = (dtype *)CkHashtablePut(hashTab,&(n.idx));
00077           new (ret) dtype(0); //Call dtype's constructor (ICK!)
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;     /* for checkpoint/restart */
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 

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