Fixed bugs due to ckfutures declarations in c++interface.h
[charm.git] / src / ck-core / c++interface.h
1 /***************************************************************************
2  * RCS INFORMATION:
3  *
4  *      $RCSfile$
5  *      $Author$        $Locker$                $State$
6  *      $Revision$      $Date$
7  *
8  ***************************************************************************
9  * DESCRIPTION:
10  *
11  ***************************************************************************
12  * REVISION HISTORY:
13  *
14  * $Log$
15  * Revision 2.31  1997-07-28 20:13:20  milind
16  * Fixed bugs due to ckfutures declarations in c++interface.h
17  * Also, wrote macros for node numbering in exemplar.
18  *
19  * Revision 2.30  1997/07/26 16:41:08  jyelon
20  * *** empty log message ***
21  *
22  * Revision 2.29  1996/03/22 16:07:02  sanjeev
23  * changed "class chare" to "class chare_object"
24  *
25  * Revision 2.28  1996/03/22 15:58:56  sanjeev
26  * added "class chare : public _CK_Object" for non-translator version
27  *
28  * Revision 2.27  1995/11/15 16:48:16  sanjeev
29  * same as previous msg
30  *
31  * Revision 2.26  1995/11/15  16:45:28  sanjeev
32  * fixes to prevent iCC from complaining about unused variables
33  *
34  * Revision 2.25  1995/11/03  02:48:29  sanjeev
35  * *** empty log message ***
36  *
37  * Revision 2.24  1995/11/02  20:23:20  sanjeev
38  * added CFunctionRefToName
39  *
40  * Revision 2.23  1995/10/31  23:15:08  knauff
41  * Undid my previous unnecessary change.
42  *
43  * Revision 2.22  1995/10/31  23:05:54  knauff
44  * Changed all size_t's to CMK_SIZE_T
45  *
46  * Revision 2.21  1995/10/27  09:09:31  jyelon
47  * *** empty log message ***
48  *
49  * Revision 2.20  1995/10/20  17:25:42  sanjeev
50  * added typedef CMK_SIZE_T size_t ;
51  *
52  * Revision 2.19  1995/10/18  22:19:54  jyelon
53  * Still having problems with <stddef> and size_t
54  *
55  * Revision 2.18  1995/10/12  20:13:59  sanjeev
56  * fixed problems while compiling with CC
57  *
58  * Revision 2.17  1995/10/11  19:30:33  sanjeev
59  * removed CPlus_ChareExit
60  *
61  * Revision 2.16  1995/10/11  17:54:40  sanjeev
62  * fixed Charm++ chare creation
63  *
64  * Revision 2.15  1995/10/03  19:54:21  sanjeev
65  * new BOC syntax
66  *
67  * Revision 2.14  1995/09/26  19:46:46  sanjeev
68  * moved new operator to cplus.C
69  *
70  * Revision 2.13  1995/09/21  16:39:01  sanjeev
71  * *** empty log message ***
72  *
73  * Revision 2.12  1995/09/20  23:09:47  sanjeev
74  * added comm_object
75  *
76  * Revision 2.11  1995/09/20  15:10:18  sanjeev
77  * removed externs for Cmi stuff
78  *
79  * Revision 2.10  1995/09/19  21:44:54  brunner
80  * Moved declaration of CmiTimer to converse.h from here.
81  *
82  * Revision 2.9  1995/09/07  21:21:38  jyelon
83  * Added prefixes to Cpv and Csv macros, fixed bugs thereby revealed.
84  *
85  * Revision 2.8  1995/09/06  21:48:50  jyelon
86  * Eliminated 'CkProcess_BocMsg', using 'CkProcess_ForChareMsg' instead.
87  *
88  * Revision 2.7  1995/09/05  22:35:32  sanjeev
89  * removed _CK_MyBocNum
90  *
91  * Revision 2.6  1995/09/05  22:02:09  sanjeev
92  * modified _CK_Object, _CK_BOC for new ChareBlock format.
93  *
94  * Revision 2.5  1995/09/01  02:13:17  jyelon
95  * VID_BLOCK, CHARE_BLOCK, BOC_BLOCK consolidated.
96  *
97  * Revision 2.4  1995/07/27  20:29:34  jyelon
98  * Improvements to runtime system, general cleanup.
99  *
100  * Revision 2.3  1995/07/22  23:44:13  jyelon
101  * *** empty log message ***
102  *
103  * Revision 2.2  1995/06/14  19:39:26  gursoy
104  * *** empty log message ***
105  *
106  * Revision 2.1  1995/06/08  17:09:41  gursoy
107  * Cpv macro changes done
108  *
109  * Revision 1.6  1995/05/04  22:11:15  jyelon
110  * *** empty log message ***
111  *
112  * Revision 1.5  1995/04/13  20:53:46  sanjeev
113  * Changed Mc to Cmi
114  *
115  * Revision 1.4  1994/12/10  19:00:55  sanjeev
116  * added extern decls for register fns
117  *
118  * Revision 1.3  1994/12/02  00:01:57  sanjeev
119  * interop stuff
120  *
121  * Revision 1.2  1994/11/11  05:31:26  brunner
122  * Removed ident added by accident with RCS header
123  *
124  * Revision 1.1  1994/11/07  15:39:49  brunner
125  * Initial revision
126  *
127  ***************************************************************************/
128
129 #ifndef C_PLUS_INTERFACE_H
130 #define C_PLUS_INTERFACE_H
131
132 /* This is because size_t is of different type on different machines, and
133    for different compilers */
134 typedef CMK_SIZE_T size_t ;
135
136 #define NULL_EP -1
137
138 class _CK_Object ;
139 class groupmember ;
140
141 /* GroupIdType is the generic type usable for all BOC ids */
142 typedef int GroupIdType ;
143
144 /* EPFnType is a pointer to a _CK_call_Chare_EP() function */
145 typedef void (*EPFnType)(void *, _CK_Object *) ;
146
147 /* CHAREFNTYPE is a pointer to a _CK_create_ChareName() function */
148 typedef _CK_Object * (*CHAREFNTYPE)(int) ;
149
150 /* BOCFNTYPE is a pointer to a _CK_create_BocName() function */
151 typedef groupmember * (*BOCFNTYPE)(void) ;
152
153 /* ACCFNTYPE is a pointer to a _CK_create_AccName() function */
154 typedef void * (*ACCFNTYPE)(void *) ;
155
156 /* ALLOCFNTYPE is a pointer to a _CK_alloc_MsgName() function */
157 typedef void * (*ALLOCFNPTR)(int, int, int*, int) ;
158
159
160
161
162 /* this is the handle of the main chare, used in place of MainChareID */
163 extern ChareIDType mainhandle;
164 extern ChareIDType NULL_HANDLE;
165
166
167 /* These are C++ functions in the runtime system */
168 FUNCTION_PTR CFunctionRefToName(int index) ;
169
170
171 /* These are C functions in the Charm runtime system */
172
173 extern "C" int registerMsg(char *name, FUNCTION_PTR allocf, FUNCTION_PTR packf, FUNCTION_PTR unpackf, int size) ;
174
175 extern "C" int registerBocEp(char *name, FUNCTION_PTR epFunc , int epType , int msgIndx, int chareIndx) ;
176
177 extern "C" int registerEp(char *name, FUNCTION_PTR epFunc , int epType , int msgIndx, int chareIndx) ;
178
179 extern "C" int registerChare(char *name, int dataSz, FUNCTION_PTR createfn) ;
180
181 extern "C" int registerFunction(FUNCTION_PTR fn) ;
182
183 extern "C" int registerMonotonic(char *name , FUNCTION_PTR initfn, FUNCTION_PTR updatefn , int language) ;
184
185 extern "C" int registerTable(char *name , FUNCTION_PTR initfn, FUNCTION_PTR hashfn) ;
186
187 extern "C" int registerAccumulator(char *name , FUNCTION_PTR initfn, FUNCTION_PTR addfn, FUNCTION_PTR combinefn , int language) ;
188
189 extern "C" int registerReadOnlyMsg() ;
190
191 extern "C" void registerReadOnly(int size , FUNCTION_PTR fnCopyFromBuffer, FUNCTION_PTR fnCopyToBuffer) ;
192
193 extern "C" void registerMainChare(int m, int ep , int type) ;
194
195 extern "C" void * GenericCkAlloc(int, int, int) ;
196 extern "C" void * VarSizeCkAlloc(int, int, int, int[]) ;
197 extern "C" void * CkAllocPackBuffer(void *, int) ;
198 extern "C" int CreateBoc(int, int, void *, int, ChareIDType *) ;
199 extern "C" void CreateChare(int, int, void *, ChareIDType *, int) ;
200 extern "C" int CreateAcc(int, void *, int, ChareIDType *) ;
201 extern "C" int CreateMono(int, void *, int, ChareIDType *) ;
202 extern "C" void CkExit() ;
203 extern "C" void ChareExit() ;
204 extern "C" void CkFreeMsg(void *) ;
205 extern "C" void GeneralSendMsgBranch(int, void *, int, int, int) ;
206 extern "C" void GeneralBroadcastMsgBranch(int, void *, int, int) ;
207 extern "C" void SendMsg(int, void *, ChareIDType *) ;
208 extern "C" void *GetBocDataPtr(int) ;
209 extern "C" void SetBocBlockPtr(int, CHARE_BLOCK *);
210
211 extern "C" void VidRetrieveMessages(CHARE_BLOCK *, PeNumType, CHARE_BLOCK *) ;
212 extern "C" void SendNodeStatistics() ;
213 extern "C" void close_log() ;
214 extern "C" void PrintStsFile(char *) ;
215 extern "C" void trace_creation(int, int, ENVELOPE *) ;
216 extern "C" void trace_begin_execute(ENVELOPE *) ;
217 extern "C" void trace_end_execute(int, int, int) ;
218
219 extern "C" int CPlus_GetMagicNumber(_CK_Object *) ;
220 extern "C" void CPlus_StartQuiescence(int, ChareIDType) ;
221
222 extern "C" void * _CK_9GetAccDataPtr(void *) ;
223 extern "C" void * _CK_9GetMonoDataPtr(void *) ;
224 extern "C" void _CK_BroadcastMono(void *, int) ;
225 extern "C" void CollectValue(int, int, ChareIDType *) ;
226 extern "C" void * MonoValue(int) ;
227
228 extern "C" unsigned int *CkPrioPtrFn(void *);
229 extern "C" int           CkPrioSizeBitsFn(void *);          
230 extern "C" int           CkPrioSizeBytesFn(void *);          
231 extern "C" int           CkPrioSizeWordsFn(void *);
232 extern "C" void          CkPrioConcatFn(void *, void *, unsigned int);
233
234 extern "C" void          CkSetQueueing(void *, int);
235
236 extern "C" ENVELOPE *CkCopyEnv(ENVELOPE *) ;
237
238
239 extern "C" void  SetRefNumber(void *m, int n);
240 extern "C" int   GetRefNumber(void *m);
241
242 extern "C" void      futuresModuleInit();
243 extern "C" void      futuresCreateBOC();
244 extern "C" void *     CRemoteCallBranchFn(int Entry, void * m, int g, int p);
245 extern "C" void *     CRemoteCallFn(int Entry, void *m, ChareIDType *id);
246 extern "C" void      CSendToFuture(void *m, int processor);
247
248
249
250
251
252 /* These are messages which are created in C code in the runtime 
253    and received by a Charm++ chare. So they cant inherit from 
254    comm_object, else the layout of the message changes. The translator
255    puts them in the symbol table at initialization time (in process.c),
256    so these definitions dont need to be seen by the translator (they are 
257    seen by the C++ compiler because this file is #included in the program. */
258
259 class GroupIdMessage {  // sizeof(GroupIdMessage) MUST be 4
260 public: GroupIdType groupid ;
261
262         void *operator new(size_t size) {       // should never be called
263                 size += 0 ;     // to prevent CC from generating "size unused"
264                 return NULL ;
265         }
266
267         void operator delete(void *msg) {
268                 CkFreeMsg(msg) ;
269         }
270 } ;
271
272 class QuiescenceMessage {// used in quiescence module
273 public: int emptyfield ;
274
275         void *operator new(size_t size) {       // should never be called
276                 size += 0 ;     // to prevent CC from generating "size unused"
277                 return NULL ;
278         }
279
280         void operator delete(void *msg) {
281                 CkFreeMsg(msg) ;
282         }
283 } ;
284
285 class TableMessage {    
286 // used by distributed tables, must have exactly the
287 // same size and format as TBL_MSG in tbl.h
288 public: int key ;
289         char *data ;
290  
291         void *operator new(size_t size) {       // should never be called
292                 size += 0 ;     // to prevent CC from generating "size unused"
293                 return NULL ;
294         }
295
296         void operator delete(void *msg) {
297                 CkFreeMsg(msg) ;
298         }
299 } ;
300
301
302
303
304 /****** This is the top level class from which all message types inherit *****/
305
306 class comm_object {
307 public: void operator delete(void *msg) {
308                 CkFreeMsg(msg) ;
309         }
310
311         void *operator new(size_t size) ;
312
313         void *operator new(size_t size, int id) {
314                 return (void *)GenericCkAlloc(id, size, 0) ;
315         }
316
317         void *operator new(size_t size, int id, int prio) {
318                 return (void *)GenericCkAlloc(id, size, prio) ;
319         }
320
321         void *operator new(size_t size, int id, int* sizes) {
322                 return (void *)((ALLOCFNPTR)(CsvAccess(MsgToStructTable)[id].alloc))(id, size, sizes, 0) ;
323         }
324
325         void *operator new(size_t size, int id, int prio, int* sizes) {
326                 return (void *)((ALLOCFNPTR)(CsvAccess(MsgToStructTable)[id].alloc))(id, size, sizes, prio) ;
327         }
328 } ;
329
330
331
332
333
334
335 /******* Top level chare class at root of chare hierarchy ********/
336
337 class _CK_Object {  
338 public:
339         ChareIDType thishandle ;   
340
341         _CK_Object() ;
342
343         void * operator new(size_t size) ;
344  
345         void * operator new(size_t size, void *buf) ;
346
347         void operator delete(void *obj) {
348                 obj = obj ;     // to prevent CC from generating "obj unused"
349                 ChareExit() ;
350         }
351 } ;
352
353
354 /* for use in the non-translator version */
355 class chare_object : public _CK_Object {} ;
356
357
358 class groupmember : public _CK_Object {  /* top level BOC object */
359 public:
360         int thisgroup ;  /* stores BocNum */
361
362         groupmember() ;
363 } ;
364
365
366 class _CK_Accumulator { /* top level Accumulator object */
367
368 public:
369         int _CK_MyId ;
370
371         virtual void * _CK_GetMsgPtr() = 0 ;
372
373         virtual void _CK_Combine(void *) = 0 ;
374
375         void CollectValue(int EpNum, ChareIDType cid)
376         {
377                 ::CollectValue(_CK_MyId, EpNum, &cid) ; 
378                 /* in node_acc.c */
379         }
380 } ;
381
382 class _CK_Monotonic { /* top level Monotonic object */
383
384 public:
385         int _CK_MyId ;
386
387         virtual void * _CK_GetMsgPtr() = 0 ;
388
389         virtual void _CK_SysUpdate(void *) = 0 ;  /* called by system */
390 } ;
391
392
393 #endif