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