Deleting a few handler never used
[charm.git] / src / ck-core / init.h
1 #ifndef _INIT_H
2 #define _INIT_H
3
4 #include "charm.h" // For CkNumPes
5 #if CMK_STL_DONT_USE_DOT_H
6 #include <new>   // for in-place new operator
7 #else
8 #include <new.h>   // for in-place new operator
9 #endif
10 #include "ckhashtable.h"
11
12 typedef CkQ<void *> PtrQ;
13 class envelope;
14 typedef CkVec<CkZeroPtr<envelope> > PtrVec;
15
16 class IrrGroup;
17 class TableEntry {
18     IrrGroup *obj;
19     PtrQ *pending; //Buffers msgs recv'd before group is created
20     int cIdx;
21     char gName[256];
22     int defCtor,migCtor; // the index of default and migration constructors in _entryTable,
23                          // to be fed in CkCreateLocalGroup
24   public:
25     TableEntry(int ignored=0) { obj=0; pending=0; cIdx=defCtor=migCtor=-1; }
26     inline IrrGroup* getObj(void) { return obj; }
27     inline void setObj(void *_obj) { obj=(IrrGroup *)_obj; }
28     PtrQ* getPending(void) { return pending; }
29     inline void clearPending(void) { delete pending; pending = NULL; }
30     void enqMsg(void *msg) {
31       if (pending==0)
32         pending=new PtrQ();
33       pending->enq(msg);
34     }
35     void setcIdx(int cIdx_){
36       cIdx = cIdx_;
37     }
38     inline int getcIdx(void) const { return cIdx; }
39 };
40
41 template <class dtype>
42 class GroupIdxArray {
43   // The initial size of the table for groups created on PE 0:
44   enum {INIT_BINS_PE0=32};
45   
46   dtype *tab;         // direct table for groups created on processor 0
47   CkHashtable_c hashTab; // hashtable for groups created on processors >0
48   int max;   // Size of "tab"
49    
50   //This non-inline version of "find", below, allows the (much simpler)
51   // common case to be inlined.
52   dtype& nonInlineFind(CkGroupID n) {
53 #ifndef CMK_OPTIMIZE
54       if (n.idx==0) {CkAbort("Group ID is zero-- invalid!\n"); dtype *nul=NULL; return *nul;}
55       else 
56 #endif
57       if (n.idx>=max) { /* Extend processor 0's group table */
58         dtype *oldtab=tab;
59         int i, oldmax=max;
60         max=2*n.idx+1;
61         tab=new dtype[max];
62         for (i=0;i<oldmax;i++) tab[i]=oldtab[i];
63         for (i=oldmax;i<max;i++) tab[i]=dtype(0);
64         delete [] oldtab;
65         return tab[n.idx];
66       }
67       else /*n.idx < 0*/
68       { /*Groups created on processors >0 go into a hashtable:*/
69         if(hashTab == NULL)
70           hashTab = CkCreateHashtable_int(sizeof(dtype),17);
71
72         dtype *ret = (dtype *)CkHashtableGet(hashTab,&(n.idx));
73
74         if(ret == NULL)  // insert new entry into the table
75         {
76           ret = (dtype *)CkHashtablePut(hashTab,&(n.idx));
77           new (ret) dtype(0); //Call dtype's constructor (ICK!)
78         }
79         return *ret;
80       }
81    }
82
83   public:
84     GroupIdxArray() {tab=NULL;max=0;hashTab=NULL;}
85     ~GroupIdxArray() {delete[] tab; if (hashTab!=NULL) CkDeleteHashtable(hashTab);}
86     void init(void) {
87       max = INIT_BINS_PE0;
88       tab = new dtype[max];
89       for(int i=0;i<max;i++)
90        tab[i]=dtype(0);
91       hashTab=NULL;
92     }
93
94     inline dtype& find(CkGroupID n) {
95       if(n.idx>0 && n.idx<max)
96         return tab[n.idx];
97       else
98         return nonInlineFind(n);
99     }
100 };
101
102 typedef GroupIdxArray<TableEntry> GroupTable;
103 typedef CkVec<CkGroupID> GroupIDTable;
104
105 typedef void (*CkInitCallFn)(void);
106 class InitCallTable 
107 {
108 public:
109   CkQ<CkInitCallFn>  initNodeCalls;
110   CkQ<CkInitCallFn>  initProcCalls;
111 public:
112   void enumerateInitCalls();
113 };
114 void _registerInitCall(CkInitCallFn fn, int isNodeCall);
115
116 /*********************************************************/
117 /**
118 \addtogroup CkInit
119 These are implemented in init.C.
120 */
121 /*@{*/
122 extern unsigned int    _printCS;
123 extern unsigned int    _printSS;
124
125 extern int     _infoIdx;
126 extern int     _charmHandlerIdx;
127 extern int     _roRestartHandlerIdx;     /* for checkpoint/restart */
128 extern int     _bocHandlerIdx;
129 extern int     _qdHandlerIdx;
130 extern unsigned int   _numInitMsgs;
131
132 CksvExtern(unsigned int,  _numInitNodeMsgs);
133 CksvExtern(CmiNodeLock, _nodeLock);
134 CksvExtern(GroupTable*,  _nodeGroupTable);
135 CksvExtern(GroupIDTable, _nodeGroupIDTable);
136 CksvExtern(CmiImmediateLockType, _nodeGroupTableImmLock);
137 CksvExtern(unsigned int, _numNodeGroups);
138
139 CkpvExtern(int, _charmEpoch);
140
141 CkpvExtern(CkGroupID,_currentGroup);
142 CkpvExtern(void*,  _currentNodeGroupObj);
143 CkpvExtern(CkGroupID, _currentGroupRednMgr);
144
145 CkpvExtern(GroupTable*, _groupTable);
146 CkpvExtern(GroupIDTable*, _groupIDTable);
147 CkpvExtern(CmiImmediateLockType, _groupTableImmLock);
148 CkpvExtern(unsigned int, _numGroups);
149
150 CkpvExtern(char **,Ck_argv);
151
152 static inline IrrGroup *_localBranch(CkGroupID gID)
153 {
154   return CkpvAccess(_groupTable)->find(gID).getObj();
155 }
156
157 extern void _initCharm(int argc, char **argv);
158
159 /** This routine registers the user's main module.  It is normally
160     generated by the translator, but for FEM and AMPI may actually be 
161     the "fallback" version in compat_regmm.c. */
162 extern "C" void CkRegisterMainModule(void);
163
164 typedef  void  (*CkExitFn) (void);
165
166 extern CkQ<CkExitFn> _CkExitFnVec;
167 extern void registerExitFn(CkExitFn);
168
169 extern "C" void EmergencyExit(void);
170
171 /*@}*/
172
173 #endif
174
175